IDC.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. <template>
  2. <div>
  3. <a-form
  4. class="mt-3"
  5. :form="form.fc"
  6. v-bind="formItemLayout"
  7. @submit="submit"
  8. hideRequiredMark>
  9. <a-form-item :label="$t('compute.text_297', [$t('dictionary.project')])" v-show="false">
  10. <domain-project
  11. :fc="form.fc"
  12. :fd="form.fd"
  13. :decorators="{ project: decorators.project, domain: decorators.domain }"
  14. @fetchDomainCallback="fetchDomainCallback"
  15. @fetchProjectCallback="fetchProjectCallback" />
  16. </a-form-item>
  17. <a-form-item :label="$t('compute.text_177')" class="mb-0" v-show="false">
  18. <cloudregion-zone
  19. :zone-params="zoneParams"
  20. :cloudregion-params="cloudregionParams"
  21. :decorator="decorators.cloudregionZone"
  22. filterBrandResource="compute_engine" />
  23. </a-form-item>
  24. <a-form-item :label="$t('compute.text_294')">
  25. <a-input-number v-decorator="decorators.count" @blur="countBlur" :min="1" :max="100" />
  26. </a-form-item>
  27. <a-form-item :label="$t('compute.text_176')" :extra="$t('compute.text_1151')">
  28. <hypervisor-radio :decorator="decorators.hypervisor" :type="form.fi.createType" :hypervisors="hypervisors" />
  29. </a-form-item>
  30. <a-form-item :label="$t('compute.text_1365')" v-if="isKvm && form.fi.capability.host_cpu_archs">
  31. <os-arch
  32. v-decorator="decorators.os_arch"
  33. :form="form"
  34. :options="archOptions" />
  35. </a-form-item>
  36. <a-form-item v-if="form.fd.hypervisor === 'kvm'" :label="$t('compute.text_1152')">
  37. <gpu :decorators="decorators.gpu" :gpu-options="gpuOptions" @change="gpuChange" />
  38. </a-form-item>
  39. <a-form-item :label="$t('compute.text_1058')" class="mb-0">
  40. <cpu-radio :decorator="decorators.vcpu" :options="form.fi.cpuMem.cpus || []" @change="cpuChange" />
  41. </a-form-item>
  42. <a-form-item :label="$t('compute.text_369')" class="mb-0">
  43. <mem-radio :decorator="decorators.vmem" :options="form.fi.cpuMem.mems_mb || []" />
  44. </a-form-item>
  45. <a-form-item :label="$t('compute.text_109')" v-if="showSku">
  46. <sku
  47. v-decorator="decorators.sku"
  48. :type="type"
  49. :sku-params="skuParam"
  50. :hypervisor="form.fd.hypervisor" />
  51. </a-form-item>
  52. <a-form-item :label="$t('compute.text_49')" class="mb-0">
  53. <system-disk
  54. v-if="form.fd.hypervisor"
  55. :decorator="decorators.systemDisk"
  56. :isServertemplate="isServertemplate"
  57. :type="type"
  58. :form="form"
  59. :hypervisor="form.fd.hypervisor"
  60. :sku="form.fd.sku"
  61. :capability-data="form.fi.capability"
  62. :image="form.fi.imageMsg"
  63. :defaultSize="systemdiskDefaultSize"
  64. :isHostImageType="isHostImageType"
  65. :disabled="form.fi.sysDiskDisabled"
  66. :sizeDisabled="systemdiskSizeDisabled"
  67. :storageParams="storageParams"
  68. :storageHostParams="storageHostParams"
  69. :domain="project_domain"
  70. :isStorageShow="isStorageShow"
  71. @storageHostChange="storageHostChange" />
  72. </a-form-item>
  73. <a-form-item :label="$t('compute.text_50')">
  74. <data-disk
  75. v-if="form.fd.hypervisor"
  76. ref="dataDiskRef"
  77. :decorator="decorators.dataDisk"
  78. :form="form"
  79. :type="type"
  80. :hypervisor="form.fd.hypervisor"
  81. :sku="form.fd.sku"
  82. :capability-data="form.fi.capability"
  83. :isSnapshotImageType="isSnapshotImageType"
  84. :isHostImageType="isHostImageType"
  85. :disabled="form.fi.dataDiskDisabled"
  86. :defaultType="form.fd.systemDiskType"
  87. :domain="project_domain"
  88. :isWindows="isWindows"
  89. :isStorageShow="isStorageShow"
  90. :enableMointpoint="false"
  91. :simplify="true"
  92. :storageParams="dataDiskStorageParams"
  93. :storageHostParams="storageHostParams"
  94. @storageHostChange="storageHostChange" />
  95. <div slot="extra" class="warning-color" v-if="isStorageShow">{{ $t('compute.select_storage_no_schetag') }}</div>
  96. </a-form-item>
  97. <bottom-bar
  98. ref="bottomBarRef"
  99. :loading="submiting"
  100. :form="form"
  101. :type="type"
  102. :dataDiskSizes="dataDiskSizes"
  103. :isOpenWorkflow="isOpenWorkflow"
  104. :errors.sync="errors"
  105. :isServertemplate="isServertemplate"
  106. :hasMeterService="hasMeterService"
  107. @getOriginPrice="getOriginPrice" />
  108. </a-form>
  109. </div>
  110. </template>
  111. <script>
  112. import _ from 'lodash'
  113. import * as R from 'ramda'
  114. import { HYPERVISORS_MAP } from '@/constants'
  115. import { resolveValueChangeField } from '@/utils/common/ant'
  116. import { IMAGES_TYPE_MAP, STORAGE_TYPES, HOST_CPU_ARCHS } from '@/constants/compute'
  117. import OsArch from '@/sections/OsArch'
  118. import { diskSupportTypeMedium, getOriginDiskKey } from '@/utils/common/hypervisor'
  119. import mixin from './mixin'
  120. export default {
  121. name: 'VM_IDCCreate',
  122. components: {
  123. OsArch,
  124. },
  125. mixins: [mixin],
  126. data () {
  127. return {
  128. isLocalDisk: true,
  129. storageHosts: {}, // 所有磁盘的storage-host
  130. storageHostParams: {}, // 第一个选择的块存储
  131. }
  132. },
  133. computed: {
  134. isKvm () {
  135. return this.form.fd.hypervisor === HYPERVISORS_MAP.kvm.key
  136. },
  137. isIso () {
  138. return this.form.fd.imageType === IMAGES_TYPE_MAP.iso.key
  139. },
  140. isArm () {
  141. return this.form.fd.os_arch === HOST_CPU_ARCHS.arm.key
  142. },
  143. isLoongarch64 () {
  144. return this.form.fd.os_arch === HOST_CPU_ARCHS.loongarch64.key
  145. },
  146. hypervisors () {
  147. const { hypervisors = [] } = this.form.fi.capability
  148. return hypervisors
  149. },
  150. cloudregionParams () {
  151. return {
  152. cloud_env: 'onpremise',
  153. usable: true,
  154. show_emulated: true,
  155. ...this.scopeParams,
  156. }
  157. },
  158. zoneParams () {
  159. return {
  160. usable: true,
  161. show_emulated: true,
  162. order_by: 'created_at',
  163. order: 'asc',
  164. ...this.scopeParams,
  165. }
  166. },
  167. instanceGroupsParams () {
  168. return {
  169. ...this.scopeParams,
  170. enabled: true,
  171. }
  172. },
  173. cacheImageParams () {
  174. const params = {
  175. cloudregion_id: _.get(this.form.fd, 'cloudregion.key'),
  176. os_arch: HOST_CPU_ARCHS.x86.key,
  177. }
  178. if (!params.cloudregion_id) return {}
  179. if (this.form.fd.imageType === 'vmware') params.image_type = 'system'
  180. if (this.isArm) params.os_arch = HOST_CPU_ARCHS.arm.key
  181. if (this.isLoongarch64) params.os_arch = HOST_CPU_ARCHS.loongarch64.key
  182. return params
  183. },
  184. showSku () {
  185. if (this.form.fd.hypervisor && this.form.fd.vcpu && this.form.fd.vmem) {
  186. return true
  187. }
  188. return false
  189. },
  190. skuParam () {
  191. return {
  192. limit: 0,
  193. public_cloud: false,
  194. postpaid_status: 'available',
  195. cpu_core_count: this.form.fd.vcpu || this.decorators.vcpu[1].initialValue,
  196. memory_size_mb: this.form.fd.vmem,
  197. cloudregion: _.get(this.form, 'fd.cloudregion.key'),
  198. provider: 'OneCloud',
  199. ...this.scopeParams,
  200. }
  201. },
  202. // policyHostParams () {
  203. // const zone = _.get(this.form.fd, 'zone.key')
  204. // if (zone) {
  205. // const params = {
  206. // enabled: 1,
  207. // usable: true,
  208. // zone,
  209. // hypervisor: this.form.fd.hypervisor,
  210. // os_arch: HOST_CPU_ARCHS.x86.key,
  211. // ...this.scopeParams,
  212. // }
  213. // if (params.hypervisor === HYPERVISORS_MAP.esxi.key) {
  214. // if (this.form.fd[this.decorators.systemDisk.storage[0]]) {
  215. // params.storage_id = this.form.fd[this.decorators.systemDisk.storage[0]]
  216. // }
  217. // params.cloudprovider = this.form.fd.prefer_manager
  218. // }
  219. // if (this.isArm) params.os_arch = HOST_CPU_ARCHS.arm.key
  220. // return params
  221. // }
  222. // return {}
  223. // },
  224. networkParam () {
  225. if (!this.cloudregionZoneParams.cloudregion) return {}
  226. const params = {
  227. filter: 'server_type.notin(ipmi, pxe)',
  228. usable: true,
  229. ...this.cloudregionZoneParams,
  230. ...this.scopeParams,
  231. }
  232. if ([HYPERVISORS_MAP.esxi.key].includes(this.form.fd.hypervisor)) {
  233. params.host_type = 'esxi'
  234. }
  235. if ([HYPERVISORS_MAP.esxi.key, HYPERVISORS_MAP.kvm.key].includes(this.form.fd.hypervisor)) {
  236. if (this.form.fd[this.decorators.systemDisk.storage[0]]) {
  237. params.storage_id = this.form.fd[this.decorators.systemDisk.storage[0]]
  238. }
  239. if (this.storageHostParams.disk &&
  240. this.storageHostParams.disk !== 'system' &&
  241. this.storageHostParams.storageHosts &&
  242. this.storageHostParams.storageHosts.length &&
  243. !params.storage_id) {
  244. if (this.form.fd[`dataDiskStorages[${this.storageHostParams.disk}]`]) {
  245. params.storage_id = this.form.fd[`dataDiskStorages[${this.storageHostParams.disk}]`]
  246. }
  247. }
  248. }
  249. return params
  250. },
  251. instanceSpecParmas () {
  252. return {
  253. usable: true,
  254. enabled: true,
  255. cloudregion: _.get(this.form.fd, 'cloudregion.key'),
  256. }
  257. },
  258. showAdvanceConfig () { // 是否展示高级配置
  259. return this.isKvm || !this.isServertemplate
  260. },
  261. uefi () {
  262. if (this.isKvm && this.form.fd.gpuEnable && this.form.fd.gpu && this.isWindows) {
  263. return true
  264. }
  265. return false
  266. },
  267. cloudproviderParamsExtra () {
  268. const params = {
  269. ...this.scopeParams,
  270. }
  271. if (this.form.fd.hypervisor && this.form.fd.hypervisor) {
  272. params.provider = HYPERVISORS_MAP[this.form.fd.hypervisor].provider
  273. }
  274. return params
  275. },
  276. showSchedCloudprovider () { // 创建VMware机器时,镜像类型不是 VMware 平台镜像时调度策略可以选择指定云账号
  277. let show = false
  278. if (this.form.fd.hypervisor === HYPERVISORS_MAP.esxi.key) {
  279. if (this.form.fd.imageType !== IMAGES_TYPE_MAP.vmware.key) {
  280. show = true
  281. }
  282. }
  283. return show
  284. },
  285. systemdiskSizeDisabled () {
  286. if (this.form.fd.hypervisor === HYPERVISORS_MAP.esxi.key) {
  287. const vmLocalImageType = [IMAGES_TYPE_MAP.vmware.key]
  288. if (vmLocalImageType.includes(this.form.fd.imageType)) {
  289. return true
  290. }
  291. }
  292. return false
  293. },
  294. systemdiskDefaultSize () {
  295. if (this.isIso) {
  296. return 30
  297. }
  298. return null
  299. },
  300. availableHostCount () { // 可用的宿主机数量
  301. if (R.is(Object, this.form.fi.capability)) {
  302. return this.form.fi.capability.available_host_count || 0
  303. }
  304. return 0
  305. },
  306. eipParams () {
  307. if (!this.cloudregionZoneParams.cloudregion) return {}
  308. return {
  309. project: this.project,
  310. region: this.cloudregionZoneParams.cloudregion,
  311. }
  312. },
  313. showEip () {
  314. const { vpcs } = this.form.fd
  315. if (R.is(Object, vpcs)) {
  316. const vpcList = Object.values(vpcs)
  317. if (vpcList.length && !~vpcList.indexOf('default')) {
  318. return this.enableEip
  319. }
  320. }
  321. return false
  322. },
  323. storageParams () {
  324. const { systemDiskType = {}, hypervisor } = this.form.fd
  325. let key = systemDiskType.key || ''
  326. // 磁盘区分介质
  327. if (diskSupportTypeMedium(hypervisor)) {
  328. key = getOriginDiskKey(key)
  329. }
  330. const params = {
  331. ...this.scopeParams,
  332. usable: true, // 包含了 enable:true, status为online的数据
  333. brand: HYPERVISORS_MAP[this.form.fd.hypervisor]?.brand, // kvm,vmware支持指定存储
  334. manager: this.form.fd.prefer_manager,
  335. }
  336. if (key) {
  337. params.filter = [`storage_type.contains("${key}")`]
  338. }
  339. return params
  340. },
  341. dataDiskStorageParams () {
  342. const { dataDiskSizes = {}, hypervisor } = this.form.fd
  343. let dataDiskType = ''
  344. for (const key in dataDiskSizes) {
  345. if (this.form.fd[`dataDiskTypes[${key}]`]) {
  346. dataDiskType = this.form.fd[`dataDiskTypes[${key}]`].key
  347. // 磁盘区分介质
  348. if (diskSupportTypeMedium(hypervisor)) {
  349. dataDiskType = getOriginDiskKey(dataDiskType)
  350. }
  351. }
  352. }
  353. const params = {
  354. ...this.scopeParams,
  355. usable: true, // 包含了 enable:true, status为online的数据
  356. brand: HYPERVISORS_MAP[this.form.fd.hypervisor]?.brand, // kvm,vmware支持指定存储
  357. manager: this.form.fd.prefer_manager,
  358. }
  359. if (dataDiskType) {
  360. params.filter = [`storage_type.contains("${dataDiskType}")`]
  361. }
  362. return params
  363. },
  364. isStorageShow () { // 是否开启了指定存储
  365. if ([HYPERVISORS_MAP.esxi.key, HYPERVISORS_MAP.kvm.key].includes(this.form.fd.hypervisor)) {
  366. if (this.form.fd[this.decorators.systemDisk.storage[0]]) {
  367. return true
  368. }
  369. if (this.storageHostParams.disk &&
  370. this.storageHostParams.disk !== 'system' &&
  371. this.storageHostParams.storageHosts &&
  372. this.storageHostParams.storageHosts.length) {
  373. if (this.form.fd[`dataDiskStorages[${this.storageHostParams.disk}]`]) {
  374. return true
  375. }
  376. }
  377. }
  378. return false
  379. },
  380. imageParams () {
  381. const params = {
  382. ...this.scopeParams,
  383. os_arch: HOST_CPU_ARCHS.x86.key,
  384. }
  385. if (this.isArm) params.os_arch = HOST_CPU_ARCHS.arm.key
  386. if (this.isLoongarch64) params.os_arch = HOST_CPU_ARCHS.loongarch64.key
  387. return params
  388. },
  389. archOptions () {
  390. let opts = []
  391. if (this.form.fi.capability.host_cpu_archs && this.form.fi.capability.host_cpu_archs.length) {
  392. opts = this.form.fi.capability.host_cpu_archs.map(item => {
  393. if (item === HOST_CPU_ARCHS.arm.capabilityKey) return HOST_CPU_ARCHS.arm.key
  394. if (item === HOST_CPU_ARCHS.x86.capabilityKey) return HOST_CPU_ARCHS.x86.key
  395. if (item === HOST_CPU_ARCHS.loongarch64.capabilityKey) return HOST_CPU_ARCHS.loongarch64.key
  396. return item
  397. })
  398. }
  399. return opts
  400. },
  401. extra () {
  402. if (this.isIso && this.isWindows) {
  403. return this.$t('compute.iso_windows_help')
  404. }
  405. return this.$t('compute.text_302')
  406. },
  407. },
  408. watch: {
  409. 'form.fi.imageMsg': {
  410. deep: true,
  411. handler (val, oldVal) {
  412. if (R.equals(val, oldVal)) return
  413. this.$nextTick(() => {
  414. this.form.fi.dataDiskDisabled = false
  415. this.form.fi.sysDiskDisabled = false
  416. if (this.form.fd.imageType === IMAGES_TYPE_MAP.host.key) {
  417. const { root_image: rootImage, data_images: dataImages } = this.form.fi.imageMsg
  418. const systemDiskSize = rootImage.min_disk_mb / 1024
  419. const systemDiskType = { // 这里写死即可,因为主机镜像仅 kvm 型机器,且和系统盘类型无瓜葛 @郑雨
  420. key: STORAGE_TYPES[HYPERVISORS_MAP.kvm.key].local.key,
  421. label: STORAGE_TYPES[HYPERVISORS_MAP.kvm.key].local.label,
  422. }
  423. this.form.fc.setFieldsValue({
  424. systemDiskSize,
  425. systemDiskType,
  426. })
  427. // 重置数据盘数据
  428. this._resetDataDisk()
  429. if (dataImages) {
  430. dataImages.forEach(val => {
  431. this.$refs.dataDiskRef.add({ size: val.min_disk_mb / 1024, min: val.min_disk_mb / 1024, minusDisabled: true })
  432. })
  433. }
  434. }
  435. if (this.form.fd.imageType === IMAGES_TYPE_MAP.snapshot.key) {
  436. // 镜像类型为主机快照的话要回填数据并禁用
  437. const snapshots = _.cloneDeep(this.form.fi.imageMsg.server_config.disks)
  438. if (!snapshots) return
  439. let sysDisk = snapshots.find(val => val.disk_type === 'sys')
  440. if (!sysDisk) {
  441. sysDisk = snapshots.shift()
  442. }
  443. const dataDisks = snapshots.filter(val => val.disk_type !== 'sys')
  444. const data = {
  445. systemDiskType: {
  446. key: sysDisk.backend,
  447. label: STORAGE_TYPES[HYPERVISORS_MAP.kvm.key][sysDisk.backend].label,
  448. },
  449. systemDiskSize: sysDisk.size / 1024,
  450. }
  451. if (val && R.is(Object, val.server_config)) {
  452. if (val.server_config.vcpu_count) {
  453. const cpuValue = val.server_config.vcpu_count
  454. data[this.decorators.vcpu[0]] = cpuValue
  455. this.cpuChange(cpuValue)
  456. if (val.server_config.vmem_size) data[this.decorators.vmem[0]] = val.server_config.vmem_size
  457. }
  458. }
  459. this.form.fc.setFieldsValue(data)
  460. // 重置数据盘数据
  461. this._resetDataDisk()
  462. dataDisks.forEach(val => {
  463. this.$refs.dataDiskRef.add({ diskType: val.backend, size: val.size / 1024, sizeDisabled: true })
  464. })
  465. this.form.fi.dataDiskDisabled = true
  466. this.form.fi.sysDiskDisabled = true
  467. } else {
  468. if (oldVal && R.is(Object, oldVal.server_config)) { // 说明是从主机快照切换过去的
  469. const vcpuDecorator = this.decorators.vcpu
  470. const vcpuInit = vcpuDecorator[1].initialValue
  471. this.form.fc.setFieldsValue({
  472. [vcpuDecorator[0]]: vcpuInit,
  473. })
  474. this.cpuChange(vcpuInit)
  475. }
  476. }
  477. })
  478. },
  479. },
  480. uefi (val) {
  481. this.setBios(val)
  482. },
  483. isArm (val, oldV) {
  484. this.setBios(val)
  485. },
  486. },
  487. methods: {
  488. vpcResourceMapper (list) {
  489. if (this.form.fd.hypervisor === HYPERVISORS_MAP.esxi.key) {
  490. return list.filter(val => val.id === 'default')
  491. }
  492. return list
  493. },
  494. onValuesChange (vm, changedFields) {
  495. this.$nextTick(() => {
  496. const formValue = this.form.fc.getFieldsValue()
  497. const newField = resolveValueChangeField(changedFields)
  498. this._setNewFieldToFd(newField, formValue)
  499. const keys = Object.keys(newField)
  500. if (keys.includes('zone') || keys.includes('cloudregion')) {
  501. this.fetchCapability()
  502. }
  503. if (keys.includes('cloudregion')) {
  504. this.$nextTick(this.fetchInstanceSpecs)
  505. }
  506. if (changedFields.schedPolicyType === 'host') {
  507. this.$set(this.form.fd, 'schedPolicyHost', undefined)
  508. }
  509. if (changedFields.backupEnable) {
  510. this.$set(this.form.fd, 'backup', undefined)
  511. }
  512. this.setIsLocalDisk()
  513. })
  514. },
  515. setIsLocalDisk () {
  516. const isSysLocal = _.get(this.form, 'fd.systemDiskType.key') === 'local'
  517. const fd = this.form.fc.getFieldsValue()
  518. let isDiskLocal = true
  519. const { dataDiskTypes } = fd
  520. if (!R.is(Object, dataDiskTypes)) return
  521. const diskTypeItem = dataDiskTypes[Object.keys(dataDiskTypes)[0]]
  522. if (diskTypeItem && diskTypeItem.key) {
  523. isDiskLocal = diskTypeItem.key === 'local'
  524. }
  525. this.isLocalDisk = isSysLocal && isDiskLocal
  526. },
  527. fetchCapability () {
  528. const params = {
  529. show_emulated: true,
  530. resource_type: 'shared',
  531. ...this.scopeParams,
  532. }
  533. let id = this.cloudregionZoneParams.cloudregion
  534. let resource = 'cloudregions'
  535. if (this.cloudregionZoneParams.zone) {
  536. id = this.cloudregionZoneParams.zone
  537. resource = 'zones'
  538. }
  539. const capabilityParams = { id, spec: 'capability', params }
  540. if (!id) return
  541. if (R.equals(this.capabilityParams, capabilityParams)) return // 和已有的参数一样则不发请求
  542. this.capabilityParams = capabilityParams
  543. new this.$Manager(resource).getSpecific(this.capabilityParams)
  544. .then(({ data }) => {
  545. let hypervisors = R.is(Object, data) ? (data.hypervisors || []) : []
  546. if (hypervisors.includes(HYPERVISORS_MAP.kvm.key)) { // kvm 排序为第一个
  547. hypervisors = [HYPERVISORS_MAP.kvm.key].concat(hypervisors).filter(val => val !== 'baremetal')
  548. }
  549. hypervisors = Array.from(new Set(hypervisors))
  550. this.form.fi.capability = {
  551. ...data,
  552. hypervisors,
  553. }
  554. this.form.fc.setFieldsValue({
  555. hypervisor: hypervisors[0], // 赋值默认第一个平台
  556. })
  557. })
  558. },
  559. fetchInstanceSpecs () {
  560. if (!this.instanceSpecParmas.cloudregion) return
  561. this.serverskusM.get({ id: 'instance-specs', params: this.instanceSpecParmas })
  562. .then(({ data }) => {
  563. this.form.fi.cpuMem = data
  564. const vcpuDecorator = this.decorators.vcpu
  565. const vcpuInit = vcpuDecorator[1].initialValue
  566. this.cpuChange(vcpuInit)
  567. })
  568. },
  569. setBios (val) {
  570. if (val) {
  571. this.form.fc.getFieldDecorator(this.decorators.bios[0], { preserve: true })
  572. this.form.fc.setFieldsValue({ [this.decorators.bios[0]]: 'UEFI' })
  573. } else {
  574. this.form.fc.setFieldsValue({ [this.decorators.bios[0]]: 'BIOS' })
  575. }
  576. },
  577. gpuChange (val) {
  578. if (!val) {
  579. this.form.fc.setFieldsValue({ gpu: '' })
  580. }
  581. },
  582. storageHostChange (val) {
  583. const { disk } = this.storageHostParams
  584. if (val.disk) {
  585. this.storageHosts[val.disk] = val
  586. }
  587. // 由第一块选择块存储的盘来确定块存储所在的host
  588. if (!disk || disk === val.disk) { // 第一块盘选
  589. if (val.storageHosts && val.storageHosts.length) {
  590. this.storageHostParams = val
  591. } else { // 清空操作
  592. let changeNew = false
  593. for (const key in this.storageHosts) {
  594. if (this.storageHosts[key].storageHosts && this.storageHosts[key].storageHosts.length) {
  595. this.storageHostParams = this.storageHosts[key] // 选其他已选的hosts作为新的范围
  596. changeNew = true
  597. break
  598. }
  599. }
  600. if (!changeNew) this.storageHostParams = {}
  601. }
  602. }
  603. },
  604. },
  605. }
  606. </script>