bfg-common 1.4.59 → 1.4.61

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 (62) hide show
  1. package/assets/localization/local_be.json +215 -215
  2. package/assets/localization/local_en.json +215 -215
  3. package/assets/localization/local_hy.json +215 -215
  4. package/assets/localization/local_kk.json +215 -215
  5. package/assets/localization/local_ru.json +215 -215
  6. package/assets/localization/local_zh.json +215 -215
  7. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  8. package/components/common/browse/blocks/Title.vue +91 -91
  9. package/components/common/browse/blocks/info/Date.vue +21 -21
  10. package/components/common/context/recursion/Recursion.vue +86 -86
  11. package/components/common/context/recursion/RecursionNew.vue +198 -198
  12. package/components/common/context/recursion/RecursionOld.vue +212 -212
  13. package/components/common/monitor/advanced/Advanced.vue +3 -4
  14. package/components/common/monitor/advanced/GraphView.vue +1 -1
  15. package/components/common/monitor/advanced/table/Table.vue +1 -3
  16. package/components/common/monitor/advanced/tools/Tools.vue +2 -2
  17. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +2 -2
  18. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/Actions.vue +8 -9
  19. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/lib/utils/optionsActions.ts +1 -1
  20. package/components/common/monitor/advanced/tools/chartOptionsModal/actions/saveOptionsModal/SaveOptionsModal.vue +1 -1
  21. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/Table.vue +1 -1
  22. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +278 -222
  23. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/form/Form.vue +5 -5
  24. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/form/lib/config/dateForm.ts +12 -14
  25. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +1 -1
  26. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/config/objectTable.ts +1 -1
  27. package/components/common/monitor/advanced/tools/chartOptionsModal/metrics/Metrics.vue +1 -1
  28. package/components/common/monitor/advanced/tools/lib/config/advancedToolbar.ts +16 -16
  29. package/components/common/monitor/overview/Overview.vue +1 -1
  30. package/components/common/monitor/overview/filters/Filters.vue +2 -2
  31. package/components/common/monitor/overview/filters/customIntervalModal/lib/config/dateChecker.ts +5 -5
  32. package/components/common/monitor/overview/filters/lib/config/filterOptions.ts +14 -13
  33. package/components/common/pages/hardwareHealth/historyTestimony/tools/Tools.vue +2 -2
  34. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/ChartOptionsModal.vue +2 -2
  35. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/actions/Actions.vue +5 -5
  36. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/actions/SaveOptionsModal.vue +1 -1
  37. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/actions/lib/utils/optionsActions.ts +1 -1
  38. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/table/Table.vue +1 -1
  39. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/timespan/form/Form.vue +5 -5
  40. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/timespan/form/lib/config/dateForm.ts +12 -12
  41. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/metrics/Metrics.vue +1 -1
  42. package/components/common/pages/hardwareHealth/historyTestimony/tools/lib/config/toolbar.ts +6 -6
  43. package/components/common/split/horizontal/HorizontalNew.vue +321 -321
  44. package/components/common/vm/actions/add/Add.vue +603 -598
  45. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +2 -2
  46. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/lib/config/options.ts +20 -20
  47. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +403 -403
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuHotPlug.vue +61 -57
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Hv.vue +99 -99
  50. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/streamingMode/StreamingMode.vue +85 -85
  51. package/components/common/vm/actions/common/lib/config/capabilities.ts +1 -0
  52. package/components/common/vm/actions/common/lib/models/interfaces.ts +148 -139
  53. package/components/common/vm/actions/common/lib/utils/capabilities.ts +46 -0
  54. package/components/common/vm/actions/common/select/lib/models/interfaces.ts +35 -32
  55. package/components/common/vm/actions/common/select/os/os.vue +233 -227
  56. package/components/common/wizards/datastore/add/Add.vue +437 -437
  57. package/composables/productNameLocal.ts +30 -30
  58. package/package.json +1 -1
  59. package/plugins/binary.ts +4 -0
  60. package/plugins/recursion.ts +311 -311
  61. package/public/spice-console/lib/images/bitmap.js +203 -203
  62. package/store/tasks/mappers/recentTasks.ts +45 -45
@@ -1,598 +1,603 @@
1
- <template>
2
- <div class="add-vm">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="localization.common.newVirtualMachine2"
8
- :localization="localization"
9
- test-id="new-virtual-machine-wizard"
10
- @change-steps="onChangeSteps"
11
- @hide="onHideModal"
12
- @submit="onFinish"
13
- >
14
- <template #modalBody="{ selectedStep }">
15
- <div class="add-vm-content">
16
- <common-vm-actions-common-select-create-type
17
- v-show="selectedStep.id === 0"
18
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
19
- />
20
- <common-vm-actions-common-select-name
21
- v-show="selectedStep.id === 1 || selectedStep.id === 2"
22
- :show="selectedStep.id === 1 || selectedStep.id === 2"
23
- :name-form-submit="nameFormSubmit"
24
- :project="props.project"
25
- :data-center="props.dataCenter"
26
- @submit="onChangeName(...$event)"
27
- @check-name="emits('check-name', $event)"
28
- />
29
- <common-vm-actions-common-select-compute-resource
30
- v-if="isSphere"
31
- v-show="selectedStep.id === 3"
32
- v-model="vmForm.computeResource"
33
- :compute-resource-submit="computeResourceSubmit"
34
- :data-center="vmForm.dataCenter"
35
- :compute-resource="props.computeResource"
36
- :compute-resource-tree="props.computeResourceTree"
37
- @submit="onChangeComputeResource"
38
- @select-compute-resource-tree="onSelectComputeResourceTree"
39
- @get-compute-resource-tree="
40
- emits('get-compute-resource-tree', $event)
41
- "
42
- @show-compute-resource-tree="
43
- emits('show-compute-resource-tree', $event)
44
- "
45
- @clear-compute-resource-tree="
46
- emits('clear-compute-resource-tree', $event)
47
- "
48
- />
49
- <common-vm-actions-common-select-storage
50
- v-show="selectedStep.id === 4"
51
- :storage-submit="storageSubmit"
52
- :datastore="props.datastore"
53
- :get-datastore-table-func="props.getDatastoreTableFunc"
54
- @submit="onChangeStorage"
55
- />
56
- <common-vm-actions-common-select-compatibility
57
- v-show="selectedStep.id === 5"
58
- :options="compatibility"
59
- :error-validation-fields="props.errorValidationFields"
60
- @change="onChangeCompatibility"
61
- @remove-error-by-title="emits('remove-error-by-title', $event)"
62
- />
63
- <common-vm-actions-common-select-os
64
- v-show="selectedStep.id === 6 || selectedStep.id === 7"
65
- :families-options="guestOsFamilies"
66
- :versions-options="guestOsVersions"
67
- :machine-types-options="machineTypes"
68
- :error-validation-fields="props.errorValidationFields"
69
- @change="onChangeOs"
70
- @remove-error-by-title="emits('remove-error-by-title', $event)"
71
- />
72
- <common-vm-actions-common-customize-hardware
73
- v-show="selectedStep.id === 8"
74
- :project="props.project"
75
- :vm-name="vmForm.name"
76
- :guest-machine-type="vmForm.guestMachineType"
77
- :guest-os-family="vmForm.guestOsFamily"
78
- :guest-os-version="vmForm.guestOsVersion"
79
- :storage="vmForm.storage"
80
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
81
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
82
- :networks-for-boot-options="virtualHardwareNetworksLocal"
83
- :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
84
- :customize-hardware-submit="customizeHardwareSubmit"
85
- :max-cpus="maxCpus"
86
- :max-memory="maxMemory"
87
- :cpu-models="cpuModels"
88
- :selected-nav-item="selectedNavItem"
89
- :nodes="props.nodes"
90
- :files="props.files"
91
- :networks-table="props.networksTable"
92
- :error-validation-fields="props.errorValidationFields"
93
- :get-datastore-table-func="props.getDatastoreTableFunc"
94
- :datastore="props.datastore"
95
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
96
- :passthrough-devices="props.passthroughDevices"
97
- @change-boot-order="onChangeBootOrder"
98
- @send-data="onChangeCustomizeHardware"
99
- @get-storage="emits('get-storage', $event)"
100
- @get-folders-or-files="emits('get-folders-or-files', $event)"
101
- @get-active-device-child="emits('get-active-device-child', $event)"
102
- @show-datastore-child="emits('show-datastore-child', $event)"
103
- @remove-error-by-title="emits('remove-error-by-title', $event)"
104
- @get-networks-table="emits('get-networks-table', $event)"
105
- @get-pci-devices="emits('get-pci-devices')"
106
- />
107
- <common-ready-to-complete
108
- v-if="selectedStep.id === 9"
109
- :data="props.readyCompleteTableInfo"
110
- />
111
- <span v-if="selectedStep.id > 5" class="vm-hardware-version">{{
112
- compatibilityInfo
113
- }}</span>
114
- </div>
115
- </template>
116
-
117
- <template #modalFooterContent>
118
- <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
119
- <input
120
- id="power-on-by-default"
121
- v-model="isPowerOnByDefault"
122
- data-id="power-on-by-default"
123
- type="checkbox"
124
- />
125
- <label for="power-on-by-default" class="label-text-normal">{{
126
- localization.common.powerOnByDefault
127
- }}</label>
128
- </div>
129
- </template>
130
- </atoms-wizard>
131
- </div>
132
- </template>
133
-
134
- <script setup lang="ts">
135
- import type {
136
- UI_I_Localization,
137
- UI_I_ArbitraryObject,
138
- } from '~/lib/models/interfaces'
139
- import type { UI_T_Project } from '~/lib/models/types'
140
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
141
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
142
- import type {
143
- UI_I_DatastoreTableItem,
144
- UI_I_FolderOrFileTreePayload,
145
- } from '~/lib/models/store/storage/interfaces'
146
- import type {
147
- API_UI_I_Error,
148
- UI_I_ErrorValidationField,
149
- } from '~/lib/models/store/interfaces'
150
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
151
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
152
- import type {
153
- UI_T_AddVmFinishFunc,
154
- UI_T_SelectedNavItem,
155
- } from '~/components/common/vm/actions/common/lib/models/types'
156
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
157
- import type {
158
- UI_I_ValidationReturn,
159
- UI_I_WizardStep,
160
- } from '~/components/atoms/wizard/lib/models/interfaces'
161
- import type {
162
- UI_I_VmForm,
163
- UI_I_VmFormCash,
164
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
165
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
166
- import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
167
- import type {
168
- UI_I_SendDataCpu,
169
- UI_I_SendDataMemory,
170
- UI_I_SendDataNewCdDvdDrive,
171
- UI_I_SendDataNewHardDisk,
172
- UI_I_SendDataNewNetwork,
173
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
174
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
175
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
176
- import type { UI_I_PciDevice } from '~/lib/models/store/vm/interfaces'
177
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
178
- import {
179
- stepsSchemeInitial,
180
- stepsFunc,
181
- } from '~/components/common/vm/actions/add/lib/config/steps'
182
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
183
-
184
- const props = defineProps<{
185
- project: UI_T_Project
186
- nodes: UI_I_FileTreeNode[]
187
- files: UI_I_FileTreeNode[]
188
- networksTable: UI_I_NetworkTableItem[]
189
- datastore: UI_I_DatastoreTableItem[]
190
- errorValidationFields: UI_I_ErrorValidationField[]
191
- readyCompleteTableInfo: UI_I_TableInfoItem[]
192
- vmCpuHelpTextSecond: string
193
- importFromVMWarevSphere: string
194
- finishFunc: UI_T_AddVmFinishFunc
195
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
196
- validateSendDataFunc: UI_T_AddVmFinishFunc<
197
- [UI_T_SelectedNavItem, null | number] | null
198
- >
199
- passthroughDevices: UI_I_PciDevice[]
200
- vmNameInWizard: string
201
- dataCenter?: UI_I_TreeNode // для сферы
202
- computeResource?: UI_I_TreeNode // для сферы
203
- computeResourceTree?: UI_I_TreeNode[] // для сферы
204
- }>()
205
-
206
- const emits = defineEmits<{
207
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
208
- (event: 'get-storage', value: UI_I_TablePayload): void
209
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
210
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
211
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
212
- (event: 'remove-error-by-title', value: string): void
213
- (event: 'get-networks-table', value: UI_I_TablePayload): void
214
- (event: 'get-pci-devices'): void
215
- (event: 'get-pci-devices'): void
216
- (event: 'hide'): void
217
- (
218
- event: 'get-compute-resource-tree',
219
- value: { id: string | number; cb: () => void }
220
- ): void // для сферы
221
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
222
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
223
- (event: 'clear-compute-resource-tree'): void // для сферы
224
- }>()
225
-
226
- const isSphere = computed<boolean>(() => props.project === 'sphere')
227
-
228
- const { $recursion } = useNuxtApp()
229
-
230
- const localization = computed<UI_I_Localization>(() => useLocal())
231
-
232
- const wizard: Wizard = new Wizard(
233
- stepsFunc(localization.value),
234
- stepsSchemeInitial
235
- )
236
- if (isSphere.value) wizard.changeScheme(1)
237
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
238
- // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
239
-
240
- const isShowPowerOn = computed<boolean>(() => wizard.selectedStepId > 8)
241
-
242
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
243
- wizard.changeSteps(value, validationFunc, validateSendData)
244
- }
245
- const validationFunc = async (
246
- value: UI_I_WizardStep[],
247
- currentStep: UI_I_WizardStep,
248
- nextStep: UI_I_WizardStep
249
- ): Promise<UI_I_ValidationReturn> => {
250
- let stepHasError = false
251
- let stepShouldStop = {
252
- ifOnCurrentStep: false,
253
- ifFromAnyStep: false,
254
- stoppageStepId: -1,
255
- }
256
-
257
- wizard.setLoader(true)
258
- if (
259
- wizard.isValidateForStep(
260
- isSphere.value ? 2 : 1,
261
- currentStep.id,
262
- nextStep.id
263
- )
264
- ) {
265
- const nameValidation = await checkName(value)
266
-
267
- value = nameValidation.newValue
268
- stepHasError = stepHasError || nameValidation.stepHasError
269
- } else if (
270
- isSphere.value &&
271
- wizard.isValidateForStep(3, currentStep.id, nextStep.id)
272
- ) {
273
- const computeResourceValidation = await checkComputeResource(value)
274
-
275
- value = computeResourceValidation.newValue
276
- stepHasError = stepHasError || computeResourceValidation.stepHasError
277
- } else if (wizard.isValidateForStep(4, currentStep.id, nextStep.id)) {
278
- const storageValidation = await checkStorage(value)
279
-
280
- value = storageValidation.newValue
281
-
282
- stepHasError = stepHasError || storageValidation.stepHasError
283
- } else if (wizard.isValidateForStep(8, currentStep.id, nextStep.id)) {
284
- const storageValidation = await checkCustomizeHardware(value)
285
-
286
- value = storageValidation.newValue
287
-
288
- stepHasError = stepHasError || storageValidation.stepHasError
289
- }
290
- wizard.setLoader(false)
291
-
292
- return {
293
- newValue: value,
294
- stepHasError,
295
- stepShouldStop,
296
- }
297
- }
298
- const checkName = async (
299
- value: UI_I_WizardStep[]
300
- ): Promise<UI_I_ValidationReturn> => {
301
- let stepHasError = false
302
-
303
- return new Promise((resolve) => {
304
- const step = isSphere.value ? 2 : 1
305
- nameFormSubmit.value = (isValid: boolean) => {
306
- if (!isValid) {
307
- stepHasError = wizard.setValidation(step, 'name', {
308
- fieldMessage: 'aaa',
309
- alertMessage: 'aaa',
310
- })
311
- } else if (wizard.hasMessage(step, 'name')) {
312
- value = wizard.removeValidation(step, 'name', value)
313
- }
314
-
315
- resolve({
316
- stepHasError,
317
- newValue: value,
318
- })
319
- nameFormSubmit.value = null
320
- }
321
- })
322
- }
323
- const checkComputeResource = async (
324
- value: UI_I_WizardStep[]
325
- ): Promise<UI_I_ValidationReturn> => {
326
- let stepHasError = false
327
-
328
- return new Promise((resolve) => {
329
- computeResourceSubmit.value = (isValid: boolean) => {
330
- if (!isValid) {
331
- stepHasError = wizard.setValidation(3, 'computeResource', {
332
- fieldMessage: 'aaa',
333
- alertMessage: 'aaa',
334
- })
335
- } else if (wizard.hasMessage(3, 'computeResource')) {
336
- value = wizard.removeValidation(3, 'computeResource', value)
337
- }
338
-
339
- resolve({
340
- stepHasError,
341
- newValue: value,
342
- })
343
- computeResourceSubmit.value = null
344
- }
345
- })
346
- }
347
- const checkStorage = async (
348
- value: UI_I_WizardStep[]
349
- ): Promise<UI_I_ValidationReturn> => {
350
- let stepHasError = false
351
-
352
- return new Promise((resolve) => {
353
- storageSubmit.value = (isValid: boolean) => {
354
- if (!isValid) {
355
- stepHasError = wizard.setValidation(4, 'storage', {
356
- fieldMessage: 'aaa',
357
- alertMessage: 'aaa',
358
- })
359
- } else if (wizard.hasMessage(4, 'storage')) {
360
- value = wizard.removeValidation(4, 'storage', value)
361
- }
362
-
363
- resolve({
364
- stepHasError,
365
- newValue: value,
366
- })
367
- storageSubmit.value = null
368
- }
369
- })
370
- }
371
- const checkCustomizeHardware = async (
372
- value: UI_I_WizardStep[]
373
- ): Promise<UI_I_ValidationReturn> => {
374
- let stepHasError = false
375
-
376
- return new Promise((resolve) => {
377
- customizeHardwareSubmit.value = (isValid: boolean) => {
378
- if (!isValid) {
379
- stepHasError = wizard.setValidation(8, 'customizeHardware', {
380
- fieldMessage: 'aaa',
381
- alertMessage: 'aaa',
382
- })
383
- } else if (wizard.hasMessage(8, 'customizeHardware')) {
384
- value = wizard.removeValidation(8, 'customizeHardware', value)
385
- }
386
-
387
- resolve({
388
- stepHasError,
389
- newValue: value,
390
- })
391
- storageSubmit.value = null
392
- }
393
- })
394
- }
395
-
396
- const storageIdCash = ref<string | null>(null)
397
- const vmForm = ref<UI_I_VmForm>({
398
- name: '',
399
- compatibility: '',
400
- guestMachineType: null,
401
- guestOsFamily: null,
402
- guestOsVersion: null,
403
- computeResource: null,
404
- storage: null,
405
- locationPath: '',
406
- dataCenter: null,
407
- })
408
- const vmFormCash = ref<UI_I_VmFormCash>({
409
- dataCenterId: null,
410
- computeResourceTypeAndId: null,
411
- })
412
-
413
- const onChangeName = (name: string, node: UI_I_TreeNode): void => {
414
- vmForm.value.name = name
415
- if (isSphere.value) {
416
- vmForm.value.locationPath = node.id
417
- vmForm.value.dataCenter = $recursion.findParentByValue(
418
- node,
419
- 'datacenter',
420
- 'type',
421
- 'parent'
422
- )
423
- vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
424
- }
425
- }
426
- // // Для сферы
427
- const computeResourcePath = ref<string>('')
428
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
429
- emits('select-compute-resource-tree', node)
430
- computeResourcePath.value = node.id
431
- }
432
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
433
- vmForm.value.computeResource = node
434
- // const type = node.type.toUpperCase()
435
- // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
436
- vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
437
- }
438
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
439
- if (!storage) return
440
-
441
- vmForm.value.storage = storage
442
- storageIdCash.value = storage.id
443
- }
444
- const compatibilityInfo = ref<string>('')
445
- const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
446
- vmForm.value.compatibility = compatibility.value
447
-
448
- const version = compatibility.value.split('-')[1]
449
- compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
450
- }
451
- const onChangeOs = (data: UI_I_OsChange): void => {
452
- vmForm.value.guestMachineType = data.selectedMachineType
453
- vmForm.value.guestOsFamily = data.selectedOS
454
- vmForm.value.guestOsVersion = data.selectedVersion
455
- }
456
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
457
- const onChangeCustomizeHardware = (
458
- data: UI_I_SendDataCustomizeHardware
459
- ): void => {
460
- customizeHardware.value = data
461
- }
462
-
463
- const virtualHardwareHardDisksLocal = computed<
464
- UI_I_SendDataNewHardDisk[] | null
465
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
466
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
467
- () => customizeHardware.value?.virtualHardware?.networks || null
468
- )
469
- const virtualHardwareCdDvdDrivesLocal = computed<
470
- UI_I_SendDataNewCdDvdDrive[] | null
471
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
472
-
473
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
474
- () => customizeHardware.value?.virtualHardware?.cpu || null
475
- )
476
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
477
- () => customizeHardware.value?.virtualHardware?.memory || null
478
- )
479
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
480
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
481
- null
482
- )
483
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
484
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
485
- virtualHardwareHardDisks.value = data[0]
486
- virtualHardwareCdDvdDrives.value = data[1]
487
- virtualHardwareNetworks.value = data[2]
488
- }
489
-
490
- const isPowerOnByDefault = ref<boolean>(true)
491
-
492
- watch(
493
- () => props.vmNameInWizard,
494
- (newValue) => {
495
- vmForm.value.name = newValue
496
- }
497
- )
498
-
499
- const validateSendData = async (
500
- value: UI_I_WizardStep[]
501
- ): Promise<UI_I_ValidationReturn> => {
502
- wizard.setLoader(true)
503
- let stepHasError = false
504
-
505
- const data = await props.validateSendDataFunc(
506
- vmForm.value,
507
- virtualHardwareCpu.value,
508
- virtualHardwareMemory.value,
509
- customizeHardware.value,
510
- virtualHardwareNetworks.value,
511
- virtualHardwareHardDisks.value,
512
- virtualHardwareCdDvdDrives.value,
513
- isPowerOnByDefault.value,
514
- localization.value,
515
- vmForm.value.locationPath, // для сферы
516
- computeResourcePath.value // для сферы
517
- )
518
-
519
- wizard.setLoader(false)
520
- if (data) {
521
- stepHasError = true
522
- selectedNavItem.value = data[0]
523
- data[1] !== null && wizard.selectStepHard(data[1])
524
- }
525
-
526
- return {
527
- stepHasError,
528
- newValue: value,
529
- }
530
- }
531
- const onFinish = (): void => {
532
- wizard.setLoader(false)
533
- props
534
- .finishFunc(
535
- vmForm.value,
536
- virtualHardwareCpu.value,
537
- virtualHardwareMemory.value,
538
- customizeHardware.value,
539
- virtualHardwareNetworks.value,
540
- virtualHardwareHardDisks.value,
541
- virtualHardwareCdDvdDrives.value,
542
- isPowerOnByDefault.value,
543
- localization.value,
544
- vmForm.value.locationPath, // для сферы
545
- computeResourcePath.value, // для сферы
546
- false
547
- )
548
- .then(() => {
549
- onHideModal()
550
- wizard.setLoader(false)
551
- })
552
- }
553
-
554
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
555
-
556
- const nameFormSubmit = ref<null | Function>(null)
557
- const computeResourceSubmit = ref<null | Function>(null)
558
- const storageSubmit = ref<null | Function>(null)
559
- const customizeHardwareSubmit = ref<null | Function>(null)
560
- const compatibility = ref<UI_I_OptionItem[]>(capabilities.compatibility)
561
- const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
562
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
563
- capabilities.guestOsVersions
564
- )
565
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
566
- const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
567
- const maxCpus = ref<number>(capabilities.maxCpus)
568
- const maxMemory = ref<number>(capabilities.maxMemory)
569
-
570
- const onHideModal = (): void => {
571
- emits('hide')
572
- }
573
- </script>
574
-
575
- <style scoped lang="scss">
576
- :deep(.modal-body) {
577
- display: flex;
578
- flex-direction: column;
579
- }
580
- .add-vm-content {
581
- display: flex;
582
- flex-direction: column;
583
- flex: 1;
584
- }
585
- .vm-hardware-version {
586
- align-self: flex-end;
587
- margin-top: auto;
588
- }
589
- .power-on-by-default-wrap {
590
- display: flex;
591
- align-items: center;
592
- margin-right: auto;
593
-
594
- input {
595
- margin-right: 6px;
596
- }
597
- }
598
- </style>
1
+ <template>
2
+ <div class="add-vm">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="localization.common.newVirtualMachine2"
8
+ :localization="localization"
9
+ test-id="new-virtual-machine-wizard"
10
+ @change-steps="onChangeSteps"
11
+ @hide="onHideModal"
12
+ @submit="onFinish"
13
+ >
14
+ <template #modalBody="{ selectedStep }">
15
+ <div class="add-vm-content">
16
+ <common-vm-actions-common-select-create-type
17
+ v-show="selectedStep.id === 0"
18
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
19
+ />
20
+ <common-vm-actions-common-select-name
21
+ v-show="selectedStep.id === 1 || selectedStep.id === 2"
22
+ :show="selectedStep.id === 1 || selectedStep.id === 2"
23
+ :name-form-submit="nameFormSubmit"
24
+ :project="props.project"
25
+ :data-center="props.dataCenter"
26
+ @submit="onChangeName(...$event)"
27
+ @check-name="emits('check-name', $event)"
28
+ />
29
+ <common-vm-actions-common-select-compute-resource
30
+ v-if="isSphere"
31
+ v-show="selectedStep.id === 3"
32
+ v-model="vmForm.computeResource"
33
+ :compute-resource-submit="computeResourceSubmit"
34
+ :data-center="vmForm.dataCenter"
35
+ :compute-resource="props.computeResource"
36
+ :compute-resource-tree="props.computeResourceTree"
37
+ @submit="onChangeComputeResource"
38
+ @select-compute-resource-tree="onSelectComputeResourceTree"
39
+ @get-compute-resource-tree="
40
+ emits('get-compute-resource-tree', $event)
41
+ "
42
+ @show-compute-resource-tree="
43
+ emits('show-compute-resource-tree', $event)
44
+ "
45
+ @clear-compute-resource-tree="
46
+ emits('clear-compute-resource-tree', $event)
47
+ "
48
+ />
49
+ <common-vm-actions-common-select-storage
50
+ v-show="selectedStep.id === 4"
51
+ :storage-submit="storageSubmit"
52
+ :datastore="props.datastore"
53
+ :get-datastore-table-func="props.getDatastoreTableFunc"
54
+ @submit="onChangeStorage"
55
+ />
56
+ <common-vm-actions-common-select-compatibility
57
+ v-show="selectedStep.id === 5"
58
+ :options="compatibility"
59
+ :error-validation-fields="props.errorValidationFields"
60
+ @change="onChangeCompatibility"
61
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
62
+ />
63
+ <common-vm-actions-common-select-os
64
+ v-show="selectedStep.id === 6 || selectedStep.id === 7"
65
+ :families-options="guestOsFamilies"
66
+ :versions-options="guestOsVersions"
67
+ :machine-types-options="machineTypes"
68
+ :error-validation-fields="props.errorValidationFields"
69
+ @change="onChangeOs"
70
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
71
+ />
72
+ <common-vm-actions-common-customize-hardware
73
+ v-show="selectedStep.id === 8"
74
+ :project="props.project"
75
+ :vm-name="vmForm.name"
76
+ :guest-machine-type="vmForm.guestMachineType"
77
+ :guest-os-family="vmForm.guestOsFamily"
78
+ :guest-os-version="vmForm.guestOsVersion"
79
+ :storage="vmForm.storage"
80
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
81
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
82
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
83
+ :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
84
+ :customize-hardware-submit="customizeHardwareSubmit"
85
+ :max-cpus="maxCpus"
86
+ :max-memory="maxMemory"
87
+ :cpu-models="cpuModels"
88
+ :selected-nav-item="selectedNavItem"
89
+ :nodes="props.nodes"
90
+ :files="props.files"
91
+ :networks-table="props.networksTable"
92
+ :error-validation-fields="props.errorValidationFields"
93
+ :get-datastore-table-func="props.getDatastoreTableFunc"
94
+ :datastore="props.datastore"
95
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
96
+ :passthrough-devices="props.passthroughDevices"
97
+ @change-boot-order="onChangeBootOrder"
98
+ @send-data="onChangeCustomizeHardware"
99
+ @get-storage="emits('get-storage', $event)"
100
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
101
+ @get-active-device-child="emits('get-active-device-child', $event)"
102
+ @show-datastore-child="emits('show-datastore-child', $event)"
103
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
104
+ @get-networks-table="emits('get-networks-table', $event)"
105
+ @get-pci-devices="emits('get-pci-devices')"
106
+ />
107
+ <common-ready-to-complete
108
+ v-if="selectedStep.id === 9"
109
+ :data="props.readyCompleteTableInfo"
110
+ />
111
+ <span v-if="selectedStep.id > 5" class="vm-hardware-version">{{
112
+ compatibilityInfo
113
+ }}</span>
114
+ </div>
115
+ </template>
116
+
117
+ <template #modalFooterContent>
118
+ <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
119
+ <input
120
+ id="power-on-by-default"
121
+ v-model="isPowerOnByDefault"
122
+ data-id="power-on-by-default"
123
+ type="checkbox"
124
+ />
125
+ <label for="power-on-by-default" class="label-text-normal">{{
126
+ localization.common.powerOnByDefault
127
+ }}</label>
128
+ </div>
129
+ </template>
130
+ </atoms-wizard>
131
+ </div>
132
+ </template>
133
+
134
+ <script setup lang="ts">
135
+ import type {
136
+ UI_I_Localization,
137
+ UI_I_ArbitraryObject,
138
+ } from '~/lib/models/interfaces'
139
+ import type { UI_T_Project } from '~/lib/models/types'
140
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
141
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
142
+ import type {
143
+ UI_I_DatastoreTableItem,
144
+ UI_I_FolderOrFileTreePayload,
145
+ } from '~/lib/models/store/storage/interfaces'
146
+ import type {
147
+ API_UI_I_Error,
148
+ UI_I_ErrorValidationField,
149
+ } from '~/lib/models/store/interfaces'
150
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
151
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
152
+ import type {
153
+ UI_T_AddVmFinishFunc,
154
+ UI_T_SelectedNavItem,
155
+ } from '~/components/common/vm/actions/common/lib/models/types'
156
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
157
+ import type {
158
+ UI_I_ValidationReturn,
159
+ UI_I_WizardStep,
160
+ } from '~/components/atoms/wizard/lib/models/interfaces'
161
+ import type {
162
+ UI_I_Capabilities,
163
+ UI_I_VmForm,
164
+ UI_I_VmFormCash,
165
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
166
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
167
+ import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
168
+ import type {
169
+ UI_I_SendDataCpu,
170
+ UI_I_SendDataMemory,
171
+ UI_I_SendDataNewCdDvdDrive,
172
+ UI_I_SendDataNewHardDisk,
173
+ UI_I_SendDataNewNetwork,
174
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
175
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
176
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
177
+ import type { UI_I_PciDevice } from '~/lib/models/store/vm/interfaces'
178
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
179
+ import {
180
+ stepsSchemeInitial,
181
+ stepsFunc,
182
+ } from '~/components/common/vm/actions/add/lib/config/steps'
183
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
184
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
185
+
186
+ const props = defineProps<{
187
+ project: UI_T_Project
188
+ nodes: UI_I_FileTreeNode[]
189
+ files: UI_I_FileTreeNode[]
190
+ networksTable: UI_I_NetworkTableItem[]
191
+ datastore: UI_I_DatastoreTableItem[]
192
+ errorValidationFields: UI_I_ErrorValidationField[]
193
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
194
+ vmCpuHelpTextSecond: string
195
+ importFromVMWarevSphere: string
196
+ finishFunc: UI_T_AddVmFinishFunc
197
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
198
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
199
+ [UI_T_SelectedNavItem, null | number] | null
200
+ >
201
+ passthroughDevices: UI_I_PciDevice[]
202
+ vmNameInWizard: string
203
+ capabilities?: UI_I_Capabilities
204
+ dataCenter?: UI_I_TreeNode // для сферы
205
+ computeResource?: UI_I_TreeNode // для сферы
206
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
207
+ }>()
208
+
209
+ const emits = defineEmits<{
210
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
211
+ (event: 'get-storage', value: UI_I_TablePayload): void
212
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
213
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
214
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
215
+ (event: 'remove-error-by-title', value: string): void
216
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
217
+ (event: 'get-pci-devices'): void
218
+ (event: 'get-pci-devices'): void
219
+ (event: 'hide'): void
220
+ (
221
+ event: 'get-compute-resource-tree',
222
+ value: { id: string | number; cb: () => void }
223
+ ): void // для сферы
224
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
225
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
226
+ (event: 'clear-compute-resource-tree'): void // для сферы
227
+ }>()
228
+
229
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
230
+
231
+ const { $recursion } = useNuxtApp()
232
+
233
+ const localization = computed<UI_I_Localization>(() => useLocal())
234
+
235
+ props.capabilities && mapCapabilities(props.capabilities)
236
+
237
+ const wizard: Wizard = new Wizard(
238
+ stepsFunc(localization.value),
239
+ stepsSchemeInitial
240
+ )
241
+ if (isSphere.value) wizard.changeScheme(1)
242
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
243
+ // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
244
+
245
+ const isShowPowerOn = computed<boolean>(() => wizard.selectedStepId > 8)
246
+
247
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
248
+ wizard.changeSteps(value, validationFunc, validateSendData)
249
+ }
250
+ const validationFunc = async (
251
+ value: UI_I_WizardStep[],
252
+ currentStep: UI_I_WizardStep,
253
+ nextStep: UI_I_WizardStep
254
+ ): Promise<UI_I_ValidationReturn> => {
255
+ let stepHasError = false
256
+ let stepShouldStop = {
257
+ ifOnCurrentStep: false,
258
+ ifFromAnyStep: false,
259
+ stoppageStepId: -1,
260
+ }
261
+
262
+ wizard.setLoader(true)
263
+ if (
264
+ wizard.isValidateForStep(
265
+ isSphere.value ? 2 : 1,
266
+ currentStep.id,
267
+ nextStep.id
268
+ )
269
+ ) {
270
+ const nameValidation = await checkName(value)
271
+
272
+ value = nameValidation.newValue
273
+ stepHasError = stepHasError || nameValidation.stepHasError
274
+ } else if (
275
+ isSphere.value &&
276
+ wizard.isValidateForStep(3, currentStep.id, nextStep.id)
277
+ ) {
278
+ const computeResourceValidation = await checkComputeResource(value)
279
+
280
+ value = computeResourceValidation.newValue
281
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
282
+ } else if (wizard.isValidateForStep(4, currentStep.id, nextStep.id)) {
283
+ const storageValidation = await checkStorage(value)
284
+
285
+ value = storageValidation.newValue
286
+
287
+ stepHasError = stepHasError || storageValidation.stepHasError
288
+ } else if (wizard.isValidateForStep(8, currentStep.id, nextStep.id)) {
289
+ const storageValidation = await checkCustomizeHardware(value)
290
+
291
+ value = storageValidation.newValue
292
+
293
+ stepHasError = stepHasError || storageValidation.stepHasError
294
+ }
295
+ wizard.setLoader(false)
296
+
297
+ return {
298
+ newValue: value,
299
+ stepHasError,
300
+ stepShouldStop,
301
+ }
302
+ }
303
+ const checkName = async (
304
+ value: UI_I_WizardStep[]
305
+ ): Promise<UI_I_ValidationReturn> => {
306
+ let stepHasError = false
307
+
308
+ return new Promise((resolve) => {
309
+ const step = isSphere.value ? 2 : 1
310
+ nameFormSubmit.value = (isValid: boolean) => {
311
+ if (!isValid) {
312
+ stepHasError = wizard.setValidation(step, 'name', {
313
+ fieldMessage: 'aaa',
314
+ alertMessage: 'aaa',
315
+ })
316
+ } else if (wizard.hasMessage(step, 'name')) {
317
+ value = wizard.removeValidation(step, 'name', value)
318
+ }
319
+
320
+ resolve({
321
+ stepHasError,
322
+ newValue: value,
323
+ })
324
+ nameFormSubmit.value = null
325
+ }
326
+ })
327
+ }
328
+ const checkComputeResource = async (
329
+ value: UI_I_WizardStep[]
330
+ ): Promise<UI_I_ValidationReturn> => {
331
+ let stepHasError = false
332
+
333
+ return new Promise((resolve) => {
334
+ computeResourceSubmit.value = (isValid: boolean) => {
335
+ if (!isValid) {
336
+ stepHasError = wizard.setValidation(3, 'computeResource', {
337
+ fieldMessage: 'aaa',
338
+ alertMessage: 'aaa',
339
+ })
340
+ } else if (wizard.hasMessage(3, 'computeResource')) {
341
+ value = wizard.removeValidation(3, 'computeResource', value)
342
+ }
343
+
344
+ resolve({
345
+ stepHasError,
346
+ newValue: value,
347
+ })
348
+ computeResourceSubmit.value = null
349
+ }
350
+ })
351
+ }
352
+ const checkStorage = async (
353
+ value: UI_I_WizardStep[]
354
+ ): Promise<UI_I_ValidationReturn> => {
355
+ let stepHasError = false
356
+
357
+ return new Promise((resolve) => {
358
+ storageSubmit.value = (isValid: boolean) => {
359
+ if (!isValid) {
360
+ stepHasError = wizard.setValidation(4, 'storage', {
361
+ fieldMessage: 'aaa',
362
+ alertMessage: 'aaa',
363
+ })
364
+ } else if (wizard.hasMessage(4, 'storage')) {
365
+ value = wizard.removeValidation(4, 'storage', value)
366
+ }
367
+
368
+ resolve({
369
+ stepHasError,
370
+ newValue: value,
371
+ })
372
+ storageSubmit.value = null
373
+ }
374
+ })
375
+ }
376
+ const checkCustomizeHardware = async (
377
+ value: UI_I_WizardStep[]
378
+ ): Promise<UI_I_ValidationReturn> => {
379
+ let stepHasError = false
380
+
381
+ return new Promise((resolve) => {
382
+ customizeHardwareSubmit.value = (isValid: boolean) => {
383
+ if (!isValid) {
384
+ stepHasError = wizard.setValidation(8, 'customizeHardware', {
385
+ fieldMessage: 'aaa',
386
+ alertMessage: 'aaa',
387
+ })
388
+ } else if (wizard.hasMessage(8, 'customizeHardware')) {
389
+ value = wizard.removeValidation(8, 'customizeHardware', value)
390
+ }
391
+
392
+ resolve({
393
+ stepHasError,
394
+ newValue: value,
395
+ })
396
+ storageSubmit.value = null
397
+ }
398
+ })
399
+ }
400
+
401
+ const storageIdCash = ref<string | null>(null)
402
+ const vmForm = ref<UI_I_VmForm>({
403
+ name: '',
404
+ compatibility: '',
405
+ guestMachineType: null,
406
+ guestOsFamily: null,
407
+ guestOsVersion: null,
408
+ computeResource: null,
409
+ storage: null,
410
+ locationPath: '',
411
+ dataCenter: null,
412
+ })
413
+ const vmFormCash = ref<UI_I_VmFormCash>({
414
+ dataCenterId: null,
415
+ computeResourceTypeAndId: null,
416
+ })
417
+
418
+ const onChangeName = (name: string, node: UI_I_TreeNode): void => {
419
+ vmForm.value.name = name
420
+ if (isSphere.value) {
421
+ vmForm.value.locationPath = node.id
422
+ vmForm.value.dataCenter = $recursion.findParentByValue(
423
+ node,
424
+ 'datacenter',
425
+ 'type',
426
+ 'parent'
427
+ )
428
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
429
+ }
430
+ }
431
+ // // Для сферы
432
+ const computeResourcePath = ref<string>('')
433
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
434
+ emits('select-compute-resource-tree', node)
435
+ computeResourcePath.value = node.id
436
+ }
437
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
438
+ vmForm.value.computeResource = node
439
+ // const type = node.type.toUpperCase()
440
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
441
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
442
+ }
443
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
444
+ if (!storage) return
445
+
446
+ vmForm.value.storage = storage
447
+ storageIdCash.value = storage.id
448
+ }
449
+ const compatibilityInfo = ref<string>('')
450
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
451
+ vmForm.value.compatibility = compatibility.value
452
+
453
+ const version = compatibility.value.split('-')[1]
454
+ compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
455
+ }
456
+ const onChangeOs = (data: UI_I_OsChange): void => {
457
+ vmForm.value.guestMachineType = data.selectedMachineType
458
+ vmForm.value.guestOsFamily = data.selectedOS
459
+ vmForm.value.guestOsVersion = data.selectedVersion
460
+ }
461
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
462
+ const onChangeCustomizeHardware = (
463
+ data: UI_I_SendDataCustomizeHardware
464
+ ): void => {
465
+ customizeHardware.value = data
466
+ }
467
+
468
+ const virtualHardwareHardDisksLocal = computed<
469
+ UI_I_SendDataNewHardDisk[] | null
470
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
471
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
472
+ () => customizeHardware.value?.virtualHardware?.networks || null
473
+ )
474
+ const virtualHardwareCdDvdDrivesLocal = computed<
475
+ UI_I_SendDataNewCdDvdDrive[] | null
476
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
477
+
478
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
479
+ () => customizeHardware.value?.virtualHardware?.cpu || null
480
+ )
481
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
482
+ () => customizeHardware.value?.virtualHardware?.memory || null
483
+ )
484
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
485
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
486
+ null
487
+ )
488
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
489
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
490
+ virtualHardwareHardDisks.value = data[0]
491
+ virtualHardwareCdDvdDrives.value = data[1]
492
+ virtualHardwareNetworks.value = data[2]
493
+ }
494
+
495
+ const isPowerOnByDefault = ref<boolean>(true)
496
+
497
+ watch(
498
+ () => props.vmNameInWizard,
499
+ (newValue) => {
500
+ vmForm.value.name = newValue
501
+ }
502
+ )
503
+
504
+ const validateSendData = async (
505
+ value: UI_I_WizardStep[]
506
+ ): Promise<UI_I_ValidationReturn> => {
507
+ wizard.setLoader(true)
508
+ let stepHasError = false
509
+
510
+ const data = await props.validateSendDataFunc(
511
+ vmForm.value,
512
+ virtualHardwareCpu.value,
513
+ virtualHardwareMemory.value,
514
+ customizeHardware.value,
515
+ virtualHardwareNetworks.value,
516
+ virtualHardwareHardDisks.value,
517
+ virtualHardwareCdDvdDrives.value,
518
+ isPowerOnByDefault.value,
519
+ localization.value,
520
+ vmForm.value.locationPath, // для сферы
521
+ computeResourcePath.value // для сферы
522
+ )
523
+
524
+ wizard.setLoader(false)
525
+ if (data) {
526
+ stepHasError = true
527
+ selectedNavItem.value = data[0]
528
+ data[1] !== null && wizard.selectStepHard(data[1])
529
+ }
530
+
531
+ return {
532
+ stepHasError,
533
+ newValue: value,
534
+ }
535
+ }
536
+ const onFinish = (): void => {
537
+ wizard.setLoader(false)
538
+ props
539
+ .finishFunc(
540
+ vmForm.value,
541
+ virtualHardwareCpu.value,
542
+ virtualHardwareMemory.value,
543
+ customizeHardware.value,
544
+ virtualHardwareNetworks.value,
545
+ virtualHardwareHardDisks.value,
546
+ virtualHardwareCdDvdDrives.value,
547
+ isPowerOnByDefault.value,
548
+ localization.value,
549
+ vmForm.value.locationPath, // для сферы
550
+ computeResourcePath.value, // для сферы
551
+ false
552
+ )
553
+ .then(() => {
554
+ onHideModal()
555
+ wizard.setLoader(false)
556
+ })
557
+ }
558
+
559
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
560
+
561
+ const nameFormSubmit = ref<null | Function>(null)
562
+ const computeResourceSubmit = ref<null | Function>(null)
563
+ const storageSubmit = ref<null | Function>(null)
564
+ const customizeHardwareSubmit = ref<null | Function>(null)
565
+ const compatibility = ref<UI_I_OptionItem[]>(capabilities.compatibility)
566
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
567
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
568
+ capabilities.guestOsVersions
569
+ )
570
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
571
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
572
+ const maxCpus = ref<number>(capabilities.maxCpus)
573
+ const maxMemory = ref<number>(capabilities.maxMemory)
574
+
575
+ const onHideModal = (): void => {
576
+ emits('hide')
577
+ }
578
+ </script>
579
+
580
+ <style scoped lang="scss">
581
+ :deep(.modal-body) {
582
+ display: flex;
583
+ flex-direction: column;
584
+ }
585
+ .add-vm-content {
586
+ display: flex;
587
+ flex-direction: column;
588
+ flex: 1;
589
+ }
590
+ .vm-hardware-version {
591
+ align-self: flex-end;
592
+ margin-top: auto;
593
+ }
594
+ .power-on-by-default-wrap {
595
+ display: flex;
596
+ align-items: center;
597
+ margin-right: auto;
598
+
599
+ input {
600
+ margin-right: 6px;
601
+ }
602
+ }
603
+ </style>