bfg-common 1.5.150 → 1.5.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/components/atoms/TheIcon3.vue +50 -50
  3. package/components/atoms/perPage/PerPage.vue +58 -58
  4. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  5. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  6. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  7. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  8. package/components/common/context/lib/models/interfaces.ts +31 -31
  9. package/components/common/context/recursion/RecursionNew.vue +238 -238
  10. package/components/common/diagramMain/DiagramMain.vue +897 -897
  11. package/components/common/diagramMain/Header.vue +214 -214
  12. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  13. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  14. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  15. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  16. package/components/common/pages/home/headline/Headline.vue +45 -45
  17. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  18. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  19. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  20. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  21. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  22. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  23. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  24. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  25. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  26. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  27. package/components/common/pages/packages/Packages.vue +208 -208
  28. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  29. package/components/common/readyToComplete/New.vue +66 -66
  30. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  31. package/components/common/recursionTree/RecursionTree.vue +223 -223
  32. package/components/common/select/button/ButtonDropdown.vue +108 -108
  33. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  34. package/components/common/vm/actions/add/New.vue +556 -556
  35. package/components/common/vm/actions/add/Old.vue +371 -371
  36. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  37. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  38. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  39. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  40. package/components/common/vm/actions/clone/Clone.vue +801 -801
  41. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  42. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  43. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  44. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  45. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  46. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  47. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  50. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  51. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +373 -368
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  74. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  75. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  76. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  77. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  78. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  79. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  80. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  81. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  82. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  83. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  84. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  88. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  89. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  90. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  91. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  92. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  93. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  94. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  95. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  96. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  97. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  98. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  99. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  100. package/components/common/vm/actions/common/select/storage/Storage.vue +131 -131
  101. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  102. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  103. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  104. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  105. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  106. package/components/common/wizards/vm/migrate/Migrate.vue +343 -340
  107. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  108. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  109. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  110. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  111. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  112. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  113. package/composables/productNameLocal.ts +30 -30
  114. package/composables/useAppVersion.ts +21 -21
  115. package/package.json +1 -1
  116. package/plugins/date.ts +233 -233
  117. package/public/spice-console/lib/images/bitmap.js +203 -203
  118. package/public/spice-console/network/spicechannel.js +383 -383
  119. package/store/main/mutations.ts +7 -7
  120. package/store/main/state.ts +7 -7
  121. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,340 +1,343 @@
1
- <template>
2
- <div class="migrate-vm">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="title"
8
- :localization="localization"
9
- class="migrate-vm-wizard"
10
- test-id="migrate-vm-wizard"
11
- @change-steps="onChangeSteps"
12
- @hide="onHideModal"
13
- @submit="onFinish"
14
- >
15
- <template #description="{ selectedStep }">
16
- <div class="flex items-center justify-between">
17
- <h2 class="custom-sub-title">
18
- {{ selectedStep.subTitle }}
19
- </h2>
20
- <common-wizards-vm-migrate-vm-origin
21
- v-if="props.vmOrigin"
22
- :vm-origin="props.vmOrigin"
23
- />
24
- </div>
25
- </template>
26
- <template #modalBody="{ selectedStep }">
27
- <common-pages-scheduled-tasks-modals-common-new-task-form
28
- v-if="selectedStep.id === dynamicSteps.schedulingOptions"
29
- v-model="modelSchedulerTask"
30
- :target="selectedVirtualMachine"
31
- />
32
-
33
- <common-wizards-vm-migrate-select-type
34
- v-if="selectedStep.id === dynamicSteps.selectMigrationType"
35
- v-model="form.migrate_type"
36
- :project="props.project"
37
- />
38
-
39
- <common-wizards-vm-migrate-select-target-server
40
- v-if="selectedStep.id === dynamicSteps.selectTargetVCenterSer"
41
- v-model="form.target_server"
42
- v-model:connect-server="isConnectSourceServer"
43
- :wizard="wizard"
44
- />
45
-
46
- <common-wizards-vm-migrate-select-compute-resource
47
- v-show="selectedStep.id === dynamicSteps.selectComputeResource"
48
- v-model="form"
49
- :alert-messages="alertMessages[3]"
50
- :get-compute-resource-data="props.getComputeResourceData"
51
- :compute-resource-data="props.computeResourceTableData"
52
- :compute-resource-tree="props.computeResourceTree"
53
- @hide-alert="onHideAlert"
54
- />
55
-
56
- <common-wizards-vm-migrate-select-storage
57
- v-show="selectedStep.id === dynamicSteps.selectStorage"
58
- v-model="form"
59
- :alert-messages="alertMessages[4]"
60
- :get-datastore-table-func="props.getDatastoreTableFunc"
61
- :datastore="props.datastore"
62
- :connected-storage-id-default="connectedStorageIdOnVm"
63
- :configure-per-disks="props.configurePerDisks"
64
- @hide-alert="onHideAlert"
65
- />
66
-
67
- <common-wizards-vm-migrate-select-network
68
- v-show="selectedStep.id === dynamicSteps.selectNetworks"
69
- v-model="form.network"
70
- :vm-info="props.vmInfo"
71
- :networks="props.networks"
72
- />
73
-
74
- <common-wizards-vm-migrate-select-priority
75
- v-if="selectedStep.id === dynamicSteps.migrationStrategy"
76
- v-model="form.vMotion_priority"
77
- :vm-state="props.vmState"
78
- />
79
-
80
- <common-ready-to-complete
81
- v-if="selectedStep.id === dynamicSteps.readyComplete"
82
- :data="dataReadyView"
83
- />
84
- </template>
85
- </atoms-wizard>
86
- </div>
87
- </template>
88
-
89
- <script setup lang="ts">
90
- import type {
91
- UI_I_WizardStep,
92
- UI_I_ValidationReturn,
93
- } from '~/components/atoms/wizard/lib/models/interfaces'
94
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
95
- import {
96
- dynamicSteps,
97
- stepsFunc,
98
- stepsSchemeInitial,
99
- } from '~/components/common/wizards/vm/migrate/lib/config/steps'
100
- import type { UI_I_Localization } from '~/lib/models/interfaces'
101
- import type { UI_T_Project } from '~/lib/models/types'
102
- import type {
103
- UI_I_MigrateFormLocal,
104
- UI_I_ChangeStepsSchemes,
105
- } from '~/components/common/wizards/vm/migrate/lib/models/interfaces'
106
- import type { UI_T_VmMigrateType } from '~/components/common/wizards/vm/migrate/select/type/lib/models/types'
107
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
108
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
109
- import type { UI_I_VmSettings } from '~/lib/models/store/vm/interfaces'
110
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
111
- import type { UI_I_StorageConfigurePerDiskItem } from '~/components/common/wizards/vm/migrate/select/storage/configure/disk/table/lib/models/interfaces'
112
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
113
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
114
- import type { UI_I_VmOrigin } from '~/components/common/wizards/vm/migrate/vmOrigin/lib/models/interfaces'
115
- import { constructDataReadyViewFunc } from '~/components/common/wizards/vm/migrate/lib/config/constructDataReady'
116
- import * as validation from '~/components/common/wizards/vm/migrate/lib/validations'
117
-
118
- const props = withDefaults(
119
- defineProps<{
120
- project: UI_T_Project
121
- isScheduledTasks: boolean
122
- isEditScheduledTasks: boolean
123
- vmSettings: UI_I_VmSettings | null
124
- vmName: string
125
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
126
- getComputeResourceData: (payload: UI_I_TablePayload) => Promise<void>
127
- datastore: UI_I_DatastoreTableItem[]
128
- configurePerDisks: UI_I_StorageConfigurePerDiskItem[]
129
- computeResourceTableData?: any
130
- computeResourceTree?: UI_I_TreeNode | null
131
- selectedVirtualMachine?: string
132
- vmState?: number
133
- vmInfo?: any | null
134
- networks?: any
135
- vmOrigin?: UI_I_VmOrigin | null
136
- }>(),
137
- {
138
- computeResourceTree: null,
139
- vmOrigin: null,
140
- }
141
- )
142
- const emits = defineEmits<{
143
- (event: 'finish', value: UI_I_MigrateFormLocal): void
144
- (event: 'get-networks', value: string): void
145
- (event: 'hide'): void
146
- }>()
147
- const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
148
- 'schedulerForm',
149
- { required: true }
150
- )
151
-
152
- const localization = computed<UI_I_Localization>(() => useLocal())
153
-
154
- const wizard: Wizard = new Wizard(
155
- stepsFunc(localization.value, props.isScheduledTasks),
156
- stepsSchemeInitial
157
- )
158
-
159
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
160
- const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
161
-
162
- const title = computed<string>(() => {
163
- const { scheduleNewTasks, scheduleTaskEdit, migrate } =
164
- localization.value.common
165
- let result = migrate
166
- if (props.isScheduledTasks) {
167
- const schedulerMode = props.isEditScheduledTasks
168
- ? scheduleTaskEdit
169
- : scheduleNewTasks
170
-
171
- result = `${schedulerMode} (${migrate})`
172
- }
173
-
174
- return result
175
- })
176
-
177
- const isConnectSourceServer = ref<boolean>(false)
178
- const form = ref<UI_I_MigrateFormLocal>({
179
- migrate_type: props.project === 'procurator' ? 'storage' : 'resource',
180
- disk_format: 0,
181
- storage: null,
182
- configure: {
183
- type: 'batch-configure',
184
- disks: [],
185
- },
186
- target_server: {
187
- fqdn: '',
188
- user: '',
189
- password: '',
190
- },
191
- network: {},
192
- resource: {
193
- selectedNode: null,
194
- host: null,
195
- cluster: null,
196
- resourcePool: null,
197
- vApps: null,
198
- },
199
- vMotion_priority:
200
- props.vmState === 2 ? 'live' : props.vmState === 1 ? 'offline' : '',
201
- })
202
-
203
-
204
- const validationFunc = async (
205
- value: UI_I_WizardStep[],
206
- currentStep: UI_I_WizardStep,
207
- nextStep: UI_I_WizardStep
208
- ): Promise<UI_I_ValidationReturn> => {
209
- let stepHasError = false
210
-
211
- if (
212
- wizard.isValidateForStep(
213
- dynamicSteps.selectComputeResource,
214
- currentStep.id,
215
- nextStep.id
216
- )
217
- ) {
218
- const nameValidation = await validation.checkSelectedResourceSync(
219
- localization.value,
220
- form.value.resource,
221
- wizard,
222
- value
223
- )
224
-
225
- value = nameValidation.newValue
226
-
227
- stepHasError = nameValidation.stepHasError
228
- }
229
-
230
- if (
231
- wizard.isValidateForStep(
232
- dynamicSteps.selectStorage,
233
- currentStep.id,
234
- nextStep.id
235
- )
236
- ) {
237
- const nameValidation = await validation.checkSelectedDatastoreSync(
238
- localization.value,
239
- form.value.storage,
240
- wizard,
241
- value
242
- )
243
-
244
- value = nameValidation.newValue
245
-
246
- stepHasError = nameValidation.stepHasError
247
- }
248
-
249
- return {
250
- newValue: value,
251
- stepHasError,
252
- }
253
- }
254
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> =>
255
- wizard.changeSteps(value, validationFunc)
256
-
257
- // Choosing Scheme
258
- watch(
259
- () => form.value.migrate_type,
260
- (newValue: UI_T_VmMigrateType) => {
261
- const schemes: UI_I_ChangeStepsSchemes = {
262
- procurator: {
263
- storage: props.isScheduledTasks ? 1 : 0,
264
- },
265
- sphere: {
266
- storage: props.isScheduledTasks ? 1 : 0,
267
- resource: props.isScheduledTasks ? 3 : 2,
268
- 'resource-storage': 4,
269
- server: 5,
270
- },
271
- }
272
-
273
- const projectSchemes = schemes[props.project]
274
-
275
- if (projectSchemes && projectSchemes[newValue] !== undefined) {
276
- wizard.changeScheme(projectSchemes[newValue] as number)
277
- }
278
- },
279
- { deep: true, immediate: true }
280
- )
281
- // Get networks
282
- watch(
283
- () => form.value.resource.host,
284
- (newValue) => {
285
- emits('get-networks', newValue.id)
286
- }
287
- )
288
-
289
- watch(
290
- modelSchedulerTask,
291
- (newValue: UI_I_ScheduleNewTasksForm) => {
292
- if (props.isScheduledTasks) wizard.setDisabledNextButton(newValue.isValid)
293
- },
294
- { immediate: true, deep: true }
295
- )
296
-
297
- const loading = ref<boolean>(false)
298
-
299
- const connectedStorageIdOnVm = computed<string>(
300
- () => props.vmSettings?.storage.id || ''
301
- )
302
-
303
- const dataReadyView = computed<UI_I_TableInfoItem>(() =>
304
- constructDataReadyViewFunc(props.vmName, form.value)
305
- )
306
- const onFinish = (): void => {
307
- loading.value = true
308
- emits('finish', form.value)
309
- loading.value = false
310
- }
311
-
312
- const onHideModal = (): void => {
313
- emits('hide')
314
- }
315
-
316
- const onHideAlert = (stepId: number): void => {
317
- wizard.hideAlertMessagesByStepId(stepId)
318
- }
319
- </script>
320
-
321
- <style scoped lang="scss">
322
- @import 'assets/scss/common/mixins.scss';
323
- .migrate-vm {
324
- .custom-sub-title {
325
- font-weight: 400;
326
- font-size: 13px;
327
- line-height: inherit;
328
- color: var(--add-vm-context-sub-title);
329
- }
330
-
331
- :deep(.modal-body) {
332
- height: inherit;
333
- @include flex($dir: column);
334
-
335
- .content-heading > div {
336
- width: 100%;
337
- }
338
- }
339
- }
340
- </style>
1
+ <template>
2
+ <div class="migrate-vm">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="title"
8
+ :localization="localization"
9
+ class="migrate-vm-wizard"
10
+ test-id="migrate-vm-wizard"
11
+ @change-steps="onChangeSteps"
12
+ @hide="onHideModal"
13
+ @submit="onFinish"
14
+ >
15
+ <template #description="{ selectedStep }">
16
+ <div class="flex items-center justify-between">
17
+ <h2 class="custom-sub-title">
18
+ {{ selectedStep.subTitle }}
19
+ </h2>
20
+ <common-wizards-vm-migrate-vm-origin
21
+ v-if="props.vmOrigin"
22
+ :vm-origin="props.vmOrigin"
23
+ />
24
+ </div>
25
+ </template>
26
+ <template #modalBody="{ selectedStep }">
27
+ <common-pages-scheduled-tasks-modals-common-new-task-form
28
+ v-if="selectedStep.id === dynamicSteps.schedulingOptions"
29
+ v-model="modelSchedulerTask"
30
+ :target="selectedVirtualMachine"
31
+ />
32
+
33
+ <common-wizards-vm-migrate-select-type
34
+ v-if="selectedStep.id === dynamicSteps.selectMigrationType"
35
+ v-model="form.migrate_type"
36
+ :project="props.project"
37
+ />
38
+
39
+ <common-wizards-vm-migrate-select-target-server
40
+ v-if="selectedStep.id === dynamicSteps.selectTargetVCenterSer"
41
+ v-model="form.target_server"
42
+ v-model:connect-server="isConnectSourceServer"
43
+ :wizard="wizard"
44
+ />
45
+
46
+ <common-wizards-vm-migrate-select-compute-resource
47
+ v-if="isSphere"
48
+ v-show="selectedStep.id === dynamicSteps.selectComputeResource"
49
+ v-model="form"
50
+ :alert-messages="alertMessages[3]"
51
+ :get-compute-resource-data="props.getComputeResourceData"
52
+ :compute-resource-data="props.computeResourceTableData"
53
+ :compute-resource-tree="props.computeResourceTree"
54
+ @hide-alert="onHideAlert"
55
+ />
56
+
57
+ <common-wizards-vm-migrate-select-storage
58
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
59
+ v-model="form"
60
+ :alert-messages="alertMessages[4]"
61
+ :get-datastore-table-func="props.getDatastoreTableFunc"
62
+ :datastore="props.datastore"
63
+ :connected-storage-id-default="connectedStorageIdOnVm"
64
+ :configure-per-disks="props.configurePerDisks"
65
+ @hide-alert="onHideAlert"
66
+ />
67
+
68
+ <common-wizards-vm-migrate-select-network
69
+ v-if="isSphere"
70
+ v-show="selectedStep.id === dynamicSteps.selectNetworks"
71
+ v-model="form.network"
72
+ :vm-info="props.vmInfo"
73
+ :networks="props.networks"
74
+ />
75
+
76
+ <common-wizards-vm-migrate-select-priority
77
+ v-if="selectedStep.id === dynamicSteps.migrationStrategy"
78
+ v-model="form.vMotion_priority"
79
+ :vm-state="props.vmState"
80
+ />
81
+
82
+ <common-ready-to-complete
83
+ v-if="selectedStep.id === dynamicSteps.readyComplete"
84
+ :data="dataReadyView"
85
+ />
86
+ </template>
87
+ </atoms-wizard>
88
+ </div>
89
+ </template>
90
+
91
+ <script setup lang="ts">
92
+ import type {
93
+ UI_I_WizardStep,
94
+ UI_I_ValidationReturn,
95
+ } from '~/components/atoms/wizard/lib/models/interfaces'
96
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
97
+ import {
98
+ dynamicSteps,
99
+ stepsFunc,
100
+ stepsSchemeInitial,
101
+ } from '~/components/common/wizards/vm/migrate/lib/config/steps'
102
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
103
+ import type { UI_T_Project } from '~/lib/models/types'
104
+ import type {
105
+ UI_I_MigrateFormLocal,
106
+ UI_I_ChangeStepsSchemes,
107
+ } from '~/components/common/wizards/vm/migrate/lib/models/interfaces'
108
+ import type { UI_T_VmMigrateType } from '~/components/common/wizards/vm/migrate/select/type/lib/models/types'
109
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
110
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
111
+ import type { UI_I_VmSettings } from '~/lib/models/store/vm/interfaces'
112
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
113
+ import type { UI_I_StorageConfigurePerDiskItem } from '~/components/common/wizards/vm/migrate/select/storage/configure/disk/table/lib/models/interfaces'
114
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
115
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
116
+ import type { UI_I_VmOrigin } from '~/components/common/wizards/vm/migrate/vmOrigin/lib/models/interfaces'
117
+ import { constructDataReadyViewFunc } from '~/components/common/wizards/vm/migrate/lib/config/constructDataReady'
118
+ import * as validation from '~/components/common/wizards/vm/migrate/lib/validations'
119
+
120
+ const props = withDefaults(
121
+ defineProps<{
122
+ project: UI_T_Project
123
+ isScheduledTasks: boolean
124
+ isEditScheduledTasks: boolean
125
+ vmSettings: UI_I_VmSettings | null
126
+ vmName: string
127
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
128
+ getComputeResourceData: (payload: UI_I_TablePayload) => Promise<void>
129
+ datastore: UI_I_DatastoreTableItem[]
130
+ configurePerDisks: UI_I_StorageConfigurePerDiskItem[]
131
+ computeResourceTableData?: any
132
+ computeResourceTree?: UI_I_TreeNode | null
133
+ selectedVirtualMachine?: string
134
+ vmState?: number
135
+ vmInfo?: any | null
136
+ networks?: any
137
+ vmOrigin?: UI_I_VmOrigin | null
138
+ }>(),
139
+ {
140
+ computeResourceTree: null,
141
+ vmOrigin: null,
142
+ }
143
+ )
144
+ const emits = defineEmits<{
145
+ (event: 'finish', value: UI_I_MigrateFormLocal): void
146
+ (event: 'get-networks', value: string): void
147
+ (event: 'hide'): void
148
+ }>()
149
+ const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
150
+ 'schedulerForm',
151
+ { required: true }
152
+ )
153
+
154
+ const localization = computed<UI_I_Localization>(() => useLocal())
155
+
156
+ const isSphere = ref<boolean>(props.project === 'sphere')
157
+
158
+ const wizard: Wizard = new Wizard(
159
+ stepsFunc(localization.value, props.isScheduledTasks),
160
+ stepsSchemeInitial
161
+ )
162
+
163
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
164
+ const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
165
+
166
+ const title = computed<string>(() => {
167
+ const { scheduleNewTasks, scheduleTaskEdit, migrate } =
168
+ localization.value.common
169
+ let result = migrate
170
+ if (props.isScheduledTasks) {
171
+ const schedulerMode = props.isEditScheduledTasks
172
+ ? scheduleTaskEdit
173
+ : scheduleNewTasks
174
+
175
+ result = `${schedulerMode} (${migrate})`
176
+ }
177
+
178
+ return result
179
+ })
180
+
181
+ const isConnectSourceServer = ref<boolean>(false)
182
+ const form = ref<UI_I_MigrateFormLocal>({
183
+ migrate_type: props.project === 'procurator' ? 'storage' : 'resource',
184
+ disk_format: 0,
185
+ storage: null,
186
+ configure: {
187
+ type: 'batch-configure',
188
+ disks: [],
189
+ },
190
+ target_server: {
191
+ fqdn: '',
192
+ user: '',
193
+ password: '',
194
+ },
195
+ network: {},
196
+ resource: {
197
+ selectedNode: null,
198
+ host: null,
199
+ cluster: null,
200
+ resourcePool: null,
201
+ vApps: null,
202
+ },
203
+ vMotion_priority:
204
+ props.vmState === 2 ? 'live' : props.vmState === 1 ? 'offline' : '',
205
+ })
206
+
207
+ const validationFunc = async (
208
+ value: UI_I_WizardStep[],
209
+ currentStep: UI_I_WizardStep,
210
+ nextStep: UI_I_WizardStep
211
+ ): Promise<UI_I_ValidationReturn> => {
212
+ let stepHasError = false
213
+
214
+ if (
215
+ wizard.isValidateForStep(
216
+ dynamicSteps.selectComputeResource,
217
+ currentStep.id,
218
+ nextStep.id
219
+ )
220
+ ) {
221
+ const nameValidation = await validation.checkSelectedResourceSync(
222
+ localization.value,
223
+ form.value.resource,
224
+ wizard,
225
+ value
226
+ )
227
+
228
+ value = nameValidation.newValue
229
+
230
+ stepHasError = nameValidation.stepHasError
231
+ }
232
+
233
+ if (
234
+ wizard.isValidateForStep(
235
+ dynamicSteps.selectStorage,
236
+ currentStep.id,
237
+ nextStep.id
238
+ )
239
+ ) {
240
+ const nameValidation = await validation.checkSelectedDatastoreSync(
241
+ localization.value,
242
+ form.value.storage,
243
+ wizard,
244
+ value
245
+ )
246
+
247
+ value = nameValidation.newValue
248
+
249
+ stepHasError = nameValidation.stepHasError
250
+ }
251
+
252
+ return {
253
+ newValue: value,
254
+ stepHasError,
255
+ }
256
+ }
257
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> =>
258
+ wizard.changeSteps(value, validationFunc)
259
+
260
+ // Choosing Scheme
261
+ watch(
262
+ () => form.value.migrate_type,
263
+ (newValue: UI_T_VmMigrateType) => {
264
+ const schemes: UI_I_ChangeStepsSchemes = {
265
+ procurator: {
266
+ storage: props.isScheduledTasks ? 1 : 0,
267
+ },
268
+ sphere: {
269
+ storage: props.isScheduledTasks ? 1 : 0,
270
+ resource: props.isScheduledTasks ? 3 : 2,
271
+ 'resource-storage': 4,
272
+ server: 5,
273
+ },
274
+ }
275
+
276
+ const projectSchemes = schemes[props.project]
277
+
278
+ if (projectSchemes && projectSchemes[newValue] !== undefined) {
279
+ wizard.changeScheme(projectSchemes[newValue] as number)
280
+ }
281
+ },
282
+ { deep: true, immediate: true }
283
+ )
284
+ // Get networks
285
+ watch(
286
+ () => form.value.resource.host,
287
+ (newValue) => {
288
+ emits('get-networks', newValue.id)
289
+ }
290
+ )
291
+
292
+ watch(
293
+ modelSchedulerTask,
294
+ (newValue: UI_I_ScheduleNewTasksForm) => {
295
+ if (props.isScheduledTasks) wizard.setDisabledNextButton(newValue.isValid)
296
+ },
297
+ { immediate: true, deep: true }
298
+ )
299
+
300
+ const loading = ref<boolean>(false)
301
+
302
+ const connectedStorageIdOnVm = computed<string>(
303
+ () => props.vmSettings?.storage.id || ''
304
+ )
305
+
306
+ const dataReadyView = computed<UI_I_TableInfoItem>(() =>
307
+ constructDataReadyViewFunc(props.vmName, form.value)
308
+ )
309
+ const onFinish = (): void => {
310
+ loading.value = true
311
+ emits('finish', form.value)
312
+ loading.value = false
313
+ }
314
+
315
+ const onHideModal = (): void => {
316
+ emits('hide')
317
+ }
318
+
319
+ const onHideAlert = (stepId: number): void => {
320
+ wizard.hideAlertMessagesByStepId(stepId)
321
+ }
322
+ </script>
323
+
324
+ <style scoped lang="scss">
325
+ @import 'assets/scss/common/mixins.scss';
326
+ .migrate-vm {
327
+ .custom-sub-title {
328
+ font-weight: 400;
329
+ font-size: 13px;
330
+ line-height: inherit;
331
+ color: var(--add-vm-context-sub-title);
332
+ }
333
+
334
+ :deep(.modal-body) {
335
+ height: inherit;
336
+ @include flex($dir: column);
337
+
338
+ .content-heading > div {
339
+ width: 100%;
340
+ }
341
+ }
342
+ }
343
+ </style>