index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <div>
  3. <page-header :title="$t('compute.create_tap_service')" />
  4. <page-body needMarginBottom>
  5. <a-form :form="form.fc" class="mt-3" v-bind="formItemLayout">
  6. <a-form-item :label="$t('compute.text_228')">
  7. <a-input :placeholder="$t('validator.serverCreateName')" v-decorator="decorators.name" />
  8. </a-form-item>
  9. <a-form-item :label="$t('common.description')">
  10. <a-input :placeholder="$t('scope.text_55')" v-decorator="decorators.description" />
  11. </a-form-item>
  12. <a-form-item :label="$t('compute.text_175')">
  13. <a-radio-group v-decorator="decorators.type">
  14. <a-radio-button value="host">{{ $t('compute.host_port') }}</a-radio-button>
  15. <a-radio-button value="guest">{{ $t('compute.guest_port') }}</a-radio-button>
  16. </a-radio-group>
  17. </a-form-item>
  18. <a-form-item :label="$t('compute.target_server')">
  19. <base-select
  20. v-decorator="decorators.target_id"
  21. class="w-100"
  22. :filterable="true"
  23. :resource="serverType === 'guest' ? 'servers' : 'hosts'"
  24. version="v1"
  25. needParams
  26. :params="serverParams"
  27. isDefaultSelect
  28. :select-props="{ placeholder: $t('compute.text_148', [$t('compute.target_server')]) }"
  29. @update:item="serverChange" />
  30. </a-form-item>
  31. <a-form-item v-if="serverType === 'host'" :label="$t('compute.target_mac')">
  32. <base-select
  33. v-decorator="decorators.mac_addr"
  34. :options="macAddrs"
  35. idKey="mac"
  36. nameKey="mac"
  37. isDefaultSelect
  38. :select-props="{ placeholder: $t('compute.text_148', [$t('compute.target_mac')]) }" />
  39. </a-form-item>
  40. </a-form>
  41. </page-body>
  42. <page-footer>
  43. <div slot="right">
  44. <a-button class="mr-3" type="primary" @click="handleConfirm" :loading="loading">{{$t('compute.text_907')}}</a-button>
  45. <a-button @click="handleCancel">{{$t('compute.text_908')}}</a-button>
  46. </div>
  47. </page-footer>
  48. </div>
  49. </template>
  50. <script>
  51. import { mapGetters } from 'vuex'
  52. import validateForm from '@/utils/validate'
  53. export default {
  54. name: 'TapServiceCreate',
  55. data () {
  56. return {
  57. form: {
  58. fc: this.$form.createForm(this, {
  59. onValuesChange: this.handleValuesChange,
  60. }),
  61. fd: {
  62. type: 'host',
  63. },
  64. },
  65. decorators: {
  66. name: [
  67. 'name',
  68. {
  69. initialValue: '',
  70. validateTrigger: ['change', 'blur'],
  71. validateFirst: true,
  72. rules: [
  73. { required: true, message: this.$t('compute.text_210') },
  74. { validator: validateForm('serverCreateName') },
  75. ],
  76. },
  77. ],
  78. description: [
  79. 'description',
  80. ],
  81. type: [
  82. 'type',
  83. {
  84. initialValue: 'host',
  85. },
  86. ],
  87. target_id: [
  88. 'target_id',
  89. {
  90. rules: [{ required: true, message: this.$t('compute.text_148', [this.$t('compute.target_server')]) }],
  91. },
  92. ],
  93. mac_addr: [
  94. 'mac_addr',
  95. {
  96. rules: [{ required: true, message: this.$t('compute.text_148', [this.$t('compute.target_mac')]) }],
  97. },
  98. ],
  99. },
  100. currentHost: {},
  101. formItemLayout: {
  102. wrapperCol: {
  103. md: { span: 16 },
  104. xl: { span: 18 },
  105. xxl: { span: 20 },
  106. },
  107. labelCol: {
  108. md: { span: 8 },
  109. xl: { span: 6 },
  110. xxl: { span: 4 },
  111. },
  112. },
  113. }
  114. },
  115. computed: {
  116. ...mapGetters(['isAdminMode', 'isDomainMode', 'scope']),
  117. serverParams () {
  118. return {
  119. scope: this.scope,
  120. filter: 'hypervisor.notin(baremetal,container)',
  121. brand: 'OneCloud',
  122. limit: 20,
  123. system: this.isAdminMode,
  124. }
  125. },
  126. serverType () {
  127. return this.form.fd.type
  128. },
  129. macAddrs () {
  130. const { nic_info = [] } = this.currentHost
  131. return nic_info.filter(item => !item.wire_id)
  132. },
  133. },
  134. methods: {
  135. async handleValuesChange (vm, changedFields) {
  136. this.form.fd = {
  137. ...this.form.fd,
  138. ...changedFields,
  139. }
  140. await this.$nextTick()
  141. if (changedFields.target_id && this.serverType === 'host') {
  142. this.form.fc.setFieldsValue({
  143. mac_addr: '',
  144. })
  145. }
  146. },
  147. serverChange (data) {
  148. if (this.serverType === 'host') {
  149. this.currentHost = data
  150. } else {
  151. this.currentHost = {}
  152. }
  153. },
  154. handleCancel () {
  155. this.$router.push({
  156. name: 'TapService',
  157. })
  158. },
  159. async handleConfirm () {
  160. const manager = new this.$Manager('tap_services', 'v1')
  161. try {
  162. const values = await this.form.fc.validateFields()
  163. this.loading = true
  164. await manager.create({
  165. data: values,
  166. })
  167. this.handleCancel()
  168. } catch (err) {
  169. throw err
  170. } finally {
  171. this.loading = false
  172. }
  173. },
  174. },
  175. }
  176. </script>