DriverUpdateDialog.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{$t('compute.disk.change_driver')}}</div>
  4. <div slot="body">
  5. <a-alert :message="$t('compute.driver_exchange_tip')" type="warning" style="margin-bottom: 30px" />
  6. <a-form
  7. :form="form.fc" v-bind="formItemLayout" hideRequiredMark>
  8. <dialog-table :data="dataList" :columns="columns" />
  9. <a-form-item label="SSD" :extra="$t('compute.disk.ssd_extra')">
  10. <a-switch v-model="is_ssd" />
  11. </a-form-item>
  12. <a-form-item :label="$t('compute.cache_mode')">
  13. <a-select v-decorator="decorators.cache_mode">
  14. <a-select-option v-for="item in cacheModesOpts" :key="item.value">
  15. {{item.label}}
  16. </a-select-option>
  17. </a-select>
  18. </a-form-item>
  19. <a-form-item :label="$t('compute.text_634')">
  20. <a-select v-decorator="decorators.driver">
  21. <a-select-option v-for="item in driversOpts" :key="item.value">
  22. {{item.label}}
  23. </a-select-option>
  24. </a-select>
  25. </a-form-item>
  26. </a-form>
  27. </div>
  28. <div slot="footer">
  29. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  30. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  31. </div>
  32. </base-dialog>
  33. </template>
  34. <script>
  35. import { mapGetters } from 'vuex'
  36. import { getNameDescriptionTableColumn } from '@/utils/common/tableColumn'
  37. import i18n from '@/locales'
  38. import DialogMixin from '@/mixins/dialog'
  39. import WindowsMixin from '@/mixins/windows'
  40. const diskTypeMap = {
  41. sys: {
  42. label: i18n.t('compute.text_49'),
  43. value: 'sys',
  44. },
  45. data: {
  46. label: i18n.t('compute.text_50'),
  47. value: 'data',
  48. },
  49. }
  50. export default {
  51. name: 'DiskDriverUpdateDialog',
  52. mixins: [DialogMixin, WindowsMixin],
  53. data () {
  54. return {
  55. loading: false,
  56. form: {
  57. fc: this.$form.createForm(this),
  58. fd: {},
  59. },
  60. dataList: [],
  61. decorators: {
  62. driver: [
  63. 'driver',
  64. {
  65. rules: [
  66. { required: true, message: this.$t('compute.driver.select_tip') },
  67. ],
  68. },
  69. ],
  70. cache_mode: [
  71. 'cache_mode',
  72. {
  73. rules: [
  74. { required: false, message: this.$t('compute.disk.cache_mode.select_tip') },
  75. ],
  76. },
  77. ],
  78. },
  79. is_ssd: false,
  80. formItemLayout: {
  81. wrapperCol: {
  82. span: 21,
  83. },
  84. labelCol: {
  85. span: 3,
  86. },
  87. },
  88. cacheModesOpts: [
  89. { label: 'none', value: 'none' },
  90. { label: 'writethrough', value: 'writethrough' },
  91. { label: 'writeback', value: 'writeback' },
  92. ],
  93. columns: [
  94. getNameDescriptionTableColumn({
  95. onManager: this.onManager,
  96. field: 'disk',
  97. hideField: true,
  98. formRules: [
  99. { required: true, message: i18n.t('compute.text_210') },
  100. { validator: this.$validate('resourceCreateName') },
  101. ],
  102. slotCallback: row => {
  103. return (
  104. <side-page-trigger onTrigger={ () => this.handleOpenSidepage(row) }>{ row.disk }</side-page-trigger>
  105. )
  106. },
  107. }),
  108. {
  109. title: this.$t('dictionary.server'),
  110. field: 'server',
  111. },
  112. {
  113. title: this.$t('compute.text_381'),
  114. formatter: ({ row }) => {
  115. return this.getDiskType(row.disk_type)
  116. },
  117. },
  118. ],
  119. }
  120. },
  121. computed: {
  122. ...mapGetters(['isAdminMode', 'isDomainMode', 'scope']),
  123. driversOpts () {
  124. if (this.is_ssd) {
  125. return [{ label: 'scsi', value: 'scsi' }]
  126. }
  127. return [
  128. { label: 'virtio', value: 'virtio' },
  129. { label: 'ide', value: 'ide' },
  130. { label: 'scsi', value: 'scsi' },
  131. { label: 'pvscsi', value: 'pvscsi' },
  132. ]
  133. },
  134. },
  135. watch: {
  136. is_ssd: {
  137. handler: function (val) {
  138. if (val) {
  139. this.form.fc.setFieldsValue({
  140. driver: 'scsi',
  141. })
  142. }
  143. },
  144. },
  145. },
  146. created () {
  147. this.fetchDrivers()
  148. },
  149. methods: {
  150. async fetchDrivers () {
  151. const { guests, id: disk_id, is_ssd } = this.params.data[0]
  152. const { id } = guests[0]
  153. if (id) {
  154. const drivers = await new this.$Manager('guestdisks', 'v2').list({ params: { server: id, scope: this.scope } })
  155. const { data = [] } = drivers.data
  156. const current = data.filter(item => {
  157. return item.disk_id === disk_id
  158. })
  159. if (current && current[0]) {
  160. const driver = current[0].driver
  161. this.form.fd = current[0]
  162. this.dataList = current
  163. this.form.fc.setFieldsValue({
  164. driver,
  165. cache_mode: current[0].cache_mode,
  166. })
  167. this.is_ssd = driver !== 'scsi' ? false : is_ssd
  168. }
  169. }
  170. },
  171. validateForm () {
  172. return new Promise((resolve, reject) => {
  173. this.form.fc.validateFields((err, values) => {
  174. if (!err) {
  175. resolve(values)
  176. } else {
  177. reject(err)
  178. }
  179. })
  180. })
  181. },
  182. async doUpdate (data) {
  183. await new this.$Manager('guestdisks', 'v2').jointUpdate({
  184. joints: [{ resource: 'servers', id: data.server }, { resource: 'disks', id: data.disk }],
  185. data: {
  186. driver: data.driver,
  187. cache_mode: data.cache_mode,
  188. },
  189. })
  190. await this.params.onManager('update', {
  191. id: data.disk,
  192. managerArgs: {
  193. data: {
  194. is_ssd: data.is_ssd,
  195. },
  196. },
  197. })
  198. },
  199. async handleConfirm () {
  200. this.loading = true
  201. try {
  202. const values = await this.validateForm()
  203. this.loading = true
  204. const params = {
  205. driver: values.driver,
  206. server: this.form.fd.guest_id,
  207. disk: this.form.fd.disk_id,
  208. cache_mode: values.cache_mode,
  209. is_ssd: this.is_ssd,
  210. }
  211. if (!params.server || !params.disk) {
  212. this.loading = false
  213. return
  214. }
  215. this.doUpdate(params)
  216. this.loading = false
  217. this.$message.success(this.$t('common.success'))
  218. this.cancelDialog()
  219. } catch (error) {
  220. this.loading = false
  221. }
  222. },
  223. getDiskType (type) {
  224. return diskTypeMap[type]?.label || type
  225. },
  226. },
  227. }
  228. </script>
  229. <style scoped>
  230. .text-box{
  231. width: 100%;
  232. min-height: 32px;
  233. border: 1px solid #e8e8e8;
  234. padding: 0 11px;
  235. line-height: 32px;
  236. word-wrap: break-word;
  237. margin-top: 5px;
  238. }
  239. </style>