bfg-common 1.2.206 → 1.2.207

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