IDC.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <a-form :form="form.fc" class="mt-3" v-bind="formItemLayout">
  3. <a-form-item :label="$t('network.text_205', [$t('dictionary.project')])" class="mb-0">
  4. <domain-project :fc="form.fc" :decorators="decorators" :domain.sync="domain" :project.sync="project" :labelInValue="false" />
  5. </a-form-item>
  6. <a-form-item :label="$t('network.text_199')" class="mb-0">
  7. <cloudregion-zone
  8. :decorator="decorators"
  9. :cloudregionParams="cloudregionParams"
  10. :zoneParams="zoneParams"
  11. :zone.sync="zoneObj"
  12. filterBrandResource="loadbalancer_engine" />
  13. </a-form-item>
  14. <a-form-item :label="$t('network.text_21')">
  15. <a-input v-decorator="decorators.name" :placeholder="$t('validator.resourceName')" />
  16. </a-form-item>
  17. <a-form-item :label="$t('common.description')">
  18. <a-textarea :auto-size="{ minRows: 1, maxRows: 3 }" v-decorator="decorators.description" :placeholder="$t('common_367')" />
  19. </a-form-item>
  20. <a-form-item :label="$t('compute.text_176')">
  21. <a-radio-group :defaultValue="hypervisorOpts[0].key">
  22. <a-radio-button v-for="item in hypervisorOpts" :value="item.key" :key="item.key">{{ item.label }}</a-radio-button>
  23. </a-radio-group>
  24. </a-form-item>
  25. <a-form-item :label="$t('network.text_19')">
  26. <base-select
  27. show-sync
  28. v-decorator="decorators.cluster_id"
  29. resource="loadbalancerclusters"
  30. need-params
  31. filterable
  32. :params="clusterParams"
  33. :select-props="{ placeholder: $t('network.text_79') }" />
  34. <div slot="extra" v-if="isAdminMode">{{$t('network.text_281')}}<help-link href="/cluster">{{$t('network.text_282')}}</help-link></div>
  35. </a-form-item>
  36. <a-form-item :label="$t('network.text_211')">
  37. <a-row :gutter="8">
  38. <a-col :span="12">
  39. <oc-select
  40. width="100%"
  41. v-decorator="decorators.vpc"
  42. show-status
  43. :status-desc="$t('compute.vpc_status_desc')"
  44. resource="vpcs"
  45. label="VPC"
  46. :formatter="vpcFormatter"
  47. :params="vpcParams"
  48. :sort="(arr) => arr.sort((a, b) => a.network_count > b.network_count ? -1 : 1)"
  49. :placeholder="$t('compute.text_194')" />
  50. </a-col>
  51. <a-col :span="12">
  52. <a-form-item>
  53. <base-select
  54. v-decorator="decorators.network"
  55. resource="networks"
  56. need-params
  57. filterable
  58. isDefaultSelect
  59. :params="networkParams"
  60. :item.sync="networkObj"
  61. :select-props="{ placeholder: $t('network.text_212') }" />
  62. </a-form-item>
  63. </a-col>
  64. </a-row>
  65. </a-form-item>
  66. <eip-config
  67. v-if="showEip"
  68. :decorators="decorators.eip"
  69. :eip-params="eipParams"
  70. hypervisor="kvm"
  71. cloud-env="idc"
  72. :form="form"
  73. :formItemLayout="formItemLayout" />
  74. <a-form-item :label="$t('table.title.tag')">
  75. <tag v-decorator="decorators.__meta__" :allowNoValue="false" />
  76. </a-form-item>
  77. </a-form>
  78. </template>
  79. <script>
  80. import * as R from 'ramda'
  81. import _ from 'lodash'
  82. import { mapGetters } from 'vuex'
  83. import CloudregionZone from '@/sections/CloudregionZone'
  84. import EipConfig from '@Compute/sections/EipConfig'
  85. import { HYPERVISORS_MAP } from '@/constants'
  86. import lbCreate from './mixin'
  87. export default {
  88. name: 'LbOnecloudCreate',
  89. components: {
  90. CloudregionZone,
  91. EipConfig,
  92. },
  93. mixins: [lbCreate],
  94. provide () {
  95. return {
  96. form: this.form,
  97. }
  98. },
  99. data () {
  100. return {
  101. zoneObj: {},
  102. hadVpc: false,
  103. }
  104. },
  105. computed: {
  106. ...mapGetters(['isAdminMode']),
  107. clusterParams () {
  108. let params = {}
  109. if (this.zoneObj && this.zoneObj.id && !R.isEmpty(this.scopeParams)) {
  110. params.zone = this.zoneObj.id
  111. params.limit = 0
  112. params = Object.assign(params, this.scopeParams)
  113. }
  114. return params
  115. },
  116. networkParams () {
  117. let params = {}
  118. if (this.form.fd.vpc && !R.isEmpty(this.scopeParams)) {
  119. params = { ...this.scopeParams, usable: true }
  120. params.limit = 0
  121. params.vpc = this.form.fd.vpc
  122. if (this.zoneObj && this.zoneObj.id) params.zone = this.zoneObj.id
  123. }
  124. return params
  125. },
  126. cloudregionParams () { // 覆盖 mixin
  127. return {
  128. scope: this.$store.getters.scope,
  129. usable: true,
  130. is_on_premise: true,
  131. }
  132. },
  133. // 当前只支持oneCloud
  134. hypervisorOpts () {
  135. return [HYPERVISORS_MAP.kvm]
  136. },
  137. eipParams () {
  138. const cloudregion = _.get(this.form.fd, 'cloudregion.key')
  139. if (!cloudregion) return {}
  140. return {
  141. project: this.project,
  142. region: cloudregion,
  143. }
  144. },
  145. showEip () {
  146. const { vpc } = this.form.fd
  147. if (!vpc || vpc === 'default') {
  148. return false
  149. }
  150. return true
  151. },
  152. },
  153. methods: {
  154. async submit () {
  155. try {
  156. const values = await this.form.fc.validateFields()
  157. const data = {
  158. cluster_id: values.cluster_id,
  159. name: values.name.trim(),
  160. description: values.description,
  161. vpc: values.vpc,
  162. network: values.network,
  163. domain: values.domain,
  164. project: values.project,
  165. __meta__: values.__meta__,
  166. }
  167. if (values.eip_type === 'new') {
  168. data.eip_bgp_type = values.eip_bgp_type
  169. data.eip_bw = values.eip_bw
  170. data.eip_charge_type = values.eip_charge_type
  171. } else if (values.eip_type === 'bind') {
  172. data.eip = values.eip
  173. data.address_type = 'internet'
  174. }
  175. return data
  176. } catch (error) {
  177. throw error
  178. }
  179. },
  180. },
  181. }
  182. </script>