bfg-common 1.3.124 → 1.3.125

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