SetHostReserveResource.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{ title }}</div>
  4. <div slot="body">
  5. <a-alert class="mb-2" type="warning">
  6. <template v-slot:message>{{$t('compute.text_560')}}</template>
  7. </a-alert>
  8. <dialog-selected-tips :name="$t('dictionary.host')" :count="params.data.length" :action="title" />
  9. <dialog-table :data="params.data" :columns="columns" />
  10. <a-form :form="form.fc" layout="inline" hideRequiredMark>
  11. <reserve-resource :decorators="decorators" :label="$t('compute.each_reserved_passthrough')" />
  12. </a-form>
  13. </div>
  14. <div slot="footer">
  15. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  16. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  17. </div>
  18. </base-dialog>
  19. </template>
  20. <script>
  21. import { getIsolatedDeviceCountColumns } from '../utils/columns'
  22. import { sizestr } from '@/utils/utils'
  23. import DialogMixin from '@/mixins/dialog'
  24. import WindowsMixin from '@/mixins/windows'
  25. import {
  26. getNameDescriptionTableColumn,
  27. } from '@/utils/common/tableColumn'
  28. import ReserveResource from '@Compute/sections/ReserveResource'
  29. export default {
  30. name: 'SetHostReserveResourceDialog',
  31. components: {
  32. ReserveResource,
  33. },
  34. mixins: [DialogMixin, WindowsMixin],
  35. data () {
  36. const initValue = this.params.data[0].reserved_resource_for_gpu
  37. const getRsVal = (val) => {
  38. return Math.ceil(val / this.params.data[0].isolated_device_count)
  39. }
  40. return {
  41. title: this.$t('compute.setup_passthrough_reserve'),
  42. loading: false,
  43. form: {
  44. fc: this.$form.createForm(this),
  45. },
  46. decorators: {
  47. cpu: [
  48. 'cpu',
  49. {
  50. initialValue: getRsVal(initValue.reserved_cpu),
  51. rules: [
  52. { required: true, message: ' ' },
  53. ],
  54. },
  55. ],
  56. memory: [
  57. 'memory',
  58. {
  59. initialValue: getRsVal(initValue.reserved_memory / 1024),
  60. rules: [
  61. { required: true, message: ' ' },
  62. ],
  63. },
  64. ],
  65. disk: [
  66. 'disk',
  67. {
  68. initialValue: getRsVal(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, 'host-detail') }>{ row.name }</side-page-trigger>
  82. )
  83. },
  84. }),
  85. getIsolatedDeviceCountColumns(),
  86. {
  87. field: '',
  88. title: this.$t('compute.text_501'),
  89. minWidth: 100,
  90. showOverflow: 'title',
  91. slots: {
  92. default: ({ row }, h) => {
  93. const rs = row.reserved_resource_for_gpu || {}
  94. const ret = []
  95. if (rs.reserved_cpu) {
  96. const config = rs.reserved_cpu + 'C' + (rs.reserved_memory ? sizestr(rs.reserved_memory, 'M', 1024) : '') + (rs.reserved_storage ? sizestr(rs.reserved_storage, 'M', 1024) : '')
  97. return ret.concat(<div class='text-truncate' style={{ color: '#53627C' }}>{ config }</div>)
  98. }
  99. return ret
  100. },
  101. },
  102. },
  103. ],
  104. }
  105. },
  106. created () {
  107. },
  108. methods: {
  109. validateForm () {
  110. return new Promise((resolve, reject) => {
  111. this.form.fc.validateFields((err, values) => {
  112. if (!err) {
  113. resolve(values)
  114. } else {
  115. reject(err)
  116. }
  117. })
  118. })
  119. },
  120. doSubmit (data) {
  121. const ids = this.params.data.map((item) => { return item.id })
  122. return new this.$Manager('hosts').batchPerformAction({
  123. ids,
  124. action: 'set-reserved-resource-for-isolated-device',
  125. data: {
  126. reserved_cpu: data.cpu,
  127. reserved_memory: data.memory * 1024,
  128. reserved_storage: data.disk * 1024,
  129. },
  130. })
  131. },
  132. async handleConfirm () {
  133. this.loading = true
  134. try {
  135. const values = await this.validateForm()
  136. this.loading = true
  137. await this.doSubmit(values)
  138. this.loading = false
  139. this.params.refresh()
  140. this.cancelDialog()
  141. } catch (error) {
  142. this.loading = false
  143. }
  144. },
  145. handleOpenSidepage (row, tab) {
  146. this.initSidePageTab(tab)
  147. this.sidePageTriggerHandle(this, 'HostSidePage', {
  148. id: row.id,
  149. resource: 'hosts',
  150. getParams: this.getParam,
  151. }, {
  152. list: this.list,
  153. })
  154. },
  155. },
  156. }
  157. </script>