bfg-common 1.5.374 → 1.5.375

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.
@@ -1,825 +1,827 @@
1
- <template>
2
- <common-vm-actions-add-new
3
- v-if="isNewView"
4
- v-model:vm-form="vmForm"
5
- v-model:selected-create-type="selectedCreateType"
6
- v-model:is-power-on-by-default="isPowerOnByDefault"
7
- :project="props.project"
8
- :nodes="props.nodes"
9
- :files="props.files"
10
- :networks-table="props.networksTable"
11
- :datastore="props.datastore"
12
- :is-datastore-loading="props.isDatastoreLoading"
13
- :error-validation-fields="props.errorValidationFields"
14
- :ready-complete-table-info="props.readyCompleteTableInfo"
15
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
16
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
17
- :get-datastore-table-func="props.getDatastoreTableFunc"
18
- :passthrough-devices="props.passthroughDevices"
19
- :mediated-devices="props.mediatedDevices"
20
- :templates-tree="props.templatesTree"
21
- :wizard="wizard"
22
- :selected-scheme="selectedScheme"
23
- :template-submit="templateSubmit"
24
- :name-form-submit="nameFormSubmit"
25
- :storage-submit="storageSubmit"
26
- :customize-hardware-submit="customizeHardwareSubmit"
27
- :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
28
- :is-sphere="isSphere"
29
- :compatibility="compatibility"
30
- :guestOsFamilies="guestOsFamilies"
31
- :guestOsVersions="guestOsVersions"
32
- :machineTypes="machineTypes"
33
- :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
34
- :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
35
- :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
36
- :max-cpus="maxCpus"
37
- :max-memory="maxMemory"
38
- :cpu-models="cpuModels"
39
- :selected-nav-item="selectedNavItem"
40
- :compatibility-info="compatibilityInfo"
41
- :is-show-power-on="isShowPowerOn"
42
- :compute-resource-submit="computeResourceSubmit"
43
- :data-center="props.dataCenter"
44
- :compute-resource="props.computeResource"
45
- :compute-resource-tree="props.computeResourceTree"
46
- :vmt-settings="props.vmtSettings"
47
- :is-loading="isLoading"
48
- @check-name="emits('check-name', $event)"
49
- @get-storage="emits('get-storage', $event)"
50
- @get-folders-or-files="emits('get-folders-or-files', $event)"
51
- @get-active-device-child="emits('get-active-device-child', $event)"
52
- @show-datastore-child="emits('show-datastore-child', $event)"
53
- @remove-error-by-title="emits('remove-error-by-title', $event)"
54
- @get-networks-table="emits('get-networks-table', $event)"
55
- @get-pci-devices="emits('get-pci-devices')"
56
- @change-steps="onChangeSteps"
57
- @change-template="onChangeTemplate"
58
- @change-name="onChangeName(...$event)"
59
- @change-storage="onChangeStorage"
60
- @change-select-options="onChangeSelectOptions"
61
- @change-compatibility="onChangeCompatibility"
62
- @change-boot-order="onChangeBootOrder"
63
- @change-customize-hardware="onChangeCustomizeHardware"
64
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
65
- @change-compute-resource="onChangeComputeResource"
66
- @select-compute-resource-tree="onSelectComputeResourceTree"
67
- @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
68
- @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
69
- @finish="onFinish"
70
- @hide="onHideModal"
71
- />
72
- <common-vm-actions-add-old
73
- v-else
74
- v-model:vm-form="vmForm"
75
- v-model:selected-create-type="selectedCreateType"
76
- v-model:is-power-on-by-default="isPowerOnByDefault"
77
- :project="props.project"
78
- :nodes="props.nodes"
79
- :files="props.files"
80
- :networks-table="props.networksTable"
81
- :datastore="props.datastore"
82
- :is-datastore-loading="props.isDatastoreLoading"
83
- :error-validation-fields="props.errorValidationFields"
84
- :ready-complete-table-info="props.readyCompleteTableInfo"
85
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
86
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
87
- :get-datastore-table-func="props.getDatastoreTableFunc"
88
- :passthrough-devices="props.passthroughDevices"
89
- :mediated-devices="props.mediatedDevices"
90
- :templates-tree="props.templatesTree"
91
- :wizard="wizard"
92
- :selected-scheme="selectedScheme"
93
- :template-submit="templateSubmit"
94
- :name-form-submit="nameFormSubmit"
95
- :storage-submit="storageSubmit"
96
- :customize-hardware-submit="customizeHardwareSubmit"
97
- :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
98
- :is-sphere="isSphere"
99
- :compatibility="compatibility"
100
- :guestOsFamilies="guestOsFamilies"
101
- :guestOsVersions="guestOsVersions"
102
- :machineTypes="machineTypes"
103
- :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
104
- :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
105
- :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
106
- :max-cpus="maxCpus"
107
- :max-memory="maxMemory"
108
- :cpu-models="cpuModels"
109
- :selected-nav-item="selectedNavItem"
110
- :compatibility-info="compatibilityInfo"
111
- :is-show-power-on="isShowPowerOn"
112
- :compute-resource-submit="computeResourceSubmit"
113
- :data-center="props.dataCenter"
114
- :compute-resource="props.computeResource"
115
- :compute-resource-tree="props.computeResourceTree"
116
- :vmt-settings="props.vmtSettings"
117
- :is-loading="isLoading"
118
- @check-name="emits('check-name', $event)"
119
- @get-storage="emits('get-storage', $event)"
120
- @get-folders-or-files="emits('get-folders-or-files', $event)"
121
- @get-active-device-child="emits('get-active-device-child', $event)"
122
- @show-datastore-child="emits('show-datastore-child', $event)"
123
- @remove-error-by-title="emits('remove-error-by-title', $event)"
124
- @get-networks-table="emits('get-networks-table', $event)"
125
- @get-pci-devices="emits('get-pci-devices')"
126
- @change-steps="onChangeSteps"
127
- @change-template="onChangeTemplate"
128
- @change-name="onChangeName(...$event)"
129
- @change-storage="onChangeStorage"
130
- @change-select-options="onChangeSelectOptions"
131
- @change-compatibility="onChangeCompatibility"
132
- @change-boot-order="onChangeBootOrder"
133
- @change-customize-hardware="onChangeCustomizeHardware"
134
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
135
- @change-compute-resource="onChangeComputeResource"
136
- @select-compute-resource-tree="onSelectComputeResourceTree"
137
- @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
138
- @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
139
- @finish="onFinish"
140
- @hide="onHideModal"
141
- />
142
- </template>
143
-
144
- <script setup lang="ts">
145
- import type {
146
- UI_I_Localization,
147
- UI_I_ArbitraryObject,
148
- } from '~/lib/models/interfaces'
149
- import type { UI_T_Project } from '~/lib/models/types'
150
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
151
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
152
- import type {
153
- UI_I_DatastoreTableItem,
154
- UI_I_FolderOrFileTreePayload,
155
- } from '~/lib/models/store/storage/interfaces'
156
- import type {
157
- API_UI_I_Error,
158
- UI_I_ErrorValidationField,
159
- } from '~/lib/models/store/interfaces'
160
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
161
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
162
- import type {
163
- UI_T_AddVmFinishFunc,
164
- UI_T_SelectedNavItem,
165
- } from '~/components/common/vm/actions/common/lib/models/types'
166
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
167
- import type {
168
- UI_I_ValidationReturn,
169
- UI_I_WizardStep,
170
- } from '~/components/atoms/wizard/lib/models/interfaces'
171
- import type {
172
- UI_I_Capabilities,
173
- UI_I_VmForm,
174
- UI_I_VmFormCash,
175
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
176
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
177
- import type {
178
- UI_I_SendDataCpu,
179
- UI_I_SendDataMemory,
180
- UI_I_SendDataNewCdDvdDrive,
181
- UI_I_SendDataNewHardDisk,
182
- UI_I_SendDataNewNetwork,
183
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
184
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
185
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
186
- import type {
187
- UI_I_MediatedDevice,
188
- UI_I_PciDevice,
189
- UI_I_VmSettings,
190
- } from '~/lib/models/store/vm/interfaces'
191
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
192
- import {
193
- stepsSchemeInitial,
194
- stepsFunc,
195
- dynamicSteps,
196
- } from '~/components/common/vm/actions/add/lib/config/steps'
197
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
198
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
199
-
200
- const props = defineProps<{
201
- project: UI_T_Project
202
- nodes: UI_I_FileTreeNode[]
203
- files: UI_I_FileTreeNode[]
204
- networksTable: UI_I_NetworkTableItem[]
205
- datastore: UI_I_DatastoreTableItem[]
206
- isDatastoreLoading: boolean
207
- errorValidationFields: UI_I_ErrorValidationField[]
208
- readyCompleteTableInfo: UI_I_TableInfoItem[]
209
- vmCpuHelpTextSecond: string
210
- importFromVMWarevSphere: string
211
- finishFunc: UI_T_AddVmFinishFunc
212
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
213
- validateSendDataFunc: UI_T_AddVmFinishFunc<
214
- [UI_T_SelectedNavItem, null | number] | null
215
- >
216
- passthroughDevices: UI_I_PciDevice[]
217
- mediatedDevices: UI_I_MediatedDevice[]
218
- vmNameInWizard: string
219
- templatesTree: UI_I_TreeNode[]
220
- capabilities?: UI_I_Capabilities
221
- vmtSettings?: UI_I_VmSettings | null
222
- dataCenter?: UI_I_TreeNode // для сферы
223
- computeResource?: UI_I_TreeNode // для сферы
224
- computeResourceTree?: UI_I_TreeNode[] // для сферы
225
- }>()
226
-
227
- const emits = defineEmits<{
228
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
229
- (event: 'get-storage', value: UI_I_TablePayload): void
230
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
231
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
232
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
233
- (event: 'remove-error-by-title', value: string): void
234
- (event: 'get-networks-table', value: UI_I_TablePayload): void
235
- (event: 'get-pci-devices'): void
236
- (event: 'get-pci-devices'): void
237
- (event: 'hide'): void
238
- (event: 'select-template', value: string): void
239
- (
240
- event: 'get-compute-resource-tree',
241
- value: { id: string | number; cb: () => void }
242
- ): void // для сферы
243
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
244
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
245
- (event: 'clear-compute-resource-tree'): void // для сферы
246
- }>()
247
-
248
- const { $store, $recursion }: any = useNuxtApp()
249
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
250
-
251
- const localization = computed<UI_I_Localization>(() => useLocal())
252
-
253
- const isSphere = computed<boolean>(() => props.project === 'sphere')
254
-
255
- watch(
256
- () => props.capabilities,
257
- () => {
258
- if (props.capabilities) mapCapabilities(props.capabilities)
259
- },
260
- { deep: true, immediate: true }
261
- )
262
-
263
- const selectedCreateType = ref<string>('0')
264
-
265
- const wizard: Wizard = new Wizard(
266
- stepsFunc(localization.value),
267
- stepsSchemeInitial
268
- )
269
- watch(
270
- selectedCreateType,
271
- (newValue) => {
272
- switch (newValue) {
273
- case '0':
274
- wizard.changeScheme(isSphere.value ? 1 : 0)
275
- break
276
- case '1':
277
- wizard.changeScheme(isSphere.value ? 6 : 2)
278
- }
279
- },
280
- { immediate: true }
281
- )
282
- // if (isSphere.value) wizard.changeScheme(1)
283
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
284
- // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
285
-
286
- const isShowPowerOn = computed<boolean>(
287
- () =>
288
- wizard.selectedStepId > dynamicSteps.customizeHardware &&
289
- selectedCreateType.value !== '1'
290
- )
291
-
292
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
293
- wizard.changeSteps(value, validationFunc, validateSendData)
294
- }
295
- const validationFunc = async (
296
- value: UI_I_WizardStep[],
297
- currentStep: UI_I_WizardStep,
298
- nextStep: UI_I_WizardStep
299
- ): Promise<UI_I_ValidationReturn> => {
300
- let stepHasError = false
301
- let stepShouldStop = {
302
- ifOnCurrentStep: false,
303
- ifFromAnyStep: false,
304
- stoppageStepId: -1,
305
- }
306
-
307
- wizard.setLoader(true)
308
- if (
309
- wizard.isValidateForStep(
310
- dynamicSteps.selectTemplate,
311
- currentStep.id,
312
- nextStep.id
313
- )
314
- ) {
315
- const templateValidation = await checkTemplate(value)
316
-
317
- value = templateValidation.newValue
318
- stepHasError = stepHasError || templateValidation.stepHasError
319
- } else if (
320
- wizard.isValidateForStep(
321
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
322
- currentStep.id,
323
- nextStep.id
324
- )
325
- ) {
326
- const nameValidation = await onCheckName(value)
327
-
328
- value = nameValidation.newValue
329
- stepHasError = stepHasError || nameValidation.stepHasError
330
- } else if (
331
- isSphere.value &&
332
- wizard.isValidateForStep(
333
- dynamicSteps.selectComputeResource,
334
- currentStep.id,
335
- nextStep.id
336
- )
337
- ) {
338
- const computeResourceValidation = await checkComputeResource(value)
339
-
340
- value = computeResourceValidation.newValue
341
- stepHasError = stepHasError || computeResourceValidation.stepHasError
342
- } else if (
343
- wizard.isValidateForStep(
344
- dynamicSteps.selectStorage,
345
- currentStep.id,
346
- nextStep.id
347
- )
348
- ) {
349
- const storageValidation = await checkStorage(value)
350
-
351
- value = storageValidation.newValue
352
-
353
- stepHasError = stepHasError || storageValidation.stepHasError
354
- } else if (
355
- wizard.isValidateForStep(
356
- dynamicSteps.customizeHardware,
357
- currentStep.id,
358
- nextStep.id
359
- )
360
- ) {
361
- const validation = await checkCustomizeHardware(value)
362
-
363
- value = validation.newValue
364
-
365
- stepHasError = stepHasError || validation.stepHasError
366
- } else if (
367
- wizard.isValidateForStep(
368
- dynamicSteps.customizeHardwareTemplate,
369
- currentStep.id,
370
- nextStep.id
371
- )
372
- ) {
373
- const validation = await checkCustomizeHardwareForTemplate(value)
374
-
375
- value = validation.newValue
376
-
377
- stepHasError = stepHasError || validation.stepHasError
378
- }
379
- wizard.setLoader(false)
380
-
381
- return {
382
- newValue: value,
383
- stepHasError,
384
- stepShouldStop,
385
- }
386
- }
387
-
388
- const checkTemplate = async (
389
- value: UI_I_WizardStep[]
390
- ): Promise<UI_I_ValidationReturn> => {
391
- let stepHasError = false
392
-
393
- return new Promise((resolve) => {
394
- templateSubmit.value = (isValid: boolean) => {
395
- if (!isValid) {
396
- stepHasError = wizard.setValidation(
397
- dynamicSteps.selectTemplate,
398
- 'template',
399
- {
400
- fieldMessage: 'aaa',
401
- alertMessage: 'aaa',
402
- }
403
- )
404
- } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
405
- value = wizard.removeValidation(
406
- dynamicSteps.selectTemplate,
407
- 'template',
408
- value
409
- )
410
- }
411
-
412
- resolve({
413
- stepHasError,
414
- newValue: value,
415
- })
416
- templateSubmit.value = null
417
- }
418
- })
419
- }
420
- const onCheckName = async (
421
- value: UI_I_WizardStep[]
422
- ): Promise<UI_I_ValidationReturn> => {
423
- let stepHasError = false
424
-
425
- return new Promise((resolve) => {
426
- const step = isSphere.value
427
- ? dynamicSteps.selectNameFolder
428
- : dynamicSteps.selectName
429
- nameFormSubmit.value = (isValid: boolean) => {
430
- if (!isValid) {
431
- stepHasError = wizard.setValidation(step, 'name', {
432
- fieldMessage: 'aaa',
433
- alertMessage: 'aaa',
434
- })
435
- } else if (wizard.hasMessage(step, 'name')) {
436
- value = wizard.removeValidation(step, 'name', value)
437
- }
438
-
439
- resolve({
440
- stepHasError,
441
- newValue: value,
442
- })
443
- nameFormSubmit.value = null
444
- }
445
- })
446
- }
447
- const checkComputeResource = async (
448
- value: UI_I_WizardStep[]
449
- ): Promise<UI_I_ValidationReturn> => {
450
- let stepHasError = false
451
-
452
- return new Promise((resolve) => {
453
- computeResourceSubmit.value = (isValid: boolean) => {
454
- if (!isValid) {
455
- stepHasError = wizard.setValidation(
456
- dynamicSteps.selectComputeResource,
457
- 'computeResource',
458
- {
459
- fieldMessage: 'aaa',
460
- alertMessage: 'aaa',
461
- }
462
- )
463
- } else if (
464
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
465
- ) {
466
- value = wizard.removeValidation(
467
- dynamicSteps.selectComputeResource,
468
- 'computeResource',
469
- value
470
- )
471
- }
472
-
473
- resolve({
474
- stepHasError,
475
- newValue: value,
476
- })
477
- computeResourceSubmit.value = null
478
- }
479
- })
480
- }
481
- const checkStorage = async (
482
- value: UI_I_WizardStep[]
483
- ): Promise<UI_I_ValidationReturn> => {
484
- let stepHasError = false
485
-
486
- return new Promise((resolve) => {
487
- storageSubmit.value = (isValid: boolean) => {
488
- if (!isValid) {
489
- stepHasError = wizard.setValidation(
490
- dynamicSteps.selectStorage,
491
- 'storage',
492
- {
493
- fieldMessage: 'aaa',
494
- alertMessage: 'aaa',
495
- }
496
- )
497
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
498
- value = wizard.removeValidation(
499
- dynamicSteps.selectStorage,
500
- 'storage',
501
- value
502
- )
503
- }
504
-
505
- resolve({
506
- stepHasError,
507
- newValue: value,
508
- })
509
- storageSubmit.value = null
510
- }
511
- })
512
- }
513
- const checkCustomizeHardware = async (
514
- value: UI_I_WizardStep[]
515
- ): Promise<UI_I_ValidationReturn> => {
516
- let stepHasError = false
517
-
518
- return new Promise((resolve) => {
519
- customizeHardwareSubmit.value = (isValid: boolean) => {
520
- if (!isValid) {
521
- stepHasError = wizard.setValidation(
522
- dynamicSteps.customizeHardware,
523
- 'customizeHardware',
524
- {
525
- fieldMessage: 'aaa',
526
- alertMessage: 'aaa',
527
- }
528
- )
529
- } else if (
530
- wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
531
- ) {
532
- value = wizard.removeValidation(
533
- dynamicSteps.customizeHardware,
534
- 'customizeHardware',
535
- value
536
- )
537
- }
538
-
539
- resolve({
540
- stepHasError,
541
- newValue: value,
542
- })
543
- storageSubmit.value = null
544
- }
545
- })
546
- }
547
- const checkCustomizeHardwareForTemplate = async (
548
- value: UI_I_WizardStep[]
549
- ): Promise<UI_I_ValidationReturn> => {
550
- let stepHasError = false
551
-
552
- return new Promise((resolve) => {
553
- customizeHardwareForTemplateSubmit.value = (isValid: boolean) => {
554
- if (!isValid) {
555
- stepHasError = wizard.setValidation(
556
- dynamicSteps.customizeHardwareTemplate,
557
- 'customizeHardwareForTemplate',
558
- {
559
- fieldMessage: 'aaa',
560
- alertMessage: 'aaa',
561
- }
562
- )
563
- } else if (
564
- wizard.hasMessage(
565
- dynamicSteps.customizeHardwareTemplate,
566
- 'customizeHardwareForTemplate'
567
- )
568
- ) {
569
- value = wizard.removeValidation(
570
- dynamicSteps.customizeHardwareTemplate,
571
- 'customizeHardwareForTemplate',
572
- value
573
- )
574
- }
575
-
576
- resolve({
577
- stepHasError,
578
- newValue: value,
579
- })
580
- storageSubmit.value = null
581
- }
582
- })
583
- }
584
-
585
- const storageIdCash = ref<string | null>(null)
586
- const vmForm = ref<UI_I_VmForm>({
587
- name: '',
588
- compatibility: '',
589
- guestMachineType: null,
590
- guestOsFamily: null,
591
- guestOsVersion: null,
592
- computeResource: null,
593
- storage: null,
594
- locationPath: '',
595
- dataCenter: null,
596
- })
597
-
598
- // TODO remove (not used)
599
- const vmFormCash = ref<UI_I_VmFormCash>({
600
- dataCenterId: null,
601
- computeResourceTypeAndId: null,
602
- })
603
-
604
- const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
605
- vmForm.value.name = name
606
- if (isSphere.value) {
607
- vmForm.value.locationPath = node.id
608
- vmForm.value.dataCenter = $recursion.findParentByValue(
609
- node,
610
- 'datacenter',
611
- 'type',
612
- 'parent'
613
- )
614
- vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
615
- }
616
- }
617
- // // Для сферы
618
- const computeResourcePath = ref<string>('')
619
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
620
- emits('select-compute-resource-tree', node)
621
- computeResourcePath.value = node.id
622
- }
623
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
624
- vmForm.value.computeResource = node
625
- // const type = node.type.toUpperCase()
626
- // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
627
- vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
628
- }
629
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
630
- if (!storage) return
631
-
632
- vmForm.value.storage = storage
633
- storageIdCash.value = storage.id
634
- }
635
- const compatibilityInfo = ref<string>('')
636
- const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
637
- vmForm.value.compatibility = compatibility.value
638
-
639
- const version = compatibility.value.split('-')[1]
640
- compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
641
- }
642
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
643
- const onChangeCustomizeHardware = (
644
- data: UI_I_SendDataCustomizeHardware
645
- ): void => {
646
- customizeHardware.value = data
647
- }
648
-
649
- const virtualHardwareHardDisksLocal = computed<
650
- UI_I_SendDataNewHardDisk[] | null
651
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
652
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
653
- () => customizeHardware.value?.virtualHardware?.networks || null
654
- )
655
- const virtualHardwareCdDvdDrivesLocal = computed<
656
- UI_I_SendDataNewCdDvdDrive[] | null
657
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
658
-
659
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
660
- () => customizeHardware.value?.virtualHardware?.cpu || null
661
- )
662
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
663
- () => customizeHardware.value?.virtualHardware?.memory || null
664
- )
665
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
666
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
667
- null
668
- )
669
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
670
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
671
- virtualHardwareHardDisks.value = data[0]
672
- virtualHardwareCdDvdDrives.value = data[1]
673
- virtualHardwareNetworks.value = data[2]
674
- }
675
-
676
- const isPowerOnByDefault = ref<boolean>(true)
677
-
678
- watch(
679
- () => props.vmNameInWizard,
680
- (newValue) => {
681
- vmForm.value.name = newValue
682
- }
683
- )
684
-
685
- const validateSendData = async (
686
- value: UI_I_WizardStep[]
687
- ): Promise<UI_I_ValidationReturn> => {
688
- wizard.setLoader(true)
689
- let stepHasError = false
690
-
691
- const data = await props.validateSendDataFunc(
692
- vmForm.value,
693
- virtualHardwareCpu.value,
694
- virtualHardwareMemory.value,
695
- customizeHardware.value,
696
- virtualHardwareNetworks.value,
697
- virtualHardwareHardDisks.value,
698
- virtualHardwareCdDvdDrives.value,
699
- isPowerOnByDefault.value,
700
- localization.value,
701
- vmForm.value.locationPath, // для сферы
702
- computeResourcePath.value // для сферы
703
- )
704
-
705
- wizard.setLoader(false)
706
- if (data) {
707
- stepHasError = true
708
- selectedNavItem.value = data[0]
709
- data[1] !== null && wizard.selectStepHard(data[1])
710
- }
711
-
712
- return {
713
- stepHasError,
714
- newValue: value,
715
- }
716
- }
717
-
718
- const isLoading = ref<boolean>(false)
719
- const onFinish = (): void => {
720
- isLoading.value = true
721
- wizard.setLoader(false)
722
- props
723
- .finishFunc(
724
- vmForm.value,
725
- virtualHardwareCpu.value,
726
- virtualHardwareMemory.value,
727
- customizeHardware.value,
728
- virtualHardwareNetworks.value,
729
- virtualHardwareHardDisks.value,
730
- virtualHardwareCdDvdDrives.value,
731
- isPowerOnByDefault.value,
732
- localization.value,
733
- vmForm.value.locationPath, // для сферы
734
- computeResourcePath.value, // для сферы
735
- false,
736
- selectedTemplate.value,
737
- selectedCreateType.value
738
- )
739
- .then(() => {
740
- onHideModal()
741
- wizard.setLoader(false)
742
- isLoading.value = false
743
- })
744
- }
745
-
746
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
747
-
748
- const nameFormSubmit = ref<null | Function>(null)
749
- const templateSubmit = ref<null | Function>(null)
750
- const computeResourceSubmit = ref<null | Function>(null)
751
- const storageSubmit = ref<null | Function>(null)
752
- const customizeHardwareSubmit = ref<null | Function>(null)
753
- const customizeHardwareForTemplateSubmit = ref<null | Function>(null)
754
- const compatibility = ref<UI_I_OptionItem[]>(
755
- capabilities.value.compatibility
756
- )
757
- const guestOsFamilies = ref<UI_I_OptionItem[]>(
758
- capabilities.value.guestOsFamilies
759
- )
760
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
761
- capabilities.value.guestOsVersions
762
- )
763
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
764
- const cpuModels = ref<UI_I_OptionItem[]>(capabilities.value.cpuModels)
765
- const maxCpus = ref<number>(capabilities.value.maxCpus)
766
- const maxMemory = ref<number>(capabilities.value.maxMemory)
767
-
768
- const selectedTemplate = ref<string>('')
769
- const onChangeTemplate = (node: UI_I_TreeNode): void => {
770
- selectedTemplate.value = node.id.toString()
771
- emits('select-template', node.id.toString())
772
- }
773
- const selectedOptions = ref<string[]>([])
774
- const onChangeSelectOptions = (options: string[]) => {
775
- selectedOptions.value = options
776
- if (
777
- options.includes('customize-os') &&
778
- options.includes('customize-hardware')
779
- ) {
780
- wizard.changeScheme(isSphere.value ? 9 : 5)
781
- } else if (options.includes('customize-os')) {
782
- wizard.changeScheme(isSphere.value ? 7 : 3)
783
- } else if (options.includes('customize-hardware')) {
784
- wizard.changeScheme(isSphere.value ? 8 : 4)
785
- } else {
786
- wizard.changeScheme(isSphere.value ? 6 : 2)
787
- }
788
-
789
- isPowerOnByDefault.value = options.includes('power-on')
790
- }
791
-
792
- const onHideModal = (): void => {
793
- emits('hide')
794
- }
795
-
796
- watch(
797
- () => props.vmtSettings,
798
- (newValue) => {
799
- if (newValue) {
800
- vmForm.value.name = newValue.name
801
- vmForm.value.compatibility =
802
- newValue.compatibility || vmForm.value.compatibility
803
- vmForm.value.storage = newValue.storage
804
- if (customizeHardware.value?.virtualHardware) {
805
- customizeHardware.value.virtualHardware.cdDvdDrives =
806
- newValue.cdDvdDrives
807
- customizeHardware.value.virtualHardware.hardDisks = newValue.hardDisks
808
- customizeHardware.value.virtualHardware.networks = newValue.networks
809
- customizeHardware.value.virtualHardware.cpu = newValue.cpu
810
- customizeHardware.value.virtualHardware.memory = newValue.memory
811
- customizeHardware.value.virtualHardware.videoCard = newValue.videoCard
812
- customizeHardware.value.virtualHardware.usbController =
813
- newValue.usbController
814
- customizeHardware.value.virtualHardware.pciDevices = newValue.pciDevices
815
- customizeHardware.value.vmOptions = newValue.options
816
- }
817
- maxCpus.value = newValue.cpu.max_vcpus
818
- cpuModels.value = newValue.cpu.model
819
- isPowerOnByDefault.value = false
820
- }
821
- }
822
- )
823
- </script>
824
-
825
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-vm-actions-add-new
3
+ v-if="isNewView"
4
+ v-model:vm-form="vmForm"
5
+ v-model:selected-create-type="selectedCreateType"
6
+ v-model:is-power-on-by-default="isPowerOnByDefault"
7
+ :project="props.project"
8
+ :nodes="props.nodes"
9
+ :files="props.files"
10
+ :networks-table="props.networksTable"
11
+ :datastore="props.datastore"
12
+ :is-datastore-loading="props.isDatastoreLoading"
13
+ :error-validation-fields="props.errorValidationFields"
14
+ :ready-complete-table-info="props.readyCompleteTableInfo"
15
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
16
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
17
+ :get-datastore-table-func="props.getDatastoreTableFunc"
18
+ :passthrough-devices="props.passthroughDevices"
19
+ :mediated-devices="props.mediatedDevices"
20
+ :templates-tree="props.templatesTree"
21
+ :wizard="wizard"
22
+ :selected-scheme="selectedScheme"
23
+ :template-submit="templateSubmit"
24
+ :name-form-submit="nameFormSubmit"
25
+ :storage-submit="storageSubmit"
26
+ :customize-hardware-submit="customizeHardwareSubmit"
27
+ :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
28
+ :is-sphere="isSphere"
29
+ :compatibility="compatibility"
30
+ :guestOsFamilies="guestOsFamilies"
31
+ :guestOsVersions="guestOsVersions"
32
+ :machineTypes="machineTypes"
33
+ :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
34
+ :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
35
+ :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
36
+ :max-cpus="maxCpus"
37
+ :max-memory="maxMemory"
38
+ :cpu-models="cpuModels"
39
+ :selected-nav-item="selectedNavItem"
40
+ :compatibility-info="compatibilityInfo"
41
+ :is-show-power-on="isShowPowerOn"
42
+ :compute-resource-submit="computeResourceSubmit"
43
+ :data-center="props.dataCenter"
44
+ :compute-resource="props.computeResource"
45
+ :compute-resource-tree="props.computeResourceTree"
46
+ :vmt-settings="props.vmtSettings"
47
+ :is-loading="isLoading"
48
+ @check-name="emits('check-name', $event)"
49
+ @get-storage="emits('get-storage', $event)"
50
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
51
+ @get-active-device-child="emits('get-active-device-child', $event)"
52
+ @show-datastore-child="emits('show-datastore-child', $event)"
53
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
54
+ @get-networks-table="emits('get-networks-table', $event)"
55
+ @get-pci-devices="emits('get-pci-devices')"
56
+ @change-steps="onChangeSteps"
57
+ @change-template="onChangeTemplate"
58
+ @change-name="onChangeName(...$event)"
59
+ @change-storage="onChangeStorage"
60
+ @change-select-options="onChangeSelectOptions"
61
+ @change-compatibility="onChangeCompatibility"
62
+ @change-boot-order="onChangeBootOrder"
63
+ @change-customize-hardware="onChangeCustomizeHardware"
64
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
65
+ @change-compute-resource="onChangeComputeResource"
66
+ @select-compute-resource-tree="onSelectComputeResourceTree"
67
+ @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
68
+ @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
69
+ @finish="onFinish"
70
+ @hide="onHideModal"
71
+ />
72
+ <common-vm-actions-add-old
73
+ v-else
74
+ v-model:vm-form="vmForm"
75
+ v-model:selected-create-type="selectedCreateType"
76
+ v-model:is-power-on-by-default="isPowerOnByDefault"
77
+ :project="props.project"
78
+ :nodes="props.nodes"
79
+ :files="props.files"
80
+ :networks-table="props.networksTable"
81
+ :datastore="props.datastore"
82
+ :is-datastore-loading="props.isDatastoreLoading"
83
+ :error-validation-fields="props.errorValidationFields"
84
+ :ready-complete-table-info="props.readyCompleteTableInfo"
85
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
86
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
87
+ :get-datastore-table-func="props.getDatastoreTableFunc"
88
+ :passthrough-devices="props.passthroughDevices"
89
+ :mediated-devices="props.mediatedDevices"
90
+ :templates-tree="props.templatesTree"
91
+ :wizard="wizard"
92
+ :selected-scheme="selectedScheme"
93
+ :template-submit="templateSubmit"
94
+ :name-form-submit="nameFormSubmit"
95
+ :storage-submit="storageSubmit"
96
+ :customize-hardware-submit="customizeHardwareSubmit"
97
+ :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
98
+ :is-sphere="isSphere"
99
+ :compatibility="compatibility"
100
+ :guestOsFamilies="guestOsFamilies"
101
+ :guestOsVersions="guestOsVersions"
102
+ :machineTypes="machineTypes"
103
+ :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
104
+ :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
105
+ :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
106
+ :max-cpus="maxCpus"
107
+ :max-memory="maxMemory"
108
+ :cpu-models="cpuModels"
109
+ :selected-nav-item="selectedNavItem"
110
+ :compatibility-info="compatibilityInfo"
111
+ :is-show-power-on="isShowPowerOn"
112
+ :compute-resource-submit="computeResourceSubmit"
113
+ :data-center="props.dataCenter"
114
+ :compute-resource="props.computeResource"
115
+ :compute-resource-tree="props.computeResourceTree"
116
+ :vmt-settings="props.vmtSettings"
117
+ :is-loading="isLoading"
118
+ @check-name="emits('check-name', $event)"
119
+ @get-storage="emits('get-storage', $event)"
120
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
121
+ @get-active-device-child="emits('get-active-device-child', $event)"
122
+ @show-datastore-child="emits('show-datastore-child', $event)"
123
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
124
+ @get-networks-table="emits('get-networks-table', $event)"
125
+ @get-pci-devices="emits('get-pci-devices')"
126
+ @change-steps="onChangeSteps"
127
+ @change-template="onChangeTemplate"
128
+ @change-name="onChangeName(...$event)"
129
+ @change-storage="onChangeStorage"
130
+ @change-select-options="onChangeSelectOptions"
131
+ @change-compatibility="onChangeCompatibility"
132
+ @change-boot-order="onChangeBootOrder"
133
+ @change-customize-hardware="onChangeCustomizeHardware"
134
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
135
+ @change-compute-resource="onChangeComputeResource"
136
+ @select-compute-resource-tree="onSelectComputeResourceTree"
137
+ @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
138
+ @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
139
+ @finish="onFinish"
140
+ @hide="onHideModal"
141
+ />
142
+ </template>
143
+
144
+ <script setup lang="ts">
145
+ import type {
146
+ UI_I_Localization,
147
+ UI_I_ArbitraryObject,
148
+ } from '~/lib/models/interfaces'
149
+ import type { UI_T_Project } from '~/lib/models/types'
150
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
151
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
152
+ import type {
153
+ UI_I_DatastoreTableItem,
154
+ UI_I_FolderOrFileTreePayload,
155
+ } from '~/lib/models/store/storage/interfaces'
156
+ import type {
157
+ API_UI_I_Error,
158
+ UI_I_ErrorValidationField,
159
+ } from '~/lib/models/store/interfaces'
160
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
161
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
162
+ import type {
163
+ UI_T_AddVmFinishFunc,
164
+ UI_T_SelectedNavItem,
165
+ } from '~/components/common/vm/actions/common/lib/models/types'
166
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
167
+ import type {
168
+ UI_I_ValidationReturn,
169
+ UI_I_WizardStep,
170
+ } from '~/components/atoms/wizard/lib/models/interfaces'
171
+ import type {
172
+ UI_I_Capabilities,
173
+ UI_I_VmForm,
174
+ UI_I_VmFormCash,
175
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
176
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
177
+ import type {
178
+ UI_I_SendDataCpu,
179
+ UI_I_SendDataMemory,
180
+ UI_I_SendDataNewCdDvdDrive,
181
+ UI_I_SendDataNewHardDisk,
182
+ UI_I_SendDataNewNetwork,
183
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
184
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
185
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
186
+ import type {
187
+ UI_I_MediatedDevice,
188
+ UI_I_PciDevice,
189
+ UI_I_VmSettings,
190
+ } from '~/lib/models/store/vm/interfaces'
191
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
192
+ import {
193
+ stepsSchemeInitial,
194
+ stepsFunc,
195
+ dynamicSteps,
196
+ } from '~/components/common/vm/actions/add/lib/config/steps'
197
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
198
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
199
+
200
+ const props = defineProps<{
201
+ project: UI_T_Project
202
+ nodes: UI_I_FileTreeNode[]
203
+ files: UI_I_FileTreeNode[]
204
+ networksTable: UI_I_NetworkTableItem[]
205
+ datastore: UI_I_DatastoreTableItem[]
206
+ isDatastoreLoading: boolean
207
+ errorValidationFields: UI_I_ErrorValidationField[]
208
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
209
+ vmCpuHelpTextSecond: string
210
+ importFromVMWarevSphere: string
211
+ finishFunc: UI_T_AddVmFinishFunc
212
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
213
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
214
+ [UI_T_SelectedNavItem, null | number] | null
215
+ >
216
+ passthroughDevices: UI_I_PciDevice[]
217
+ mediatedDevices: UI_I_MediatedDevice[]
218
+ vmNameInWizard: string
219
+ templatesTree: UI_I_TreeNode[]
220
+ capabilities?: UI_I_Capabilities
221
+ vmtSettings?: UI_I_VmSettings | null
222
+ dataCenter?: UI_I_TreeNode // для сферы
223
+ computeResource?: UI_I_TreeNode // для сферы
224
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
225
+ }>()
226
+
227
+ const emits = defineEmits<{
228
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
229
+ (event: 'get-storage', value: UI_I_TablePayload): void
230
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
231
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
232
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
233
+ (event: 'remove-error-by-title', value: string): void
234
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
235
+ (event: 'get-pci-devices'): void
236
+ (event: 'get-pci-devices'): void
237
+ (event: 'hide'): void
238
+ (event: 'select-template', value: string): void
239
+ (
240
+ event: 'get-compute-resource-tree',
241
+ value: { id: string | number; cb: () => void }
242
+ ): void // для сферы
243
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
244
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
245
+ (event: 'clear-compute-resource-tree'): void // для сферы
246
+ }>()
247
+
248
+ const { $store, $recursion }: any = useNuxtApp()
249
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
250
+
251
+ const localization = computed<UI_I_Localization>(() => useLocal())
252
+
253
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
254
+
255
+ watch(
256
+ () => props.capabilities,
257
+ () => {
258
+ if (props.capabilities) mapCapabilities(props.capabilities)
259
+ },
260
+ { deep: true, immediate: true }
261
+ )
262
+
263
+ const selectedCreateType = ref<string>('0')
264
+
265
+ const wizard: Wizard = new Wizard(
266
+ stepsFunc(localization.value),
267
+ stepsSchemeInitial
268
+ )
269
+ watch(
270
+ selectedCreateType,
271
+ (newValue) => {
272
+ switch (newValue) {
273
+ case '0':
274
+ wizard.changeScheme(isSphere.value ? 1 : 0)
275
+ break
276
+ case '1':
277
+ wizard.changeScheme(isSphere.value ? 6 : 2)
278
+ }
279
+ },
280
+ { immediate: true }
281
+ )
282
+ // if (isSphere.value) wizard.changeScheme(1)
283
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
284
+ // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
285
+
286
+ const isShowPowerOn = computed<boolean>(
287
+ () =>
288
+ wizard.selectedStepId > dynamicSteps.customizeHardware &&
289
+ selectedCreateType.value !== '1'
290
+ )
291
+
292
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
293
+ wizard.changeSteps(value, validationFunc, validateSendData)
294
+ }
295
+ const validationFunc = async (
296
+ value: UI_I_WizardStep[],
297
+ currentStep: UI_I_WizardStep,
298
+ nextStep: UI_I_WizardStep
299
+ ): Promise<UI_I_ValidationReturn> => {
300
+ let stepHasError = false
301
+ let stepShouldStop = {
302
+ ifOnCurrentStep: false,
303
+ ifFromAnyStep: false,
304
+ stoppageStepId: -1,
305
+ }
306
+
307
+ wizard.setLoader(true)
308
+ if (
309
+ wizard.isValidateForStep(
310
+ dynamicSteps.selectTemplate,
311
+ currentStep.id,
312
+ nextStep.id
313
+ )
314
+ ) {
315
+ const templateValidation = await checkTemplate(value)
316
+
317
+ value = templateValidation.newValue
318
+ stepHasError = stepHasError || templateValidation.stepHasError
319
+ } else if (
320
+ wizard.isValidateForStep(
321
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
322
+ currentStep.id,
323
+ nextStep.id
324
+ )
325
+ ) {
326
+ const nameValidation = await onCheckName(value)
327
+
328
+ value = nameValidation.newValue
329
+ stepHasError = stepHasError || nameValidation.stepHasError
330
+ } else if (
331
+ isSphere.value &&
332
+ wizard.isValidateForStep(
333
+ dynamicSteps.selectComputeResource,
334
+ currentStep.id,
335
+ nextStep.id
336
+ )
337
+ ) {
338
+ const computeResourceValidation = await checkComputeResource(value)
339
+
340
+ value = computeResourceValidation.newValue
341
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
342
+ } else if (
343
+ wizard.isValidateForStep(
344
+ dynamicSteps.selectStorage,
345
+ currentStep.id,
346
+ nextStep.id
347
+ )
348
+ ) {
349
+ const storageValidation = await checkStorage(value)
350
+
351
+ value = storageValidation.newValue
352
+
353
+ stepHasError = stepHasError || storageValidation.stepHasError
354
+ } else if (
355
+ wizard.isValidateForStep(
356
+ dynamicSteps.customizeHardware,
357
+ currentStep.id,
358
+ nextStep.id
359
+ )
360
+ ) {
361
+ const validation = await checkCustomizeHardware(value)
362
+
363
+ value = validation.newValue
364
+
365
+ stepHasError = stepHasError || validation.stepHasError
366
+ } else if (
367
+ wizard.isValidateForStep(
368
+ dynamicSteps.customizeHardwareTemplate,
369
+ currentStep.id,
370
+ nextStep.id
371
+ )
372
+ ) {
373
+ const validation = await checkCustomizeHardwareForTemplate(value)
374
+
375
+ value = validation.newValue
376
+
377
+ stepHasError = stepHasError || validation.stepHasError
378
+ }
379
+ wizard.setLoader(false)
380
+
381
+ return {
382
+ newValue: value,
383
+ stepHasError,
384
+ stepShouldStop,
385
+ }
386
+ }
387
+
388
+ const checkTemplate = async (
389
+ value: UI_I_WizardStep[]
390
+ ): Promise<UI_I_ValidationReturn> => {
391
+ let stepHasError = false
392
+
393
+ return new Promise((resolve) => {
394
+ templateSubmit.value = (isValid: boolean) => {
395
+ if (!isValid) {
396
+ stepHasError = wizard.setValidation(
397
+ dynamicSteps.selectTemplate,
398
+ 'template',
399
+ {
400
+ fieldMessage: 'aaa',
401
+ alertMessage: 'aaa',
402
+ }
403
+ )
404
+ } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
405
+ value = wizard.removeValidation(
406
+ dynamicSteps.selectTemplate,
407
+ 'template',
408
+ value
409
+ )
410
+ }
411
+
412
+ resolve({
413
+ stepHasError,
414
+ newValue: value,
415
+ })
416
+ templateSubmit.value = null
417
+ }
418
+ })
419
+ }
420
+ const onCheckName = async (
421
+ value: UI_I_WizardStep[]
422
+ ): Promise<UI_I_ValidationReturn> => {
423
+ let stepHasError = false
424
+
425
+ return new Promise((resolve) => {
426
+ const step = isSphere.value
427
+ ? dynamicSteps.selectNameFolder
428
+ : dynamicSteps.selectName
429
+ nameFormSubmit.value = (isValid: boolean) => {
430
+ if (!isValid) {
431
+ stepHasError = wizard.setValidation(step, 'name', {
432
+ fieldMessage: 'aaa',
433
+ alertMessage: 'aaa',
434
+ })
435
+ } else if (wizard.hasMessage(step, 'name')) {
436
+ value = wizard.removeValidation(step, 'name', value)
437
+ }
438
+
439
+ resolve({
440
+ stepHasError,
441
+ newValue: value,
442
+ })
443
+ nameFormSubmit.value = null
444
+ }
445
+ })
446
+ }
447
+ const checkComputeResource = async (
448
+ value: UI_I_WizardStep[]
449
+ ): Promise<UI_I_ValidationReturn> => {
450
+ let stepHasError = false
451
+
452
+ return new Promise((resolve) => {
453
+ computeResourceSubmit.value = (isValid: boolean) => {
454
+ if (!isValid) {
455
+ stepHasError = wizard.setValidation(
456
+ dynamicSteps.selectComputeResource,
457
+ 'computeResource',
458
+ {
459
+ fieldMessage: 'aaa',
460
+ alertMessage: 'aaa',
461
+ }
462
+ )
463
+ } else if (
464
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
465
+ ) {
466
+ value = wizard.removeValidation(
467
+ dynamicSteps.selectComputeResource,
468
+ 'computeResource',
469
+ value
470
+ )
471
+ }
472
+
473
+ resolve({
474
+ stepHasError,
475
+ newValue: value,
476
+ })
477
+ computeResourceSubmit.value = null
478
+ }
479
+ })
480
+ }
481
+ const checkStorage = async (
482
+ value: UI_I_WizardStep[]
483
+ ): Promise<UI_I_ValidationReturn> => {
484
+ let stepHasError = false
485
+
486
+ return new Promise((resolve) => {
487
+ storageSubmit.value = (isValid: boolean) => {
488
+ if (!isValid) {
489
+ stepHasError = wizard.setValidation(
490
+ dynamicSteps.selectStorage,
491
+ 'storage',
492
+ {
493
+ fieldMessage: 'aaa',
494
+ alertMessage: 'aaa',
495
+ }
496
+ )
497
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
498
+ value = wizard.removeValidation(
499
+ dynamicSteps.selectStorage,
500
+ 'storage',
501
+ value
502
+ )
503
+ }
504
+
505
+ resolve({
506
+ stepHasError,
507
+ newValue: value,
508
+ })
509
+ storageSubmit.value = null
510
+ }
511
+ })
512
+ }
513
+ const checkCustomizeHardware = async (
514
+ value: UI_I_WizardStep[]
515
+ ): Promise<UI_I_ValidationReturn> => {
516
+ let stepHasError = false
517
+
518
+ return new Promise((resolve) => {
519
+ customizeHardwareSubmit.value = (isValid: boolean) => {
520
+ if (!isValid) {
521
+ stepHasError = wizard.setValidation(
522
+ dynamicSteps.customizeHardware,
523
+ 'customizeHardware',
524
+ {
525
+ fieldMessage: 'aaa',
526
+ alertMessage: 'aaa',
527
+ }
528
+ )
529
+ } else if (
530
+ wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
531
+ ) {
532
+ wizard.removeValidationLocal(
533
+ dynamicSteps.customizeHardware,
534
+ 'customizeHardware'
535
+ )
536
+ value = wizard.removeValidation(
537
+ dynamicSteps.customizeHardware,
538
+ 'customizeHardware',
539
+ value
540
+ )
541
+ }
542
+
543
+ resolve({
544
+ stepHasError,
545
+ newValue: value,
546
+ })
547
+ storageSubmit.value = null
548
+ }
549
+ })
550
+ }
551
+ const checkCustomizeHardwareForTemplate = async (
552
+ value: UI_I_WizardStep[]
553
+ ): Promise<UI_I_ValidationReturn> => {
554
+ let stepHasError = false
555
+
556
+ return new Promise((resolve) => {
557
+ customizeHardwareForTemplateSubmit.value = (isValid: boolean) => {
558
+ if (!isValid) {
559
+ stepHasError = wizard.setValidation(
560
+ dynamicSteps.customizeHardwareTemplate,
561
+ 'customizeHardwareForTemplate',
562
+ {
563
+ fieldMessage: 'aaa',
564
+ alertMessage: 'aaa',
565
+ }
566
+ )
567
+ } else if (
568
+ wizard.hasMessage(
569
+ dynamicSteps.customizeHardwareTemplate,
570
+ 'customizeHardwareForTemplate'
571
+ )
572
+ ) {
573
+ value = wizard.removeValidation(
574
+ dynamicSteps.customizeHardwareTemplate,
575
+ 'customizeHardwareForTemplate',
576
+ value
577
+ )
578
+ }
579
+
580
+ resolve({
581
+ stepHasError,
582
+ newValue: value,
583
+ })
584
+ storageSubmit.value = null
585
+ }
586
+ })
587
+ }
588
+
589
+ const storageIdCash = ref<string | null>(null)
590
+ const vmForm = ref<UI_I_VmForm>({
591
+ name: '',
592
+ compatibility: '',
593
+ guestMachineType: null,
594
+ guestOsFamily: null,
595
+ guestOsVersion: null,
596
+ computeResource: null,
597
+ storage: null,
598
+ locationPath: '',
599
+ dataCenter: null,
600
+ })
601
+
602
+ // TODO remove (not used)
603
+ const vmFormCash = ref<UI_I_VmFormCash>({
604
+ dataCenterId: null,
605
+ computeResourceTypeAndId: null,
606
+ })
607
+
608
+ const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
609
+ vmForm.value.name = name
610
+ if (isSphere.value) {
611
+ vmForm.value.locationPath = node.id
612
+ vmForm.value.dataCenter = $recursion.findParentByValue(
613
+ node,
614
+ 'datacenter',
615
+ 'type',
616
+ 'parent'
617
+ )
618
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
619
+ }
620
+ }
621
+ // // Для сферы
622
+ const computeResourcePath = ref<string>('')
623
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
624
+ emits('select-compute-resource-tree', node)
625
+ computeResourcePath.value = node.id
626
+ }
627
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
628
+ vmForm.value.computeResource = node
629
+ // const type = node.type.toUpperCase()
630
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
631
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
632
+ }
633
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
634
+ if (!storage) return
635
+
636
+ vmForm.value.storage = storage
637
+ storageIdCash.value = storage.id
638
+ }
639
+ const compatibilityInfo = ref<string>('')
640
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
641
+ vmForm.value.compatibility = compatibility.value
642
+
643
+ const version = compatibility.value.split('-')[1]
644
+ compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
645
+ }
646
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
647
+ const onChangeCustomizeHardware = (
648
+ data: UI_I_SendDataCustomizeHardware
649
+ ): void => {
650
+ customizeHardware.value = data
651
+ }
652
+
653
+ const virtualHardwareHardDisksLocal = computed<
654
+ UI_I_SendDataNewHardDisk[] | null
655
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
656
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
657
+ () => customizeHardware.value?.virtualHardware?.networks || null
658
+ )
659
+ const virtualHardwareCdDvdDrivesLocal = computed<
660
+ UI_I_SendDataNewCdDvdDrive[] | null
661
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
662
+
663
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
664
+ () => customizeHardware.value?.virtualHardware?.cpu || null
665
+ )
666
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
667
+ () => customizeHardware.value?.virtualHardware?.memory || null
668
+ )
669
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
670
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
671
+ null
672
+ )
673
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
674
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
675
+ virtualHardwareHardDisks.value = data[0]
676
+ virtualHardwareCdDvdDrives.value = data[1]
677
+ virtualHardwareNetworks.value = data[2]
678
+ }
679
+
680
+ const isPowerOnByDefault = ref<boolean>(true)
681
+
682
+ watch(
683
+ () => props.vmNameInWizard,
684
+ (newValue) => {
685
+ vmForm.value.name = newValue
686
+ }
687
+ )
688
+
689
+ const validateSendData = async (
690
+ value: UI_I_WizardStep[]
691
+ ): Promise<UI_I_ValidationReturn> => {
692
+ wizard.setLoader(true)
693
+ let stepHasError = false
694
+
695
+ const data = await props.validateSendDataFunc(
696
+ vmForm.value,
697
+ virtualHardwareCpu.value,
698
+ virtualHardwareMemory.value,
699
+ customizeHardware.value,
700
+ virtualHardwareNetworks.value,
701
+ virtualHardwareHardDisks.value,
702
+ virtualHardwareCdDvdDrives.value,
703
+ isPowerOnByDefault.value,
704
+ localization.value,
705
+ vmForm.value.locationPath, // для сферы
706
+ computeResourcePath.value // для сферы
707
+ )
708
+
709
+ wizard.setLoader(false)
710
+ if (data) {
711
+ stepHasError = true
712
+ selectedNavItem.value = data[0]
713
+ data[1] !== null && wizard.selectStepHard(data[1])
714
+ }
715
+
716
+ return {
717
+ stepHasError,
718
+ newValue: value,
719
+ }
720
+ }
721
+
722
+ const isLoading = ref<boolean>(false)
723
+ const onFinish = (): void => {
724
+ isLoading.value = true
725
+ wizard.setLoader(false)
726
+ props
727
+ .finishFunc(
728
+ vmForm.value,
729
+ virtualHardwareCpu.value,
730
+ virtualHardwareMemory.value,
731
+ customizeHardware.value,
732
+ virtualHardwareNetworks.value,
733
+ virtualHardwareHardDisks.value,
734
+ virtualHardwareCdDvdDrives.value,
735
+ isPowerOnByDefault.value,
736
+ localization.value,
737
+ vmForm.value.locationPath, // для сферы
738
+ computeResourcePath.value, // для сферы
739
+ false,
740
+ selectedTemplate.value,
741
+ selectedCreateType.value
742
+ )
743
+ .then(() => {
744
+ onHideModal()
745
+ wizard.setLoader(false)
746
+ isLoading.value = false
747
+ })
748
+ }
749
+
750
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
751
+
752
+ const nameFormSubmit = ref<null | Function>(null)
753
+ const templateSubmit = ref<null | Function>(null)
754
+ const computeResourceSubmit = ref<null | Function>(null)
755
+ const storageSubmit = ref<null | Function>(null)
756
+ const customizeHardwareSubmit = ref<null | Function>(null)
757
+ const customizeHardwareForTemplateSubmit = ref<null | Function>(null)
758
+ const compatibility = ref<UI_I_OptionItem[]>(capabilities.value.compatibility)
759
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(
760
+ capabilities.value.guestOsFamilies
761
+ )
762
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
763
+ capabilities.value.guestOsVersions
764
+ )
765
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
766
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.value.cpuModels)
767
+ const maxCpus = ref<number>(capabilities.value.maxCpus)
768
+ const maxMemory = ref<number>(capabilities.value.maxMemory)
769
+
770
+ const selectedTemplate = ref<string>('')
771
+ const onChangeTemplate = (node: UI_I_TreeNode): void => {
772
+ selectedTemplate.value = node.id.toString()
773
+ emits('select-template', node.id.toString())
774
+ }
775
+ const selectedOptions = ref<string[]>([])
776
+ const onChangeSelectOptions = (options: string[]) => {
777
+ selectedOptions.value = options
778
+ if (
779
+ options.includes('customize-os') &&
780
+ options.includes('customize-hardware')
781
+ ) {
782
+ wizard.changeScheme(isSphere.value ? 9 : 5)
783
+ } else if (options.includes('customize-os')) {
784
+ wizard.changeScheme(isSphere.value ? 7 : 3)
785
+ } else if (options.includes('customize-hardware')) {
786
+ wizard.changeScheme(isSphere.value ? 8 : 4)
787
+ } else {
788
+ wizard.changeScheme(isSphere.value ? 6 : 2)
789
+ }
790
+
791
+ isPowerOnByDefault.value = options.includes('power-on')
792
+ }
793
+
794
+ const onHideModal = (): void => {
795
+ emits('hide')
796
+ }
797
+
798
+ watch(
799
+ () => props.vmtSettings,
800
+ (newValue) => {
801
+ if (newValue) {
802
+ vmForm.value.name = newValue.name
803
+ vmForm.value.compatibility =
804
+ newValue.compatibility || vmForm.value.compatibility
805
+ vmForm.value.storage = newValue.storage
806
+ if (customizeHardware.value?.virtualHardware) {
807
+ customizeHardware.value.virtualHardware.cdDvdDrives =
808
+ newValue.cdDvdDrives
809
+ customizeHardware.value.virtualHardware.hardDisks = newValue.hardDisks
810
+ customizeHardware.value.virtualHardware.networks = newValue.networks
811
+ customizeHardware.value.virtualHardware.cpu = newValue.cpu
812
+ customizeHardware.value.virtualHardware.memory = newValue.memory
813
+ customizeHardware.value.virtualHardware.videoCard = newValue.videoCard
814
+ customizeHardware.value.virtualHardware.usbController =
815
+ newValue.usbController
816
+ customizeHardware.value.virtualHardware.pciDevices = newValue.pciDevices
817
+ customizeHardware.value.vmOptions = newValue.options
818
+ }
819
+ maxCpus.value = newValue.cpu.max_vcpus
820
+ cpuModels.value = newValue.cpu.model
821
+ isPowerOnByDefault.value = false
822
+ }
823
+ }
824
+ )
825
+ </script>
826
+
827
+ <style scoped lang="scss"></style>