Private.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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_1058')" class="mb-0">
  28. <cpu-radio :decorator="decorators.vcpu" :options="form.fi.cpuMem.cpus || []" @change="cpuChange" />
  29. </a-form-item>
  30. <a-form-item :label="$t('compute.text_369')" class="mb-0">
  31. <mem-radio :decorator="decorators.vmem" :options="form.fi.cpuMem.mems_mb || []" />
  32. </a-form-item>
  33. <a-form-item :label="$t('compute.text_109')" v-if="showSku">
  34. <sku
  35. v-decorator="decorators.sku"
  36. :type="type"
  37. :sku-params="skuParam"
  38. :hypervisor="form.fd.hypervisor" />
  39. </a-form-item>
  40. <a-form-item :label="$t('compute.text_49')" class="mb-0">
  41. <system-disk
  42. :decorator="decorators.systemDisk"
  43. :type="type"
  44. :form="form"
  45. :hypervisor="form.fd.hypervisor"
  46. :sku="form.fd.sku"
  47. :capability-data="form.fi.capability"
  48. :image="form.fi.imageMsg"
  49. :sizeDisabled="disabledSysDiskSize" />
  50. </a-form-item>
  51. <a-form-item :label="$t('compute.text_50')">
  52. <data-disk
  53. v-if="form.fd.hypervisor"
  54. :decorator="decorators.dataDisk"
  55. :type="type"
  56. :form="form"
  57. :hypervisor="form.fd.hypervisor"
  58. :sku="form.fd.sku"
  59. :defaultType="form.fd.systemDiskType"
  60. :capability-data="form.fi.capability"
  61. :simplify="true"
  62. ref="dataDiskRef" />
  63. </a-form-item>
  64. <bottom-bar
  65. ref="bottomBarRef"
  66. :loading="submiting"
  67. :form="form"
  68. :type="type"
  69. :dataDiskSizes="dataDiskSizes"
  70. :isOpenWorkflow="isOpenWorkflow"
  71. :errors.sync="errors"
  72. :isServertemplate="isServertemplate"
  73. :hasMeterService="hasMeterService"
  74. @getOriginPrice="getOriginPrice" />
  75. </a-form>
  76. </div>
  77. </template>
  78. <script>
  79. import _ from 'lodash'
  80. import * as R from 'ramda'
  81. import mixin from './mixin'
  82. import { resolveValueChangeField } from '@/utils/common/ant'
  83. import { HYPERVISORS_MAP } from '@/constants'
  84. export default {
  85. name: 'VMPrivateCreate',
  86. components: {},
  87. mixins: [mixin],
  88. computed: {
  89. cloudregionParams () {
  90. return {
  91. cloud_env: 'private',
  92. usable: true,
  93. show_emulated: true,
  94. ...this.scopeParams,
  95. }
  96. },
  97. zoneParams () {
  98. return {
  99. usable: true,
  100. show_emulated: true,
  101. order_by: 'created_at',
  102. order: 'asc',
  103. ...this.scopeParams,
  104. }
  105. },
  106. cacheImageParams () {
  107. const params = {}
  108. if (R.is(Object, this.form.fd.sku)) {
  109. if (this.cloudregionZoneParams.cloudregion) {
  110. params.cloudregion_id = this.cloudregionZoneParams.cloudregion
  111. }
  112. }
  113. if (!params.cloudregion_id) return {}
  114. return params
  115. },
  116. showSku () {
  117. if (this.form.fd.vcpu && this.form.fd.vmem) {
  118. return true
  119. }
  120. return false
  121. },
  122. skuParam () {
  123. return {
  124. limit: 0,
  125. public_cloud: false,
  126. postpaid_status: 'available',
  127. cpu_core_count: this.form.fd.vcpu || this.decorators.vcpu[1].initialValue,
  128. memory_size_mb: this.form.fd.vmem,
  129. usable: true,
  130. enabled: true,
  131. provider: 'OneCloud',
  132. ...this.scopeParams,
  133. }
  134. },
  135. policyHostParams () {
  136. const zone = _.get(this.form.fd, 'zone.key')
  137. if (zone) {
  138. return {
  139. enabled: 1,
  140. usable: true,
  141. zone,
  142. hypervisor: this.form.fd.hypervisor,
  143. }
  144. }
  145. return {}
  146. },
  147. networkParam () {
  148. const params = {
  149. filter: 'server_type.notin(ipmi, pxe)',
  150. usable: true,
  151. zone: _.get(this.form, 'fd.zone.key'),
  152. ...this.scopeParams,
  153. }
  154. return params
  155. },
  156. instanceSpecParmas () {
  157. if (this.form.fd.hypervisor === HYPERVISORS_MAP.hcso.hypervisor || this.form.fd.hypervisor === HYPERVISORS_MAP.hcs.hypervisor) {
  158. const params = {
  159. usable: true,
  160. enabled: true,
  161. provider: HYPERVISORS_MAP.hcso.provider,
  162. }
  163. if (this.form.fd.hypervisor === HYPERVISORS_MAP.hcs.hypervisor) {
  164. params.provider = HYPERVISORS_MAP.hcs.provider
  165. }
  166. if (this.cloudregionZoneParams.cloudregion) {
  167. params.cloudregion_id = this.cloudregionZoneParams.cloudregion
  168. }
  169. return params
  170. } else {
  171. return {
  172. usable: true,
  173. enabled: true,
  174. 'provider.0': HYPERVISORS_MAP.kvm.provider,
  175. 'provider.1': _.get(HYPERVISORS_MAP, `[${this.form.fd.hypervisor}].provider`),
  176. }
  177. }
  178. },
  179. cloudproviderParamsExtra () {
  180. const params = {
  181. cloud_env: 'private',
  182. ...this.scopeParams,
  183. }
  184. if (this.form.fd.hypervisor && this.form.fd.hypervisor) {
  185. params.provider = HYPERVISORS_MAP[this.form.fd.hypervisor].provider
  186. }
  187. return params
  188. },
  189. disabledSysDiskSize () {
  190. if (this.form.fd.systemDiskType) {
  191. return this.form.fd.systemDiskType.key === 'nova'
  192. }
  193. return false
  194. },
  195. },
  196. methods: {
  197. onValuesChange (vm, changedFields) {
  198. this.$nextTick(() => {
  199. const formValue = this.form.fc.getFieldsValue()
  200. const newField = resolveValueChangeField(changedFields)
  201. this._setNewFieldToFd(newField, formValue)
  202. const keys = Object.keys(newField)
  203. if (keys.includes('zone')) {
  204. this.fetchCapability()
  205. }
  206. })
  207. },
  208. fetchCapability () {
  209. const params = {
  210. show_emulated: true,
  211. resource_type: 'shared',
  212. ...this.scopeParams,
  213. }
  214. let id = this.cloudregionZoneParams.cloudregion
  215. let resource = 'cloudregions'
  216. if (this.cloudregionZoneParams.zone) {
  217. id = this.cloudregionZoneParams.zone
  218. resource = 'zones'
  219. }
  220. const capabilityParams = { id, spec: 'capability', params }
  221. if (!id) return
  222. if (R.equals(this.capabilityParams, capabilityParams)) return // 和已有的参数一样则不发请求
  223. this.capabilityParams = capabilityParams
  224. new this.$Manager(resource).getSpecific(this.capabilityParams)
  225. .then(({ data }) => {
  226. this.form.fi.capability = {
  227. ...data,
  228. hypervisors: data.hypervisors.filter(val => val !== 'baremetal'),
  229. }
  230. this.form.fc.getFieldDecorator('hypervisor', { preserve: true })
  231. this.form.fc.setFieldsValue({
  232. hypervisor: this.form.fi.capability.hypervisors[0], // 赋值默认第一个平台
  233. })
  234. this.$nextTick(this.fetchInstanceSpecs)
  235. })
  236. },
  237. fetchInstanceSpecs () {
  238. this.serverskusM.get({ id: 'instance-specs', params: this.instanceSpecParmas })
  239. .then(({ data }) => {
  240. this.form.fi.cpuMem = data
  241. const vcpuDecorator = this.decorators.vcpu
  242. const vcpuInit = vcpuDecorator[1].initialValue
  243. this.cpuChange(vcpuInit)
  244. })
  245. },
  246. },
  247. }
  248. </script>