CreateSnat.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <a-form
  6. v-bind="formItemLayout"
  7. :form="form.fc">
  8. <a-form-item :label="$t('network.text_21')">
  9. <a-input v-decorator="decorators.name" :placeholder="$t('network.text_44')" />
  10. </a-form-item>
  11. <a-form-item :label="$t('network.text_249')">
  12. <a-radio-group v-model="resource" @change="onResourceTypeChanged">
  13. <a-radio value="networks">{{$t('network.snat.type.network')}}</a-radio>
  14. <a-radio value="servers">{{$t('network.snat.type.server')}}</a-radio>
  15. </a-radio-group>
  16. </a-form-item>
  17. <a-form-item :label="resource_label">
  18. <base-select
  19. v-decorator="decorators.res_id"
  20. :params="resParams"
  21. :select-props="resouce_props"
  22. :resource="resource"
  23. :resList.sync="resOptions"
  24. :filterable="true" />
  25. </a-form-item>
  26. <a-form-item :label="$t('network.text_539')">
  27. <template #extra>{{$t('network.text_540')}}<router-link :to="{ path: '/eip' }" target="_blank">{{$t('dictionary.eip')}}</router-link>
  28. </template>
  29. <base-select
  30. v-decorator="decorators.eip"
  31. :params="eipParams"
  32. :select-props="{ placeholder: $t('network.text_541') }"
  33. resource="eips"
  34. :labelFormat="labelFormat"
  35. :showSync="true" />
  36. </a-form-item>
  37. </a-form>
  38. </div>
  39. <div slot="footer">
  40. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  41. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  42. </div>
  43. </base-dialog>
  44. </template>
  45. <script>
  46. import * as R from 'ramda'
  47. import DialogMixin from '@/mixins/dialog'
  48. import WindowsMixin from '@/mixins/windows'
  49. export default {
  50. name: 'SNatCreateDialog',
  51. mixins: [DialogMixin, WindowsMixin],
  52. data () {
  53. return {
  54. loading: false,
  55. form: {
  56. fc: this.$form.createForm(this),
  57. },
  58. resource_label: this.$t('network.snat.type.network'),
  59. resource: 'networks',
  60. resouce_props: { placeholder: this.$t('network.text_552') },
  61. decorators: {
  62. name: [
  63. 'name',
  64. {
  65. validateTrigger: ['blur'],
  66. validateFirst: true,
  67. rules: [
  68. { required: true, message: this.$t('network.text_116') },
  69. { validator: this.$validate('serverCreateName') },
  70. ],
  71. },
  72. ],
  73. res_id: [
  74. 'res_id',
  75. {
  76. rules: [
  77. { required: true, message: this.$t('network.text_552') },
  78. ],
  79. },
  80. ],
  81. eip: [
  82. 'eip',
  83. {
  84. rules: [
  85. { required: true, message: this.$t('network.text_541') },
  86. ],
  87. },
  88. ],
  89. },
  90. formItemLayout: {
  91. wrapperCol: {
  92. span: 19,
  93. },
  94. labelCol: {
  95. span: 5,
  96. },
  97. },
  98. tailFormItemLayout: {
  99. wrapperCol: {
  100. span: 16,
  101. offset: 8,
  102. },
  103. labelCol: {
  104. span: 3,
  105. },
  106. },
  107. resParams: {
  108. scope: this.$store.getters.scope,
  109. vpc: this.params.data.vpc_id,
  110. status: ['running', 'ready', 'available'],
  111. },
  112. eipParams: {
  113. scope: this.$store.getters.scope,
  114. usable_eip_for_associate_type: 'natgateway',
  115. usable_eip_for_associate_id: this.params.data.id,
  116. },
  117. resOptions: [],
  118. }
  119. },
  120. methods: {
  121. onResourceTypeChanged (e) {
  122. this.resource = e.target.value
  123. switch (this.resource) {
  124. case 'servers':
  125. this.resource_label = this.$t('network.snat.type.server')
  126. this.resouce_props = { placeholder: this.$t('network.text_60') }
  127. this.decorators.res_id[1].rules[0].message = this.$t('network.text_60')
  128. break
  129. case 'networks':
  130. this.resource_label = this.$t('network.snat.type.network')
  131. this.resouce_props = { placeholder: this.$t('network.text_552') }
  132. this.decorators.res_id[1].rules[0].message = this.$t('network.text_552')
  133. break
  134. }
  135. },
  136. labelFormat (val) {
  137. return `${val.name}(${val.ip_addr})`
  138. },
  139. doCreate (data) {
  140. return this.params.onManager('create', {
  141. managerArgs: {
  142. data,
  143. },
  144. })
  145. },
  146. async handleConfirm () {
  147. this.loading = true
  148. try {
  149. const values = await this.form.fc.validateFields()
  150. const params = {
  151. name: values.name,
  152. natgateway_id: this.params.data.id,
  153. eip: values.eip,
  154. }
  155. const resObj = R.indexBy(R.prop('id'), this.resOptions)
  156. switch (this.resource) {
  157. case 'networks':
  158. params.network_id = values.res_id
  159. break
  160. case 'servers':
  161. resObj[values.res_id].nics.forEach((nic) => {
  162. if (nic.ip_addr && nic.vpc_id === this.params.data.vpc_id) {
  163. params.source_cidr = nic.ip_addr + '/32'
  164. }
  165. })
  166. break
  167. }
  168. await this.doCreate(params)
  169. this.loading = false
  170. this.cancelDialog()
  171. } catch (error) {
  172. this.loading = false
  173. throw error
  174. }
  175. },
  176. },
  177. }
  178. </script>