SetReserveResource.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{ title }}</div>
  4. <div slot="body">
  5. <dialog-selected-tips :name="$t('dictionary.gpu')" :count="params.data.length" :action="title" />
  6. <dialog-table :data="params.data" :columns="columns" />
  7. <a-form :form="form.fc" layout="inline" hideRequiredMark>
  8. <reserve-resource :decorators="decorators" />
  9. </a-form>
  10. </div>
  11. <div slot="footer">
  12. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  13. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  14. </div>
  15. </base-dialog>
  16. </template>
  17. <script>
  18. import {
  19. getReserveResourceColumn,
  20. } from '../utils/columns'
  21. import DialogMixin from '@/mixins/dialog'
  22. import WindowsMixin from '@/mixins/windows'
  23. import {
  24. getNameDescriptionTableColumn,
  25. getCopyWithContentTableColumn,
  26. } from '@/utils/common/tableColumn'
  27. import ReserveResource from '@Compute/sections/ReserveResource'
  28. export default {
  29. name: 'SetReserveResourceDialog',
  30. components: {
  31. ReserveResource,
  32. },
  33. mixins: [DialogMixin, WindowsMixin],
  34. data () {
  35. const DEVICE_MAP = {
  36. '10de': 'nvidia',
  37. 1002: 'amd',
  38. }
  39. const initValue = this.params.data[0]
  40. return {
  41. title: this.$t('compute.text_490'),
  42. loading: false,
  43. form: {
  44. fc: this.$form.createForm(this),
  45. },
  46. decorators: {
  47. cpu: [
  48. 'cpu',
  49. {
  50. initialValue: initValue.reserved_cpu,
  51. rules: [
  52. { required: true, message: ' ' },
  53. ],
  54. },
  55. ],
  56. memory: [
  57. 'memory',
  58. {
  59. initialValue: initValue.reserved_memory / 1024,
  60. rules: [
  61. { required: true, message: ' ' },
  62. ],
  63. },
  64. ],
  65. disk: [
  66. 'disk',
  67. {
  68. initialValue: initValue.reserved_storage / 1024,
  69. rules: [
  70. { required: true, message: ' ' },
  71. ],
  72. },
  73. ],
  74. },
  75. columns: [
  76. getNameDescriptionTableColumn({
  77. onManager: this.params.onManager,
  78. hideField: true,
  79. slotCallback: row => {
  80. return (
  81. <side-page-trigger onTrigger={ () => this.handleOpenSidepage(row, 'gpu-detail') }>{ row.name }</side-page-trigger>
  82. )
  83. },
  84. }),
  85. {
  86. field: 'model',
  87. title: this.$t('compute.text_482'),
  88. minWidth: 120,
  89. showOverflow: 'ellipsis',
  90. slots: {
  91. default: ({ row }, h) => {
  92. const device = row.vendor_device_id.split(':')[0]
  93. if (!device) {
  94. return row.model
  95. }
  96. return [
  97. <div class='d-flex'>
  98. <span class='text-truncate'>{ row.model }</span>
  99. <icon class="ml-1" style="line-height: 24px" type={ DEVICE_MAP[device] } />
  100. </div>,
  101. ]
  102. },
  103. },
  104. },
  105. getCopyWithContentTableColumn({
  106. field: 'host',
  107. title: this.$t('compute.text_484'),
  108. hideField: true,
  109. slotCallback: row => row.host || row.host_id,
  110. }),
  111. getReserveResourceColumn(),
  112. ],
  113. }
  114. },
  115. created () {
  116. },
  117. methods: {
  118. validateForm () {
  119. return new Promise((resolve, reject) => {
  120. this.form.fc.validateFields((err, values) => {
  121. if (!err) {
  122. resolve(values)
  123. } else {
  124. reject(err)
  125. }
  126. })
  127. })
  128. },
  129. doSubmit (data) {
  130. const ids = this.params.data.map((item) => item.id)
  131. return new this.$Manager('isolated_devices').batchUpdate({
  132. ids,
  133. data: {
  134. reserved_cpu: data.cpu,
  135. reserved_memory: data.memory * 1024,
  136. reserved_storage: data.disk * 1024,
  137. },
  138. })
  139. },
  140. async handleConfirm () {
  141. this.loading = true
  142. try {
  143. const values = await this.validateForm()
  144. this.loading = true
  145. await this.doSubmit(values)
  146. this.loading = false
  147. this.params.refresh()
  148. this.cancelDialog()
  149. } catch (error) {
  150. this.loading = false
  151. }
  152. },
  153. handleOpenSidepage (row, tab) {
  154. this.initSidePageTab(tab)
  155. this.sidePageTriggerHandle(this, 'GpuSidePage', {
  156. id: row.id,
  157. resource: 'isolated_devices',
  158. currentTab: 'servers-list',
  159. }, {
  160. list: this.list,
  161. })
  162. },
  163. },
  164. }
  165. </script>