CreateSnapshotDialog.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{$t('compute.disk_perform_create_snapshot')}}</div>
  4. <div slot="body">
  5. <a-alert :message="errorInfo" banner v-if="errorInfo !== ''" />
  6. <dialog-selected-tips :count="params.data.length" :action="$t('compute.disk_perform_create_snapshot')" :name="$t('dictionary.disk')" />
  7. <dialog-table :data="params.data" :columns="params.columns.slice(0, 3)" />
  8. <a-form
  9. :form="form.fc">
  10. <a-form-item :label="$t('compute.text_415')" v-bind="formItemLayout">
  11. <a-input v-decorator="decorators.name" />
  12. </a-form-item>
  13. </a-form>
  14. </div>
  15. <div slot="footer">
  16. <a-button type="primary" @click="handleConfirm" :loading="loading" :disabled="confirmDisabled">{{ $t('dialog.ok') }}</a-button>
  17. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  18. </div>
  19. </base-dialog>
  20. </template>
  21. <script>
  22. import { HYPERVISORS_MAP } from '@/constants'
  23. import DialogMixin from '@/mixins/dialog'
  24. import WindowsMixin from '@/mixins/windows'
  25. export default {
  26. name: 'DiskCreateSnapshotDialog',
  27. mixins: [DialogMixin, WindowsMixin],
  28. data () {
  29. return {
  30. loading: false,
  31. form: {
  32. fc: this.$form.createForm(this),
  33. },
  34. decorators: {
  35. name: [
  36. 'name',
  37. {
  38. validateFirst: true,
  39. rules: [
  40. { required: true, message: this.$t('compute.text_416') },
  41. { validator: this.$validate('snapshotName') },
  42. ],
  43. },
  44. ],
  45. },
  46. formItemLayout: {
  47. wrapperCol: {
  48. span: 21,
  49. },
  50. labelCol: {
  51. span: 3,
  52. },
  53. },
  54. serversOpts: [],
  55. }
  56. },
  57. computed: {
  58. errorInfo () {
  59. if (this.isKvm) {
  60. if (this.isCeph) return ''
  61. if (this.manualSnapshotCount === this.maxManualSnapshotCount) {
  62. return this.$t('compute.text_417')
  63. }
  64. return this.$t('compute.text_418', [this.manualSnapshotCount, this.maxManualSnapshotCount - this.manualSnapshotCount])
  65. }
  66. return ''
  67. },
  68. confirmDisabled () {
  69. if (!this.isKvm) return
  70. if (this.isCeph) return
  71. return this.manualSnapshotCount === this.maxManualSnapshotCount
  72. },
  73. isKvm () {
  74. return this.params.data[0].provider === HYPERVISORS_MAP.kvm.provider
  75. },
  76. isHuawei () {
  77. return this.params.data[0].provider === HYPERVISORS_MAP.huawei.provider
  78. },
  79. isCeph () {
  80. return this.params.data[0].storage_type === 'rbd'
  81. },
  82. maxManualSnapshotCount () {
  83. return this.params.data[0].max_manual_snapshot_count || 2
  84. },
  85. manualSnapshotCount () {
  86. return this.params.data[0].manual_snapshot_count || 0
  87. },
  88. },
  89. created () {
  90. const params = {
  91. details: false,
  92. disk: this.params.data[0].id,
  93. }
  94. new this.$Manager('servers').list({ params })
  95. .then((res) => {
  96. this.serversOpts = res.data.data
  97. })
  98. },
  99. methods: {
  100. validateForm () {
  101. return new Promise((resolve, reject) => {
  102. this.form.fc.validateFields((err, values) => {
  103. if (!err) {
  104. resolve(values)
  105. } else {
  106. reject(err)
  107. }
  108. })
  109. })
  110. },
  111. doCreate (data) {
  112. return new this.$Manager('snapshots').create({ data })
  113. },
  114. async handleConfirm () {
  115. this.loading = true
  116. try {
  117. let values = await this.validateForm()
  118. values = {
  119. ...values,
  120. disk: this.params.data[0].id,
  121. }
  122. this.loading = true
  123. await this.doCreate(values)
  124. this.loading = false
  125. this.params.refresh()
  126. this.cancelDialog()
  127. } catch (error) {
  128. this.loading = false
  129. }
  130. },
  131. },
  132. }
  133. </script>