SetServer.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <dialog-selected-tips :name="$t('dictionary.secgroup')" :count="params.data.length" :action="params.title" />
  6. <dialog-table :data="params.data" :columns="columns" />
  7. <a-form :form="form.fc" v-bind="formItemLayout" hideRequiredMark>
  8. <a-form-item
  9. :label="params.resourceName">
  10. <list-select
  11. v-decorator="decorators.servers"
  12. :list-props="serverListProps"
  13. :formatter="v => v.name"
  14. :placeholder="$t('compute.text_1022', [params.resourceName])"
  15. :dialog-params="{ title: params.resourceName, width: 1060 }" />
  16. </a-form-item>
  17. </a-form>
  18. </div>
  19. <div slot="footer">
  20. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  21. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  22. </div>
  23. </base-dialog>
  24. </template>
  25. <script>
  26. import * as R from 'ramda'
  27. import { mapGetters } from 'vuex'
  28. import {
  29. getNameDescriptionTableColumn,
  30. getProjectTableColumn,
  31. } from '@/utils/common/tableColumn'
  32. import DialogMixin from '@/mixins/dialog'
  33. import WindowsMixin from '@/mixins/windows'
  34. import ListSelect from '@/sections/ListSelect'
  35. import ResourceProps from '../mixins/serverListPropsForSetServer'
  36. export default {
  37. name: 'SetServerDialog',
  38. components: {
  39. ListSelect,
  40. },
  41. mixins: [DialogMixin, WindowsMixin, ResourceProps],
  42. data () {
  43. return {
  44. loading: false,
  45. scope: this.$store.getters.scope,
  46. form: {
  47. fc: this.$form.createForm(this),
  48. },
  49. decorators: {
  50. servers: [
  51. 'servers',
  52. {
  53. validateFirst: true,
  54. },
  55. ],
  56. },
  57. formItemLayout: {
  58. wrapperCol: {
  59. span: 20,
  60. },
  61. labelCol: {
  62. span: 4,
  63. },
  64. },
  65. bindServers: [],
  66. bindServersLoaded: false,
  67. defaultValue: [],
  68. }
  69. },
  70. computed: {
  71. ...mapGetters([
  72. 'isAdminMode',
  73. 'isDomainMode',
  74. 'userInfo',
  75. ]),
  76. columns () {
  77. return [
  78. getNameDescriptionTableColumn({
  79. onManager: this.onManager,
  80. hideField: true,
  81. slotCallback: row => {
  82. return (
  83. <side-page-trigger onTrigger={ () => this.handleOpenSidepage(row) }>{ row.name }</side-page-trigger>
  84. )
  85. },
  86. }),
  87. {
  88. field: 'guest_cnt',
  89. title: this.$t('compute.text_1023'),
  90. width: 80,
  91. },
  92. getProjectTableColumn(),
  93. ]
  94. },
  95. selectedResource () {
  96. return this.params.data[0]
  97. },
  98. },
  99. created () {
  100. this.fetchBindedServers()
  101. },
  102. methods: {
  103. async fetchBindedServers () {
  104. const manager = new this.$Manager('servers')
  105. try {
  106. const params = {
  107. scope: this.scope,
  108. filter: this.params.hypervisor === 'pod' ? 'hypervisor.in(pod)' : 'hypervisor.notin(container,baremetal,pod)',
  109. limit: 0,
  110. secgroup: `${this.selectedResource.id}`,
  111. }
  112. if (this.isAdminMode) {
  113. params.project_domain = this.userInfo.projectDomain
  114. delete params.scope
  115. }
  116. const { data: { data = [] } } = await manager.list({ params })
  117. this.bindServers = data
  118. this.bindServersLoaded = true
  119. this.$nextTick(() => {
  120. this.form.fc.setFieldsValue({ servers: data.map(item => item.id) })
  121. })
  122. } catch (error) {
  123. console.error(error)
  124. }
  125. },
  126. async handleConfirm () {
  127. this.loading = true
  128. try {
  129. const values = await this.form.fc.validateFields()
  130. let ids = []
  131. const bindServers = []
  132. const removeServers = []
  133. const data = {
  134. secgroup_ids: [this.selectedResource.id],
  135. }
  136. ids = JSON.parse(JSON.stringify(values.servers))
  137. this.bindServers.forEach((item, idx) => {
  138. bindServers.push(item.id)
  139. })
  140. for (var i = 0; i < bindServers.length; i++) {
  141. if (!R.includes(bindServers[i], ids)) {
  142. removeServers.push(bindServers[i])
  143. }
  144. for (var j = 0; j < ids.length; j++) {
  145. if (bindServers[i] === ids[j]) {
  146. ids.splice(j, 1)
  147. }
  148. }
  149. }
  150. if (removeServers.length > 0) {
  151. await new this.$Manager('servers').batchPerformAction({
  152. ids: removeServers,
  153. action: 'revoke-secgroup',
  154. data,
  155. })
  156. }
  157. if (ids.length > 0) {
  158. await new this.$Manager('servers').batchPerformAction({
  159. ids,
  160. action: 'add-secgroup',
  161. data,
  162. })
  163. }
  164. this.loading = false
  165. this.cancelDialog()
  166. this.params.refresh()
  167. } finally {
  168. this.loading = false
  169. }
  170. },
  171. },
  172. }
  173. </script>