CreateDnat.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <a-form
  6. :form="form.fc">
  7. <a-form-item :label="$t('network.text_21')" v-bind="formItemLayout">
  8. <a-input v-decorator="decorators.name" :placeholder="$t('network.text_44')" />
  9. </a-form-item>
  10. <a-form-item :label="$t('network.text_539')" v-bind="formItemLayout">
  11. <template #extra>{{$t('network.text_540')}}<router-link :to="{ path: '/eip' }" target="_blank">{{$t('dictionary.eip')}}</router-link>
  12. </template>
  13. <base-select
  14. v-decorator="decorators.ip"
  15. :params="eipParams"
  16. :select-props="{ placeholder: $t('network.text_541') }"
  17. resource="eips"
  18. :showSync="true"
  19. :labelFormat="eiplabelFormat"
  20. :resList.sync="eipOptions" />
  21. </a-form-item>
  22. <a-form-item :label="$t('network.text_542')" v-bind="formItemLayout">
  23. <base-select
  24. v-decorator="decorators.server"
  25. :params="serverParams"
  26. :select-props="{ placeholder: $t('network.text_543') }"
  27. resource="servers"
  28. :filterable="true"
  29. :labelFormat="serverlabelFormat"
  30. :resList.sync="serverOptions"
  31. :mapper="serversMapper" />
  32. </a-form-item>
  33. <a-form-item :label="$t('network.text_544')" v-bind="formItemLayout" :extra="$t('network.text_545')">
  34. <a-input-number :min="1" :max="65535" v-decorator="decorators.externalPort" />
  35. </a-form-item>
  36. <a-form-item :label="$t('network.text_546')" v-bind="formItemLayout" :extra="$t('network.text_545')">
  37. <a-input-number :min="1" :max="65535" v-decorator="decorators.internalPort" />
  38. </a-form-item>
  39. <a-form-item :label="$t('network.text_547')" v-bind="formItemLayout">
  40. <a-select v-decorator="decorators.protocol">
  41. <a-select-option value="tcp">TCP</a-select-option>
  42. <a-select-option value="udp">UDP</a-select-option>
  43. </a-select>
  44. </a-form-item>
  45. </a-form>
  46. </div>
  47. <div slot="footer">
  48. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  49. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  50. </div>
  51. </base-dialog>
  52. </template>
  53. <script>
  54. import * as R from 'ramda'
  55. import DialogMixin from '@/mixins/dialog'
  56. import WindowsMixin from '@/mixins/windows'
  57. export default {
  58. name: 'DNatCreateDialog',
  59. mixins: [DialogMixin, WindowsMixin],
  60. data () {
  61. return {
  62. loading: false,
  63. form: {
  64. fc: this.$form.createForm(this),
  65. },
  66. decorators: {
  67. name: [
  68. 'name',
  69. {
  70. validateTrigger: ['change', 'blur'],
  71. validateFirst: true,
  72. rules: [
  73. { required: true, message: this.$t('network.text_116') },
  74. { validator: this.$validate('serverCreateName') },
  75. ],
  76. },
  77. ],
  78. ip: [
  79. 'ip',
  80. {
  81. rules: [
  82. { required: true, message: this.$t('network.text_541') },
  83. ],
  84. },
  85. ],
  86. server: [
  87. 'server',
  88. {
  89. rules: [
  90. { required: true, message: this.$t('network.text_543') },
  91. ],
  92. },
  93. ],
  94. externalPort: [
  95. 'externalPort',
  96. {
  97. validateTrigger: ['blur'],
  98. validateFirst: true,
  99. rules: [
  100. { required: true, message: this.$t('network.text_548') },
  101. ],
  102. },
  103. ],
  104. internalPort: [
  105. 'internalPort',
  106. {
  107. validateTrigger: ['blur'],
  108. validateFirst: true,
  109. rules: [
  110. { required: true, message: this.$t('network.text_549') },
  111. ],
  112. },
  113. ],
  114. protocol: [
  115. 'protocol',
  116. {
  117. rules: [
  118. { required: true, message: this.$t('network.text_550') },
  119. ],
  120. },
  121. ],
  122. },
  123. formItemLayout: {
  124. wrapperCol: {
  125. span: 19,
  126. },
  127. labelCol: {
  128. span: 5,
  129. },
  130. },
  131. tailFormItemLayout: {
  132. wrapperCol: {
  133. span: 16,
  134. offset: 8,
  135. },
  136. labelCol: {
  137. span: 3,
  138. },
  139. },
  140. serverParams: {
  141. scope: this.$store.getters.scope,
  142. vpc: this.params.data.vpc_id,
  143. status: ['running', 'ready'],
  144. },
  145. eipParams: {
  146. scope: this.$store.getters.scope,
  147. usable_eip_for_associate_type: 'natgateway',
  148. usable_eip_for_associate_id: this.params.data.id,
  149. },
  150. snatEips: [],
  151. serverOptions: [],
  152. eipOptions: [],
  153. }
  154. },
  155. created () {
  156. this.querySnatResources()
  157. },
  158. methods: {
  159. eiplabelFormat (val) {
  160. return `${val.name}(${val.ip_addr})`
  161. },
  162. serverlabelFormat (val) {
  163. return `${val.name}(${val.ips})`
  164. },
  165. querySnatResources () {
  166. const manager = new this.$Manager('natgateways')
  167. manager.performAction({ id: this.params.data.id, action: 'snat-resources', data: {} })
  168. .then((res) => {
  169. this.snatEips = res.data.eips
  170. })
  171. },
  172. serversMapper (data) {
  173. data = data.filter((item) => { return !item.eip })
  174. return data
  175. },
  176. doCreate (data) {
  177. return this.params.onManager('create', {
  178. managerArgs: {
  179. data,
  180. },
  181. })
  182. },
  183. async handleConfirm () {
  184. this.loading = true
  185. try {
  186. const values = await this.form.fc.validateFields()
  187. const eipObj = R.indexBy(R.prop('id'), this.eipOptions)
  188. const serverObj = R.indexBy(R.prop('id'), this.serverOptions)
  189. const params = {
  190. name: values.name,
  191. natgateway_id: this.params.data.id,
  192. internal_ip: serverObj[values.server].ips,
  193. internal_port: Number(values.internalPort),
  194. external_ip: eipObj[values.ip].ip_addr,
  195. external_ip_id: eipObj[values.ip].id,
  196. external_port: Number(values.externalPort),
  197. ip_protocol: values.protocol,
  198. }
  199. await this.doCreate(params)
  200. this.loading = false
  201. this.cancelDialog()
  202. } catch (error) {
  203. this.loading = false
  204. throw error
  205. }
  206. },
  207. },
  208. }
  209. </script>