Public.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  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. <servertemplate v-if="isServertemplate" :decorators="decorators.servertemplate">
  10. <a-form-item :label="$t('compute.text_297', [$t('dictionary.project')])">
  11. <domain-project :fc="form.fc" :decorators="{ project: decorators.project, domain: decorators.domain }" />
  12. </a-form-item>
  13. </servertemplate>
  14. <!-- <a-divider orientation="left">{{$t('compute.text_300')}}</a-divider> -->
  15. <a-form-item v-if="!isServertemplate" :label="$t('compute.text_297', [$t('dictionary.project')])">
  16. <domain-project
  17. :fc="form.fc"
  18. :fd="form.fd"
  19. :decorators="{ project: decorators.project, domain: decorators.domain }"
  20. :ignoreStorage="isInitForm"
  21. @fetchDomainCallback="fetchDomainCallback"
  22. @fetchProjectCallback="fetchProjectCallback" />
  23. </a-form-item>
  24. <a-form-item :label="$t('compute.text_228')" v-if="!isServertemplate">
  25. <a-input v-decorator="decorators.name" />
  26. <template v-slot:extra>
  27. <name-repeated
  28. res="servers"
  29. :name="form.fd.name"
  30. :default-text="$t('compute.text_893')" />
  31. </template>
  32. </a-form-item>
  33. <a-form-item :label="$t('common.description')" v-if="!isServertemplate">
  34. <a-textarea :auto-size="{ minRows: 1, maxRows: 3 }" v-decorator="decorators.description" :placeholder="$t('common_367')" />
  35. </a-form-item>
  36. <a-form-item :label="$t('compute.text_1041')" v-if="isOpenWorkflow">
  37. <a-input v-decorator="decorators.reason" :placeholder="$t('compute.text_1042')" />
  38. </a-form-item>
  39. <a-form-item class="mb-0" :label="$t('compute.text_498')">
  40. <bill :decorators="decorators.bill" :form="form" :provider-list="form.fi.providerList" />
  41. </a-form-item>
  42. <a-form-item v-if="form.fd.billType === 'quantity' && !isServertemplate" :label="$t('compute.text_1132')">
  43. <duration useServerDuration :decorators="decorators.duration" :form="form" />
  44. </a-form-item>
  45. <a-form-item :label="$t('compute.text_294')" v-show="!isServertemplate">
  46. <a-input-number v-decorator="decorators.count" @blur="countBlur" :min="1" :max="100" />
  47. </a-form-item>
  48. <area-selects
  49. class="mb-0"
  50. v-if="showAreaSelect"
  51. :wrapperCol="formItemLayout.wrapperCol"
  52. :labelCol="formItemLayout.labelCol"
  53. ref="areaSelectRef"
  54. :providerParams="providerParams"
  55. :cloudregionParams="cloudregionParams"
  56. :zoneParams="zoneParams"
  57. :defaultActiveFirstOption="isInitForm ? false : ['provider', 'cloudregion']"
  58. filterBrandResource="compute_engine"
  59. @providerFetchSuccess="providerFetchSuccess" />
  60. <!-- <a-form-item class="mb-0" :label="$t('compute.text_1159')">
  61. <resource :decorator="decorators.resourceType" />
  62. </a-form-item> -->
  63. <a-form-item :label="$t('compute.text_15')">
  64. <base-select
  65. resource="cloudproviders"
  66. v-decorator="decorators.cloudprovider"
  67. :params="policycloudproviderParams"
  68. :isDefaultSelect="true"
  69. :showSync="true"
  70. :select-props="{ placeholder: $t('compute.text_149') }"
  71. @update:item="cloudproviderSelected" />
  72. </a-form-item>
  73. <a-form-item :label="$t('compute.text_1058')" class="mb-0">
  74. <cpu-radio :decorator="decorators.vcpu" :options="form.fi.cpuMem.cpus || []" :showUnlimited="true" @change="cpuChange" />
  75. </a-form-item>
  76. <a-form-item :label="$t('compute.text_369')" class="mb-0">
  77. <mem-radio :decorator="decorators.vmem" :options="form.fi.cpuMem.mems_mb || []" :showUnlimited="true" />
  78. </a-form-item>
  79. <a-form-item :label="$t('compute.text_109')">
  80. <sku
  81. v-decorator="decorators.sku"
  82. :priceUnit="skuPriceUnit"
  83. :type="type"
  84. :sku-params="skuParam"
  85. :hypervisor="hypervisor"
  86. :hasMeterService="hasMeterService"
  87. :init-sku-data="initSkuData" />
  88. </a-form-item>
  89. <a-form-item :label="$t('compute.text_267')" :extra="$t('compute.text_302')">
  90. <os-select
  91. :type="type"
  92. :form="form"
  93. :types="osSelectTypes"
  94. :hypervisor="hypervisor"
  95. :decorator="decorators.imageOS"
  96. :os-arch="osArch"
  97. :imageParams="imageParams"
  98. :cacheImageParams="cacheImageParams"
  99. :cloudproviderParamsExtra="cloudproviderParamsExtra"
  100. @updateImageMsg="updateFi" />
  101. </a-form-item>
  102. <a-form-item :label="$t('compute.text_49')" class="mb-0">
  103. <system-disk
  104. ref="systemDiskRef"
  105. v-if="form.fd.sku"
  106. :decorator="decorators.systemDisk"
  107. :type="type"
  108. :form="form"
  109. :hypervisor="hypervisor"
  110. :sku="form.fd.sku"
  111. :capability-data="form.fi.capability"
  112. :image="form.fi.imageMsg"
  113. :isServertemplate="isServertemplate"
  114. is-iops-show
  115. is-throughput-show />
  116. </a-form-item>
  117. <a-form-item :label="$t('compute.text_50')">
  118. <data-disk
  119. v-if="form.fd.sku"
  120. :isInitForm="isInitForm"
  121. :decorator="decorators.dataDisk"
  122. :type="type"
  123. :form="form"
  124. :hypervisor="hypervisor"
  125. :sku="form.fd.sku"
  126. :defaultType="form.fd.systemDiskType"
  127. :capability-data="form.fi.capability"
  128. :isServertemplate="isServertemplate"
  129. ref="dataDiskRef"
  130. is-iops-show
  131. is-throughput-show />
  132. </a-form-item>
  133. <a-form-item :label="$t('compute.text_1372')" v-if="showServerAccount">
  134. <server-account :form="form" :hypervisor="hypervisor" :instance_capabilities="form.fi.capability.instance_capabilities" :osType="osType" />
  135. </a-form-item>
  136. <a-form-item :label="$t('compute.text_308')">
  137. <server-password :decorator="decorators.loginConfig" :loginTypes="loginTypes" :form="form" />
  138. </a-form-item>
  139. <a-form-item :label="$t('compute.text_104')" class="mb-0">
  140. <server-network
  141. ref="networkRef"
  142. :form="form"
  143. :decorator="decorators.network"
  144. :network-list-params="networkParam"
  145. :schedtag-params="schedtagParams"
  146. :networkVpcParams="networkVpcParams"
  147. :vpcResource="vpcResource"
  148. :serverCount="form.fd.count"
  149. :networkResourceMapper="networkResourceMapper"
  150. :cloudprovider="form.fd.cloudprovider" />
  151. </a-form-item>
  152. <a-form-item :label="$t('compute.text_1154')" class="mb-0">
  153. <tag
  154. v-decorator="decorators.tag" :default-checked="tagDefaultChecked" />
  155. </a-form-item>
  156. <!-- <a-divider orientation="left">{{$t('compute.text_309')}}</a-divider> -->
  157. <a-collapse :bordered="false" v-model="collapseActive">
  158. <a-collapse-panel :header="$t('compute.text_309')" key="1">
  159. <eip-config
  160. v-if="enableEip"
  161. ref="eipConfigRef"
  162. :decorators="decorators.eip"
  163. :eip-params="eipParams"
  164. :hypervisor="hypervisor"
  165. :showBind="false"
  166. :isServertemplate="isServertemplate"
  167. :cloud-env="type"
  168. :form="form"
  169. :hasPublicIp="hypervisor === 'qcloud' || hypervisor === 'aliyun'"
  170. :formItemLayout="formItemLayout" />
  171. <a-form-item v-if="!isServertemplate">
  172. <span slot="label">
  173. {{ $t('common_388') }}&nbsp;
  174. <a-tooltip :title="hostNameTips">
  175. <a-icon type="question-circle-o" />
  176. </a-tooltip>
  177. </span>
  178. <host-name v-decorator="decorators.hostName" :isWindows="isWindows" />
  179. </a-form-item>
  180. <a-form-item :label="$t('compute.text_105')">
  181. <secgroup-config
  182. :provider="hypervisor"
  183. :form="form"
  184. :decorators="decorators.secgroup"
  185. :secgroup-params="secgroupParams"
  186. :hypervisor="hypervisor"
  187. :showSecgroupBind="showSecgroupBind" />
  188. </a-form-item>
  189. <a-form-item :label="$t('compute.text_311')" v-show="!isServertemplate" class="mb-0">
  190. <sched-policy
  191. ref="schedPolicyRef"
  192. :form="form"
  193. :provider="hypervisor"
  194. :server-type="form.fi.createType"
  195. :disabled-host="policyHostDisabled"
  196. :policy-host-params="policyHostParams"
  197. :decorators="decorators.schedPolicy"
  198. :hideCloudaccountSched="hideCloudaccountSched"
  199. :policy-schedtag-params="policySchedtagParams" />
  200. </a-form-item>
  201. <custom-data v-if="showCustomData" ref="customData" :decorators="decorators" :form="form" />
  202. <bastion-host v-if="!isOpenSourceVersion && hasBastionService" :decorator="decorators.bastion_host" :form="form" />
  203. </a-collapse-panel>
  204. </a-collapse>
  205. <bottom-bar
  206. :loading="submiting"
  207. :form="form"
  208. :errors.sync="errors"
  209. :type="type"
  210. :resourceType="form.fd.resourceType"
  211. :dataDiskSizes="dataDiskSizes"
  212. :isOpenWorkflow="isOpenWorkflow"
  213. :isServertemplate="isServertemplate"
  214. :hasMeterService="hasMeterService"
  215. :cloudaccountId="cloudaccountId"
  216. @add-cart="addShopCart"
  217. @cancel="handleCancel" />
  218. </a-form>
  219. </div>
  220. </template>
  221. <script>
  222. /* eslint-disable */
  223. import * as R from 'ramda'
  224. import mixin from './mixin'
  225. import Bill from '@Compute/sections/Bill'
  226. import { LOGIN_TYPES_MAP, BILL_TYPES_MAP } from '@Compute/constants'
  227. import EipConfig from '@Compute/sections/EipConfig'
  228. import SecgroupConfig from '@Compute/sections/SecgroupConfig'
  229. import { resolveValueChangeField } from '@/utils/common/ant'
  230. import { PROVIDER_MAP, HYPERVISORS_MAP } from '@/constants'
  231. import { HOST_CPU_ARCHS } from '@/constants/compute'
  232. import AreaSelects from '@/sections/AreaSelects'
  233. import { IMAGES_TYPE_MAP } from '@/constants/compute'
  234. export default {
  235. name: 'VMPublicCreate',
  236. components: {
  237. Bill,
  238. AreaSelects,
  239. EipConfig,
  240. SecgroupConfig,
  241. },
  242. mixins: [mixin],
  243. data () {
  244. return {
  245. cloudaccountId: '',
  246. }
  247. },
  248. computed: {
  249. // 是否为包年包月
  250. isPackage () {
  251. return this.form.fd.billType === BILL_TYPES_MAP.package.key
  252. },
  253. isArm () {
  254. return this.form.fd.sku && this.form.fd.sku.cpu_arch === HOST_CPU_ARCHS.arm.capabilityKey
  255. },
  256. isLoongarch64 () {
  257. return this.form.fd.sku && this.form.fd.sku.cpu_arch === HOST_CPU_ARCHS.loongarch64.capabilityKey
  258. },
  259. osArch () {
  260. if (this.form.fd.sku && this.form.fd.sku.cpu_arch) {
  261. return this.form.fd.sku.cpu_arch
  262. } else {
  263. return ''
  264. }
  265. },
  266. showAreaSelect () {
  267. if (this.$store.getters.isAdminMode && this.$store.getters.l3PermissionEnable) {
  268. if (this.form.fd.domain && this.form.fd.domain.key) {
  269. return true
  270. } else {
  271. return false
  272. }
  273. }
  274. return true
  275. },
  276. networkParam () {
  277. if (!this.cloudregionZoneParams.cloudregion) return {}
  278. const params = {
  279. filter: 'server_type.notin(ipmi, pxe)',
  280. usable: true,
  281. ...this.cloudregionZoneParams,
  282. ...this.scopeParams,
  283. }
  284. if (this.isGoogle) {
  285. params.show_emulated = true
  286. }
  287. return params
  288. },
  289. providerParams () {
  290. return {
  291. usable: true,
  292. public_cloud: true,
  293. ...this.scopeParams,
  294. }
  295. },
  296. cloudregionParams () {
  297. return {
  298. cloud_env: 'public',
  299. usable: true,
  300. show_emulated: true,
  301. ...this.scopeParams,
  302. }
  303. },
  304. zoneParams () {
  305. return {
  306. cloud_env: 'public',
  307. usable: true,
  308. show_emulated: true,
  309. order_by: 'created_at',
  310. order: 'asc',
  311. ...this.scopeParams,
  312. }
  313. },
  314. imageParams () {
  315. const params = {}
  316. if (R.is(Object, this.form.fd.sku)) {
  317. params.os_arch = HOST_CPU_ARCHS.x86.key
  318. if (this.isArm) params.os_arch = HOST_CPU_ARCHS.arm.key
  319. if (this.isLoongarch64) params.os_arch = HOST_CPU_ARCHS.loongarch64.key
  320. }
  321. return params
  322. },
  323. cacheImageParams () {
  324. const {imageType, cloudprovider} = this.form.fd
  325. const params = {}
  326. if (imageType !== IMAGES_TYPE_MAP.public.key) {
  327. params.manager_id = this.form.fd.cloudprovider
  328. }
  329. if (R.is(Object, this.form.fd.sku)) {
  330. if (this.cloudregionZoneParams.cloudregion) {
  331. params.cloudregion_id = this.cloudregionZoneParams.cloudregion
  332. }
  333. }
  334. if (!params.cloudregion_id) return {}
  335. return params
  336. },
  337. eipParams () {
  338. if (!this.cloudregionZoneParams.cloudregion) return {}
  339. return {
  340. project: this.project,
  341. region: this.cloudregionZoneParams.cloudregion,
  342. }
  343. },
  344. skuPriceUnit () {
  345. if (this.isPackage) {
  346. return {
  347. key: 'month_price',
  348. unit: this.$t('compute.text_173'),
  349. }
  350. }
  351. return {
  352. key: 'hour_price',
  353. unit: this.$t('compute.text_172'),
  354. }
  355. },
  356. skuParam () {
  357. const params = {
  358. public_cloud: true,
  359. limit: 0,
  360. cpu_core_count: this.form.fd.vcpu,
  361. memory_size_mb: this.form.fd.vmem,
  362. usable: true,
  363. enabled: true,
  364. // manager: this.form.fd.cloudprovider,
  365. ...this.scopeParams,
  366. }
  367. if (this.form.fd.cloudregion) params.cloudregion = this.form.fd.cloudregion
  368. if (this.form.fd.zone) params.zone_id = this.form.fd.zone
  369. const { provider } = this.form.fd
  370. if (provider) {
  371. params.provider = PROVIDER_MAP[provider] ? PROVIDER_MAP[provider].hypervisor : provider
  372. } else {
  373. const providerList = this.form.fi.providerList
  374. if (providerList && providerList.length) {
  375. const providers = providerList.map(item => item.name)
  376. params.filter = `provider.in(${providers.join(',')})`
  377. } else { // 公有云条件下没有 provider 不用请求接口
  378. return {} // sku 组件没有参数不会请求数据
  379. }
  380. }
  381. if (this.form.fd.billType === 'quantity') {
  382. params.postpaid_status = 'available'
  383. } else if (this.form.fd.billType === 'package') {
  384. params.prepaid_status = 'available'
  385. }
  386. return params
  387. },
  388. policyHostParams () {
  389. const params = {
  390. show_emulated: true,
  391. resource_type: 'shared',
  392. enabled: 1,
  393. usable: true,
  394. limit: 0,
  395. }
  396. if (this.cloudregionZoneParams) {
  397. params.zone = this.cloudregionZoneParams.zone
  398. if (!params.zone) {
  399. params.cloudregion = this.cloudregionZoneParams.cloudregion
  400. }
  401. }
  402. if (!params.zone && !params.cloudregion) {
  403. return // 此时将不请求接口
  404. }
  405. return params
  406. },
  407. hypervisor () {
  408. if (R.is(Object, this.form.fd.sku)) {
  409. const { provider } = this.form.fd.sku
  410. if (provider) {
  411. return PROVIDER_MAP[provider].hypervisor
  412. }
  413. }
  414. return ''
  415. },
  416. loginTypes () {
  417. const loginTypes = { ...LOGIN_TYPES_MAP }
  418. const hypervisor = this.hypervisor
  419. if (HYPERVISORS_MAP.ucloud.key === hypervisor) {
  420. delete loginTypes[LOGIN_TYPES_MAP.image.key]
  421. delete loginTypes[LOGIN_TYPES_MAP.keypair.key]
  422. }
  423. if (HYPERVISORS_MAP.aws.key === hypervisor) {
  424. delete loginTypes[LOGIN_TYPES_MAP.random.key]
  425. delete loginTypes[LOGIN_TYPES_MAP.password.key]
  426. }
  427. if (HYPERVISORS_MAP.azure.key === hypervisor) {
  428. delete loginTypes[LOGIN_TYPES_MAP.image.key]
  429. }
  430. if (HYPERVISORS_MAP.ctyun.key === hypervisor) {
  431. delete loginTypes[LOGIN_TYPES_MAP.image.key]
  432. }
  433. if (HYPERVISORS_MAP.google.key === hypervisor) {
  434. delete loginTypes[LOGIN_TYPES_MAP.image.key]
  435. }
  436. if (HYPERVISORS_MAP.qcloud.key === hypervisor) {
  437. delete loginTypes[LOGIN_TYPES_MAP.image.key]
  438. }
  439. if (this.form.fd.os === 'Windows') {
  440. // 以下平台在选择 windows 镜像时禁用关联密钥
  441. const disableKeypairHyper = [
  442. HYPERVISORS_MAP.azure.key,
  443. HYPERVISORS_MAP.aliyun.key,
  444. HYPERVISORS_MAP.qcloud.key,
  445. HYPERVISORS_MAP.ucloud.key,
  446. HYPERVISORS_MAP.esxi.key,
  447. ]
  448. if (disableKeypairHyper.includes(hypervisor)) {
  449. delete loginTypes[LOGIN_TYPES_MAP.keypair.key]
  450. }
  451. if (HYPERVISORS_MAP.google.key === hypervisor) {
  452. delete loginTypes[LOGIN_TYPES_MAP.keypair.key]
  453. }
  454. }
  455. if (this.isServertemplate) {
  456. delete loginTypes[LOGIN_TYPES_MAP.keypair.key]
  457. delete loginTypes[LOGIN_TYPES_MAP.password.key]
  458. }
  459. return Object.keys(loginTypes)
  460. },
  461. osSelectTypes () {
  462. if (HYPERVISORS_MAP.ctyun.key === this.hypervisor) {
  463. return ['public', 'public_customize']
  464. }
  465. return []
  466. },
  467. instanceSpecParams () {
  468. const params = {
  469. public_cloud: true,
  470. usable: true,
  471. enabled: true,
  472. }
  473. const { provider, cloudregion, zone } = this.form.fd
  474. if (provider) params.provider = provider
  475. if (cloudregion) params.cloudregion = cloudregion
  476. if (zone) params.zone = zone
  477. return params
  478. },
  479. cloudproviderParamsExtra () {
  480. const params = {
  481. ...this.scopeParams,
  482. }
  483. const { cloudregion } = this.form.fd
  484. if (this.form.fd.sku && this.form.fd.sku.provider) {
  485. params.provider = this.form.fd.sku.provider
  486. }
  487. if (cloudregion) params.cloudregion = cloudregion
  488. return params
  489. },
  490. hideCloudaccountSched () {
  491. return !!this.form.fd.prefer_manager
  492. },
  493. policycloudproviderParams () {
  494. const params = {
  495. limit: 0,
  496. brand: this.form.fd.provider,
  497. cloudregion: this.form.fd.cloudregion,
  498. enabled: true,
  499. read_only: false,
  500. filter: 'status.equals(\'connected\')',
  501. ...this.scopeParams,
  502. }
  503. if (this.form.fd.zone) {
  504. params.zone = this.form.fd.zone
  505. }
  506. return params
  507. },
  508. },
  509. watch: {
  510. 'form.fd.billType' (val) {
  511. // 计费方式为包年包月平台不含 azure、aws,这里统一做清空处理
  512. if (val === BILL_TYPES_MAP.package.key) {
  513. this.form.fc.setFieldsValue({
  514. provider: undefined,
  515. cloudregion: undefined,
  516. zone: undefined,
  517. })
  518. }
  519. this.$refs.areaSelectRef.fetchs(['provider'])
  520. },
  521. 'form.fd.duration' (val, oldVal) {
  522. if (this.form.fd.billType === BILL_TYPES_MAP.package.key) {
  523. if (val === '1W' || oldVal === '1W') {
  524. this.form.fc.setFieldsValue({
  525. provider: undefined,
  526. cloudregion: undefined,
  527. zone: undefined,
  528. })
  529. this.$refs.areaSelectRef.fetchs(['provider', 'cloudregion', 'zone'])
  530. }
  531. }
  532. },
  533. },
  534. created () {
  535. this.baywatch(['form.fd.provider', 'form.fd.cloudregion', 'form.fd.zone'], this.fetchInstanceSpecs)
  536. this.baywatch(['form.fd.sku', 'form.fd.zone'], this.withFetchCapbilites)
  537. },
  538. methods: {
  539. providerFetchSuccess (list) {
  540. // 计费方式为包年包月平台不含 azure、aws、google
  541. if (this.form.fd.billType === BILL_TYPES_MAP.package.key) {
  542. if (this.form.fd.duration === '1W') {
  543. list = list.filter(item => HYPERVISORS_MAP.aliyun.key === item.name.toLowerCase())
  544. this.form.fc.setFieldsValue({
  545. provider: HYPERVISORS_MAP.aliyun.provider,
  546. })
  547. } else {
  548. list = list.filter(item => {
  549. return ![HYPERVISORS_MAP.azure.key, HYPERVISORS_MAP.aws.key, HYPERVISORS_MAP.google.key].includes(item.name.toLowerCase())
  550. })
  551. }
  552. }
  553. // 过滤京东云和移动云等只读的云
  554. list = list.filter(item => {
  555. return ![HYPERVISORS_MAP.jdcloud.key, HYPERVISORS_MAP.ecloud.key].includes(item.name.toLowerCase())
  556. })
  557. // 回填
  558. if (this.isInitForm && this.initFormData.hypervisor && list.some(item => item.name.toLowerCase() === this.initFormData.hypervisor)) {
  559. if (HYPERVISORS_MAP[this.initFormData.hypervisor]) {
  560. this.form.fc.setFieldsValue({
  561. provider: HYPERVISORS_MAP[this.initFormData.hypervisor].provider,
  562. cloudregion: this.initFormData.prefer_region,
  563. zone: this.initFormData.prefer_zone,
  564. cloudprovider: this.initFormData.prefer_manager_id,
  565. })
  566. }
  567. }
  568. this.$set(this.form.fi, 'providerList', list)
  569. return list
  570. },
  571. onValuesChange (vm, changedFields) {
  572. this.$nextTick(() => {
  573. const formValue = this.form.fc.getFieldsValue()
  574. const newField = resolveValueChangeField(changedFields)
  575. this._setNewFieldToFd(newField, formValue)
  576. })
  577. },
  578. async fetchCapability () {
  579. const params = {
  580. show_emulated: true,
  581. ...this.scopeParams,
  582. resource_type: this.form.fc.getFieldValue('resourceType'),
  583. }
  584. let id = this.cloudregionZoneParams.cloudregion
  585. let resource = 'cloudregions'
  586. if (this.cloudregionZoneParams.zone) {
  587. id = this.cloudregionZoneParams.zone
  588. resource = 'zones'
  589. }
  590. const capabilityParams = { id, spec: 'capability', params }
  591. if (!id) return
  592. if (R.equals(this.capabilityParams, capabilityParams)) return // 和已有的参数一样则不发请求
  593. this.capabilityParams = capabilityParams
  594. try {
  595. const { data } = await new this.$Manager(resource).getSpecific(this.capabilityParams)
  596. this.form.fi.capability = data
  597. } catch (error) {
  598. throw error
  599. }
  600. },
  601. async fetchInstanceSpecs () {
  602. try {
  603. const { data } = await this.serverskusM.get({ id: 'instance-specs', params: this.instanceSpecParams })
  604. this.form.fi.cpuMem = data
  605. const vcpuDecorator = this.decorators.vcpu
  606. const vcpuInit = vcpuDecorator[1].initialValue
  607. const cpu = this.form.fd.vcpu || vcpuInit
  608. this.cpuChange(cpu)
  609. } catch (error) {
  610. throw error
  611. }
  612. },
  613. withFetchCapbilites (val, oldVal) {
  614. if (val && !R.equals(val, oldVal)) {
  615. this.fetchCapability()
  616. }
  617. },
  618. cloudproviderLabel (item) {
  619. let label = item.name
  620. if (!this.usableCloudproviderMaps[item.id]) {
  621. if (item.status !== 'connected') {
  622. label += this.$t('compute.text_184')
  623. } else if (item.health_status !== 'normal') {
  624. label += this.$t('compute.text_185')
  625. } else if (item.enabled === false) {
  626. label += this.$t('compute.text_186')
  627. } else {
  628. label += this.$t('compute.text_187')
  629. }
  630. }
  631. return label
  632. },
  633. labelFormat (item) {
  634. if (this.form.fi.createType === SERVER_TYPE.public) {
  635. return `${item.account} / ${item.manager} / ${item.zone}`
  636. }
  637. return item.name
  638. },
  639. cloudproviderSelected (item) {
  640. this.cloudaccountId = item.cloudaccount_id || ''
  641. },
  642. cloudproviderUpdate (item) {
  643. this.cloudaccountId = item.cloudaccount_id || ''
  644. }
  645. },
  646. }
  647. </script>