bfg-common 1.5.835 → 1.5.836
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.
- package/assets/localization/local_be.json +3 -7
- package/assets/localization/local_en.json +3 -7
- package/assets/localization/local_hy.json +3 -7
- package/assets/localization/local_kk.json +3 -7
- package/assets/localization/local_ru.json +3 -7
- package/assets/localization/local_zh.json +3 -7
- package/components/common/layout/theHeader/Old.vue +1 -5
- package/components/common/monitor/advanced/tools/chartOptionsModal/lib/utils/checkSubmit.ts +1 -1
- package/components/common/pages/backups/modals/lib/config/restore.ts +1 -0
- package/components/common/pages/backups/modals/lib/models/interfaces.ts +1 -0
- package/components/common/vm/actions/add/Add.vue +2 -0
- package/components/common/vm/actions/add/New.vue +3 -0
- package/components/common/vm/actions/add/Old.vue +3 -0
- package/components/common/vm/actions/clone/Clone.vue +65 -61
- package/components/common/vm/actions/clone/new/New.vue +2 -0
- package/components/common/vm/actions/clone/old/Old.vue +2 -0
- package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +3 -0
- package/components/common/vm/actions/common/customizeHardware/New.vue +3 -0
- package/components/common/vm/actions/common/customizeHardware/Old.vue +3 -0
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/New.vue +22 -2
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/Old.vue +20 -2
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +107 -4
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/dropdownItems.ts +9 -3
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/New.vue +73 -0
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/NewUsbDevice.vue +72 -0
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/Old.vue +65 -0
- package/components/common/vm/actions/common/lib/models/interfaces.ts +1 -0
- package/components/common/vm/actions/editSettings/EditSettings.vue +3 -0
- package/components/common/vm/actions/editSettings/Old.vue +3 -0
- package/components/common/vm/actions/editSettings/new/New.vue +3 -0
- package/components/common/vm/actions/lib/utils.ts +2 -0
- package/lib/models/store/vm/interfaces.ts +2 -0
- package/package.json +1 -1
|
@@ -3585,7 +3585,9 @@
|
|
|
3585
3585
|
"selectOptions": "Выберыце параметры",
|
|
3586
3586
|
"configureOptionsForNewVm": "Наладзьце параметры запуску і вызначце тып кланавання для новай віртуальнай машыны.",
|
|
3587
3587
|
"configureOptionsForCloneVm": "Наладзьце параметры запуску, аперацыйнай сістэмы і абсталявання новай віртуальнай машыны.",
|
|
3588
|
-
"vmStoragePolicy": "
|
|
3588
|
+
"vmStoragePolicy": "Палітыка захоўвання ВМ",
|
|
3589
|
+
"hostUsbDevice": "USB-прылада хоста",
|
|
3590
|
+
"newHostUsbDevice": "Новая USB-прылада хоста"
|
|
3589
3591
|
},
|
|
3590
3592
|
"feedback": {
|
|
3591
3593
|
"additionalDetailsHelp": "Даведка па дадатковых звестках",
|
|
@@ -3990,11 +3992,5 @@
|
|
|
3990
3992
|
"autostart": "Аўтазапуск",
|
|
3991
3993
|
"enableAutostart": "Уключыць аўтазапуск",
|
|
3992
3994
|
"disableAutostart": "Адключыць аўтазапуск"
|
|
3993
|
-
},
|
|
3994
|
-
"temp": {
|
|
3995
|
-
"title": "Віртуальны metro storage кластар",
|
|
3996
|
-
"stepTitle": "Выберыце зыходны хост",
|
|
3997
|
-
"serverAddress": "Адрас сервера",
|
|
3998
|
-
"fqdnOrIpAddress": "FQDN або IP-адрас"
|
|
3999
3995
|
}
|
|
4000
3996
|
}
|
|
@@ -3589,7 +3589,9 @@
|
|
|
3589
3589
|
"selectOptions": "Select Options",
|
|
3590
3590
|
"configureOptionsForNewVm": "Configure startup parameters and define the cloning type for the new virtual machine.",
|
|
3591
3591
|
"configureOptionsForCloneVm": "Configure startup parameters, operating system, and hardware for the new virtual machine.",
|
|
3592
|
-
"vmStoragePolicy": "VM storage policy"
|
|
3592
|
+
"vmStoragePolicy": "VM storage policy",
|
|
3593
|
+
"hostUsbDevice": "Host USB Device",
|
|
3594
|
+
"newHostUsbDevice": "New Host USB Device"
|
|
3593
3595
|
},
|
|
3594
3596
|
"feedback": {
|
|
3595
3597
|
"additionalDetailsHelp": "Additional Details Help",
|
|
@@ -3994,11 +3996,5 @@
|
|
|
3994
3996
|
"autostart": "Autostart",
|
|
3995
3997
|
"enableAutostart": "Enable autostart",
|
|
3996
3998
|
"disableAutostart": "Disable autostart"
|
|
3997
|
-
},
|
|
3998
|
-
"temp": {
|
|
3999
|
-
"title": "Virtual metro storage cluster",
|
|
4000
|
-
"stepTitle": "Select source host",
|
|
4001
|
-
"serverAddress": "Server Address",
|
|
4002
|
-
"fqdnOrIpAddress": "FQDN or IP address"
|
|
4003
3999
|
}
|
|
4004
4000
|
}
|
|
@@ -3589,7 +3589,9 @@
|
|
|
3589
3589
|
"selectOptions": "Ընտրեք պարամետրերը",
|
|
3590
3590
|
"configureOptionsForNewVm": "Կարգավորեք մեկնարկային պարամետրերը և սահմանեք նոր վիրտուալ մեքենայի կլոնավորման տեսակը:",
|
|
3591
3591
|
"configureOptionsForCloneVm": "Կարգավորեք նոր վիրտուալ մեքենայի մեկնարկային պարամետրերը, օպերացիոն համակարգը և սարքավորումները:",
|
|
3592
|
-
"vmStoragePolicy": "
|
|
3592
|
+
"vmStoragePolicy": "ՎՄ պահպանման քաղաքականություն",
|
|
3593
|
+
"hostUsbDevice": "Հոստի USB սարք",
|
|
3594
|
+
"newHostUsbDevice": "Հոստի նոր USB սարք"
|
|
3593
3595
|
},
|
|
3594
3596
|
"feedback": {
|
|
3595
3597
|
"additionalDetailsHelp": "Լրացուցիչ մանրամասներ Օգնություն",
|
|
@@ -3994,11 +3996,5 @@
|
|
|
3994
3996
|
"autostart": "Ավտոմատ մեկնարկ",
|
|
3995
3997
|
"enableAutostart": "Միացնել ավտոմատ մեկնարկը",
|
|
3996
3998
|
"disableAutostart": "Անջատել ավտոմատ մեկնարկը"
|
|
3997
|
-
},
|
|
3998
|
-
"temp": {
|
|
3999
|
-
"title": "Վիրտուալ metro storage կլաստեր",
|
|
4000
|
-
"stepTitle": "Ընտրեք աղբյուրի հոստ",
|
|
4001
|
-
"serverAddress": "Սերվերի հասցե",
|
|
4002
|
-
"fqdnOrIpAddress": "FQDN կամ IP հասցե"
|
|
4003
3999
|
}
|
|
4004
4000
|
}
|
|
@@ -3589,7 +3589,9 @@
|
|
|
3589
3589
|
"selectOptions": "Параметрлерді таңдаңыз",
|
|
3590
3590
|
"configureOptionsForNewVm": "Жаңа виртуалды машинаның іске қосу параметрлерін баптаңыз және клондау түрін анықтаңыз.",
|
|
3591
3591
|
"configureOptionsForCloneVm": "Жаңа виртуалды машинаның іске қосу параметрлерін, операциялық жүйесін және жабдықтарын баптаңыз.",
|
|
3592
|
-
"vmStoragePolicy": "
|
|
3592
|
+
"vmStoragePolicy": "ВМ сақтау саясаты",
|
|
3593
|
+
"hostUsbDevice": "Хосттың USB құрылғысы",
|
|
3594
|
+
"newHostUsbDevice": "Хосттың жаңа USB құрылғысы"
|
|
3593
3595
|
},
|
|
3594
3596
|
"feedback": {
|
|
3595
3597
|
"additionalDetailsHelp": "Қосымша мәліметтер анықтамасы",
|
|
@@ -3994,11 +3996,5 @@
|
|
|
3994
3996
|
"autostart": "Автожаңғалту",
|
|
3995
3997
|
"enableAutostart": "Автожаңғалтуды қосу",
|
|
3996
3998
|
"disableAutostart": "Автожаңғалтуды өшіру"
|
|
3997
|
-
},
|
|
3998
|
-
"temp": {
|
|
3999
|
-
"title": "Виртуалды metro storage кластері",
|
|
4000
|
-
"stepTitle": "Дереккөз хостты таңдаңыз",
|
|
4001
|
-
"serverAddress": "Сервердің мекенжайы",
|
|
4002
|
-
"fqdnOrIpAddress": "FQDN немесе IP-мекенжай"
|
|
4003
3999
|
}
|
|
4004
4000
|
}
|
|
@@ -3588,7 +3588,9 @@
|
|
|
3588
3588
|
"selectOptions": "Выберите параметры",
|
|
3589
3589
|
"configureOptionsForNewVm": "Настройте параметры запуска и определите тип клонирования для новой виртуальной машины.",
|
|
3590
3590
|
"configureOptionsForCloneVm": "Настройте параметры запуска, операционной системы и оборудования новой виртуальной машины.",
|
|
3591
|
-
"vmStoragePolicy": "
|
|
3591
|
+
"vmStoragePolicy": "Политика хранения ВМ",
|
|
3592
|
+
"hostUsbDevice": "USB-устройство хоста",
|
|
3593
|
+
"newHostUsbDevice": "Новое USB-устройство хоста"
|
|
3592
3594
|
},
|
|
3593
3595
|
"feedback": {
|
|
3594
3596
|
"additionalDetailsHelp": "Дополнительная информация Помощь",
|
|
@@ -3993,11 +3995,5 @@
|
|
|
3993
3995
|
"autostart": "Автозапуск",
|
|
3994
3996
|
"enableAutostart": "Автозапуск вкл",
|
|
3995
3997
|
"disableAutostart": "Автозапуск выкл"
|
|
3996
|
-
},
|
|
3997
|
-
"temp": {
|
|
3998
|
-
"title": "Виртуальный metro storage кластер",
|
|
3999
|
-
"stepTitle": "Выберите исходный хост",
|
|
4000
|
-
"serverAddress": "Адрес сервера",
|
|
4001
|
-
"fqdnOrIpAddress": "FQDN или IP-адрес"
|
|
4002
3998
|
}
|
|
4003
3999
|
}
|
|
@@ -3586,7 +3586,9 @@
|
|
|
3586
3586
|
"selectOptions": "选择选项",
|
|
3587
3587
|
"configureOptionsForNewVm": "配置启动参数并定义新虚拟机的克隆类型。",
|
|
3588
3588
|
"configureOptionsForCloneVm": "配置新虚拟机的启动参数、操作系统和硬件。",
|
|
3589
|
-
"vmStoragePolicy": "
|
|
3589
|
+
"vmStoragePolicy": "虚拟机存储策略",
|
|
3590
|
+
"hostUsbDevice": "主机USB设备",
|
|
3591
|
+
"newHostUsbDevice": "新主机USB设备"
|
|
3590
3592
|
},
|
|
3591
3593
|
"feedback": {
|
|
3592
3594
|
"additionalDetailsHelp": "其他详细信息帮助",
|
|
@@ -3991,11 +3993,5 @@
|
|
|
3991
3993
|
"autostart": "自动启动",
|
|
3992
3994
|
"enableAutostart": "启用自动启动",
|
|
3993
3995
|
"disableAutostart": "禁用自动启动"
|
|
3994
|
-
},
|
|
3995
|
-
"temp": {
|
|
3996
|
-
"title": "虚拟Metro存储集群",
|
|
3997
|
-
"stepTitle": "选择源主机",
|
|
3998
|
-
"serverAddress": "服务器地址",
|
|
3999
|
-
"fqdnOrIpAddress": "FQDN或IP地址"
|
|
4000
3996
|
}
|
|
4001
3997
|
}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
>
|
|
30
30
|
</nuxt-link>
|
|
31
31
|
</div>
|
|
32
|
-
<form
|
|
32
|
+
<form>
|
|
33
33
|
<atoms-input-search />
|
|
34
34
|
</form>
|
|
35
35
|
|
|
@@ -146,10 +146,6 @@ const onUpdateLanguage = (language: string): void => {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
const isShowFeedback = ref<boolean>(false)
|
|
149
|
-
|
|
150
|
-
const onTemp = (): void => {
|
|
151
|
-
useLocalStorage('temp', true)
|
|
152
|
-
}
|
|
153
149
|
</script>
|
|
154
150
|
|
|
155
151
|
<style scoped lang="scss">
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/models/interfaces'
|
|
2
2
|
import {
|
|
3
3
|
allowedHostCpuFieldNotObject,
|
|
4
|
-
|
|
4
|
+
allowedHostNetworkFieldNotObject,
|
|
5
5
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/config'
|
|
6
6
|
|
|
7
7
|
export const checkIsDisabledSubmit = (
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
18
18
|
:import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
|
|
19
19
|
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
20
|
+
:usb-devices="props.usbDevices"
|
|
20
21
|
:passthrough-devices="props.passthroughDevices"
|
|
21
22
|
:mediated-devices="props.mediatedDevices"
|
|
22
23
|
:templates-tree="props.templatesTree"
|
|
@@ -143,6 +144,7 @@ const props = withDefaults(
|
|
|
143
144
|
validateSendDataFunc: UI_T_AddVmFinishFunc<
|
|
144
145
|
[UI_T_SelectedNavItem, null | number] | null
|
|
145
146
|
>
|
|
147
|
+
usbDevices: any[]
|
|
146
148
|
passthroughDevices: UI_I_PciDevice[]
|
|
147
149
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
148
150
|
vmNameInWizard: string
|
|
@@ -269,6 +269,7 @@
|
|
|
269
269
|
:datastore="props.datastore"
|
|
270
270
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
271
271
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
272
|
+
:usb-devices="props.usbDevices"
|
|
272
273
|
:passthrough-devices="props.passthroughDevices"
|
|
273
274
|
:mediated-devices="props.mediatedDevices"
|
|
274
275
|
:compute-resource="computeResource"
|
|
@@ -329,6 +330,7 @@
|
|
|
329
330
|
:datastore="props.datastore"
|
|
330
331
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
331
332
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
333
|
+
:usb-devices="props.usbDevices"
|
|
332
334
|
:passthrough-devices="props.passthroughDevices"
|
|
333
335
|
:mediated-devices="props.mediatedDevices"
|
|
334
336
|
:compute-resource="computeResource"
|
|
@@ -462,6 +464,7 @@ const props = withDefaults(
|
|
|
462
464
|
vmCpuHelpTextSecond: string
|
|
463
465
|
importFromVMWarevSphere: string
|
|
464
466
|
getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
|
|
467
|
+
usbDevices: any[]
|
|
465
468
|
passthroughDevices: UI_I_PciDevice[]
|
|
466
469
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
467
470
|
templatesTree: UI_I_TreeNode[]
|
|
@@ -118,6 +118,7 @@
|
|
|
118
118
|
:datastore="props.datastore"
|
|
119
119
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
120
120
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
121
|
+
:usb-devices="props.usbDevices"
|
|
121
122
|
:passthrough-devices="props.passthroughDevices"
|
|
122
123
|
:mediated-devices="props.mediatedDevices"
|
|
123
124
|
:compute-resource="computeResource"
|
|
@@ -156,6 +157,7 @@
|
|
|
156
157
|
:datastore="props.datastore"
|
|
157
158
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
158
159
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
160
|
+
:usb-devices="props.usbDevices"
|
|
159
161
|
:passthrough-devices="props.passthroughDevices"
|
|
160
162
|
:mediated-devices="props.mediatedDevices"
|
|
161
163
|
:compute-resource="computeResource"
|
|
@@ -261,6 +263,7 @@ const props = withDefaults(
|
|
|
261
263
|
vmCpuHelpTextSecond: string
|
|
262
264
|
importFromVMWarevSphere: string
|
|
263
265
|
getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
|
|
266
|
+
usbDevices: any[]
|
|
264
267
|
passthroughDevices: UI_I_PciDevice[]
|
|
265
268
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
266
269
|
templatesTree: UI_I_TreeNode[]
|
|
@@ -1,64 +1,67 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
2
|
+
<div>
|
|
3
|
+
<component
|
|
4
|
+
:is="currentComponent"
|
|
5
|
+
v-model="model"
|
|
6
|
+
v-model:scheduler-task-form="schedulerTaskForm"
|
|
7
|
+
v-model:compute-resource="vmForm.computeResource"
|
|
8
|
+
v-model:location="location"
|
|
9
|
+
:project="props.project"
|
|
10
|
+
:nodes="props.nodes"
|
|
11
|
+
:files="props.files"
|
|
12
|
+
:networks-table="props.networksTable"
|
|
13
|
+
:datastore="props.datastore"
|
|
14
|
+
:is-datastore-loading="props.isDatastoreLoading"
|
|
15
|
+
:error-validation-fields="props.errorValidationFields"
|
|
16
|
+
:ready-complete-table-info="props.readyCompleteTableInfo"
|
|
17
|
+
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
18
|
+
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
19
|
+
:usb-devices="props.usbDevices"
|
|
20
|
+
:passthrough-devices="props.passthroughDevices"
|
|
21
|
+
:mediated-devices="props.mediatedDevices"
|
|
22
|
+
:name-request-url="props.nameRequestUrl"
|
|
23
|
+
:selected-virtual-machine="props.selectedVirtualMachine"
|
|
24
|
+
:is-new-vm-from-template="props.isNewVmFromTemplate"
|
|
25
|
+
:compute-resource-tree="props.computeResourceTree"
|
|
26
|
+
:location-nodes="props.locationNodes"
|
|
27
|
+
:wizard="wizard"
|
|
28
|
+
:selected-scheme="selectedScheme"
|
|
29
|
+
:title="title"
|
|
30
|
+
:name-form-submit="nameFormSubmit"
|
|
31
|
+
:storage-submit="storageSubmit"
|
|
32
|
+
:customize-hardware-submit="customizeHardwareSubmit"
|
|
33
|
+
:selected-nav-item="selectedNavItem"
|
|
34
|
+
:is-loading="isLoading"
|
|
35
|
+
:allowed-location-kinds="allowedLocationKinds"
|
|
36
|
+
:is-sphere="isSphere"
|
|
37
|
+
:location-description="locationDescription"
|
|
38
|
+
:name-test-ids="nameTestIds"
|
|
39
|
+
:guest-os-families="guestOsFamilies"
|
|
40
|
+
:guest-os-versions="guestOsVersions"
|
|
41
|
+
:machine-types="machineTypes"
|
|
42
|
+
:dynamic-steps="dynamicSteps"
|
|
43
|
+
:is-loading-compute-tree="isLoadingComputeTree"
|
|
44
|
+
:compute-resource-alert="computeResourceAlert"
|
|
45
|
+
:compatibility-text="compatibilityText"
|
|
46
|
+
:compatibility-info="compatibilityInfo"
|
|
47
|
+
:max-memory="maxMemory"
|
|
48
|
+
:cpu-models="cpuModels"
|
|
49
|
+
@get-folders-or-files="emits('get-folders-or-files', $event)"
|
|
50
|
+
@change-name="onChangeName"
|
|
51
|
+
@change-storage="onChangeStorage"
|
|
52
|
+
@change-select-options="onChangeSelectOptions"
|
|
53
|
+
@change-clone-count="cloneCount = $event"
|
|
54
|
+
@get-storage="emits('get-storage', $event)"
|
|
55
|
+
@get-active-device-child="emits('get-active-device-child', $event)"
|
|
56
|
+
@show-datastore-child="emits('show-datastore-child', $event)"
|
|
57
|
+
@remove-error-by-title="emits('remove-error-by-title', $event)"
|
|
58
|
+
@get-networks-table="emits('get-networks-table', $event)"
|
|
59
|
+
@get-pci-devices="emits('get-pci-devices')"
|
|
60
|
+
@change-steps="onChangeSteps"
|
|
61
|
+
@hide="onHideModal"
|
|
62
|
+
@finish="onFinish"
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
62
65
|
</template>
|
|
63
66
|
|
|
64
67
|
<script setup lang="ts">
|
|
@@ -121,6 +124,7 @@ const props = withDefaults(
|
|
|
121
124
|
finishFunc: any
|
|
122
125
|
getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
|
|
123
126
|
validateSendDataFunc: any
|
|
127
|
+
usbDevices: any[]
|
|
124
128
|
passthroughDevices: UI_I_PciDevice[]
|
|
125
129
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
126
130
|
vmNameInWizard: string
|
|
@@ -657,7 +661,7 @@ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
|
|
|
657
661
|
|
|
658
662
|
const compatibility = computed<UI_I_OptionItem[]>(() => capabilities.value.compatibility)
|
|
659
663
|
const compatibilityInfo = computed<string>(() => {
|
|
660
|
-
const selectedOption = compatibility.value.find(item => item.value === model.value
|
|
664
|
+
const selectedOption = compatibility.value.find(item => item.value === model.value?.compatibility)
|
|
661
665
|
|
|
662
666
|
if (!selectedOption) return ''
|
|
663
667
|
|
|
@@ -174,6 +174,7 @@
|
|
|
174
174
|
:networks-table="props.networksTable"
|
|
175
175
|
:error-validation-fields="props.errorValidationFields"
|
|
176
176
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
177
|
+
:usb-devices="props.usbDevices"
|
|
177
178
|
:passthrough-devices="props.passthroughDevices"
|
|
178
179
|
:mediated-devices="props.mediatedDevices"
|
|
179
180
|
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
@@ -314,6 +315,7 @@ const props = withDefaults(
|
|
|
314
315
|
readyCompleteTableInfo: UI_I_TableInfoItem[]
|
|
315
316
|
vmCpuHelpTextSecond: string
|
|
316
317
|
getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
|
|
318
|
+
usbDevices: any[]
|
|
317
319
|
passthroughDevices: UI_I_PciDevice[]
|
|
318
320
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
319
321
|
nameRequestUrl: string
|
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
:networks-table="props.networksTable"
|
|
104
104
|
:error-validation-fields="props.errorValidationFields"
|
|
105
105
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
106
|
+
:usb-devices="props.usbDevices"
|
|
106
107
|
:passthrough-devices="props.passthroughDevices"
|
|
107
108
|
:mediated-devices="props.mediatedDevices"
|
|
108
109
|
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
@@ -177,6 +178,7 @@ const props = withDefaults(
|
|
|
177
178
|
readyCompleteTableInfo: UI_I_TableInfoItem[]
|
|
178
179
|
vmCpuHelpTextSecond: string
|
|
179
180
|
getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
|
|
181
|
+
usbDevices: any[]
|
|
180
182
|
passthroughDevices: UI_I_PciDevice[]
|
|
181
183
|
mediatedDevices: UI_I_MediatedDevice[]
|
|
182
184
|
nameRequestUrl: string
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
:is-edit="props.isEdit"
|
|
24
24
|
:is-clone="props.isClone"
|
|
25
25
|
:state="props.state"
|
|
26
|
+
:usb-devices="props.usbDevices"
|
|
26
27
|
:passthrough-devices="props.passthroughDevices"
|
|
27
28
|
:mediated-devices="props.mediatedDevices"
|
|
28
29
|
:project="props.project"
|
|
@@ -101,6 +102,7 @@ const props = withDefaults(
|
|
|
101
102
|
isEdit?: boolean
|
|
102
103
|
isClone?: boolean
|
|
103
104
|
state?: string | number
|
|
105
|
+
usbDevices?: any[]
|
|
104
106
|
passthroughDevices?: UI_I_PciDevice[]
|
|
105
107
|
mediatedDevices?: UI_I_MediatedDevice[]
|
|
106
108
|
project?: UI_T_Project
|
|
@@ -119,6 +121,7 @@ const props = withDefaults(
|
|
|
119
121
|
isEdit: false,
|
|
120
122
|
isClone: false,
|
|
121
123
|
state: undefined,
|
|
124
|
+
usbDevices: undefined,
|
|
122
125
|
passthroughDevices: undefined,
|
|
123
126
|
mediatedDevices: undefined,
|
|
124
127
|
project: undefined,
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
:datastore="props.datastore"
|
|
46
46
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
47
47
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
48
|
+
:usb-devices="props.usbDevices"
|
|
48
49
|
:passthrough-devices="props.passthroughDevices"
|
|
49
50
|
:mediated-devices="props.mediatedDevices"
|
|
50
51
|
:project="props.project"
|
|
@@ -136,6 +137,7 @@ const props = withDefaults(
|
|
|
136
137
|
hardDisks?: UI_I_SendDataNewHardDisk[] | null
|
|
137
138
|
pciDevices?: UI_I_SendDataNewPciDevice[]
|
|
138
139
|
cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
|
|
140
|
+
usbDevices?: any[]
|
|
139
141
|
passthroughDevices?: UI_I_PciDevice[]
|
|
140
142
|
mediatedDevices?: UI_I_MediatedDevice[]
|
|
141
143
|
vmCpuHelpTextSecond?: string
|
|
@@ -153,6 +155,7 @@ const props = withDefaults(
|
|
|
153
155
|
hardDisks: undefined,
|
|
154
156
|
pciDevices: undefined,
|
|
155
157
|
cdDvdDrives: undefined,
|
|
158
|
+
usbDevices: undefined,
|
|
156
159
|
passthroughDevices: undefined,
|
|
157
160
|
mediatedDevices: undefined,
|
|
158
161
|
vmCpuHelpTextSecond: undefined,
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
:datastore="props.datastore"
|
|
32
32
|
:is-datastore-loading="props.isDatastoreLoading"
|
|
33
33
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
34
|
+
:usb-devices="props.usbDevices"
|
|
34
35
|
:passthrough-devices="props.passthroughDevices"
|
|
35
36
|
:mediated-devices="props.mediatedDevices"
|
|
36
37
|
:project="props.project"
|
|
@@ -118,6 +119,7 @@ const props = withDefaults(
|
|
|
118
119
|
hardDisks?: UI_I_SendDataNewHardDisk[] | null
|
|
119
120
|
pciDevices?: UI_I_SendDataNewPciDevice[]
|
|
120
121
|
cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
|
|
122
|
+
usbDevices?: any[]
|
|
121
123
|
passthroughDevices?: UI_I_PciDevice[]
|
|
122
124
|
mediatedDevices?: UI_I_MediatedDevice[]
|
|
123
125
|
vmCpuHelpTextSecond?: string
|
|
@@ -134,6 +136,7 @@ const props = withDefaults(
|
|
|
134
136
|
hardDisks: undefined,
|
|
135
137
|
pciDevices: undefined,
|
|
136
138
|
cdDvdDrives: undefined,
|
|
139
|
+
usbDevices: undefined,
|
|
137
140
|
passthroughDevices: undefined,
|
|
138
141
|
mediatedDevices: undefined,
|
|
139
142
|
vmCpuHelpTextSecond: undefined,
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
)"
|
|
59
59
|
:key="props.hardDisksIndex[key]"
|
|
60
60
|
>
|
|
61
|
-
<!-- TODO 111-->
|
|
62
|
-
<!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
|
|
61
|
+
<!-- TODO 111-->
|
|
62
|
+
<!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
|
|
63
63
|
<common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
|
|
64
64
|
v-model:size="item.size"
|
|
65
65
|
v-model:provision-type="item.provision_type"
|
|
@@ -201,6 +201,19 @@
|
|
|
201
201
|
"
|
|
202
202
|
/>
|
|
203
203
|
</div>
|
|
204
|
+
<div v-for="(item, key) in model.passthrough_usb_devices" :key="key">
|
|
205
|
+
<common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-device
|
|
206
|
+
:item="item"
|
|
207
|
+
:index="props.usbDevicesIndex[key]"
|
|
208
|
+
:type="props.usbDevicesType[key]"
|
|
209
|
+
:available-usb-devices="props.availableUsbDevices"
|
|
210
|
+
:state="props.state"
|
|
211
|
+
@change="
|
|
212
|
+
emits('change-usb-device', [props.usbDevicesIndex[key], $event])
|
|
213
|
+
"
|
|
214
|
+
@remove="emits('remove-usb-device', props.usbDevicesIndex[key])"
|
|
215
|
+
/>
|
|
216
|
+
</div>
|
|
204
217
|
<div v-for="(item, key) in model.usb_controllers" :key="key">
|
|
205
218
|
<common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
|
|
206
219
|
v-model="item.type"
|
|
@@ -283,6 +296,7 @@ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
|
|
|
283
296
|
import type {
|
|
284
297
|
UI_T_HardDiskType,
|
|
285
298
|
UI_T_NetworkType,
|
|
299
|
+
UI_T_PciDeviceType,
|
|
286
300
|
} from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
|
|
287
301
|
import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
|
|
288
302
|
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
@@ -324,6 +338,9 @@ const props = withDefaults(
|
|
|
324
338
|
pciDevicesType: UI_T_NetworkType[]
|
|
325
339
|
isShowFileModal: boolean
|
|
326
340
|
pciDevicesIndex: number[]
|
|
341
|
+
availableUsbDevices: any[]
|
|
342
|
+
usbDevicesType: UI_T_PciDeviceType[]
|
|
343
|
+
usbDevicesIndex: number[]
|
|
327
344
|
cdDvdDrivesType: UI_T_NetworkType[]
|
|
328
345
|
cdDvdDrivesIndex: number[]
|
|
329
346
|
errorValidationFields: UI_I_ErrorValidationField<string>[]
|
|
@@ -360,6 +377,8 @@ const emits = defineEmits<{
|
|
|
360
377
|
(event: 'hide-file-modal'): void
|
|
361
378
|
(event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
|
|
362
379
|
(event: 'remove-pci-device', value: number): void
|
|
380
|
+
(event: 'change-usb-device', value: [number, any]): void
|
|
381
|
+
(event: 'remove-usb-device', value: number): void
|
|
363
382
|
(event: 'get-networks-table', value: UI_I_TablePayload): void
|
|
364
383
|
(event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
|
|
365
384
|
(event: 'roll-back-hard-disk', value: number): void
|
|
@@ -399,6 +418,7 @@ const deviceCount = computed<number>(
|
|
|
399
418
|
(model.value.disk_devices?.length || 0) +
|
|
400
419
|
(model.value.network_devices?.length || 0) +
|
|
401
420
|
(model.value.passthrough_pci_devices?.length || 0) +
|
|
421
|
+
(model.value.passthrough_usb_devices?.length || 0) +
|
|
402
422
|
6
|
|
403
423
|
)
|
|
404
424
|
const deviceCountText = computed<string>(() =>
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
)"
|
|
37
37
|
:key="props.hardDisksIndex[key]"
|
|
38
38
|
>
|
|
39
|
-
<!-- TODO 111-->
|
|
40
|
-
<!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
|
|
39
|
+
<!-- TODO 111-->
|
|
40
|
+
<!-- v-model:vm-storage-policy="item.vm_storage_policy"-->
|
|
41
41
|
<common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
|
|
42
42
|
v-model:size="item.size"
|
|
43
43
|
v-model:provision-type="item.provision_type"
|
|
@@ -181,6 +181,19 @@
|
|
|
181
181
|
"
|
|
182
182
|
/>
|
|
183
183
|
</div>
|
|
184
|
+
<div v-for="(item, key) in model.passthrough_usb_devices" :key="key">
|
|
185
|
+
<common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-device
|
|
186
|
+
:item="item"
|
|
187
|
+
:index="props.usbDevicesIndex[key]"
|
|
188
|
+
:type="props.usbDevicesType[key]"
|
|
189
|
+
:available-usb-devices="props.availableUsbDevices"
|
|
190
|
+
:state="props.state"
|
|
191
|
+
@change="
|
|
192
|
+
emits('change-usb-device', [props.usbDevicesIndex[key], $event])
|
|
193
|
+
"
|
|
194
|
+
@remove="emits('remove-usb-device', props.usbDevicesIndex[key])"
|
|
195
|
+
/>
|
|
196
|
+
</div>
|
|
184
197
|
<div v-for="(item, key) in model.usb_controllers" :key="key">
|
|
185
198
|
<common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
|
|
186
199
|
v-model="item.type"
|
|
@@ -301,6 +314,9 @@ const props = withDefaults(
|
|
|
301
314
|
pciDevicesType: UI_T_PciDeviceType[]
|
|
302
315
|
isShowFileModal: boolean
|
|
303
316
|
pciDevicesIndex: number[]
|
|
317
|
+
availableUsbDevices: any[]
|
|
318
|
+
usbDevicesType: UI_T_PciDeviceType[]
|
|
319
|
+
usbDevicesIndex: number[]
|
|
304
320
|
cdDvdDrivesType: UI_T_CdDvdType[]
|
|
305
321
|
cdDvdDrivesIndex: number[]
|
|
306
322
|
errorValidationFields: UI_I_ErrorValidationField[]
|
|
@@ -333,6 +349,8 @@ const emits = defineEmits<{
|
|
|
333
349
|
(event: 'hide-file-modal'): void
|
|
334
350
|
(event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
|
|
335
351
|
(event: 'remove-pci-device', value: number): void
|
|
352
|
+
(event: 'change-usb-device', value: [number, any]): void
|
|
353
|
+
(event: 'remove-usb-device', value: number): void
|
|
336
354
|
(event: 'get-networks-table', value: UI_I_TablePayload): void
|
|
337
355
|
(event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
|
|
338
356
|
(event: 'roll-back-hard-disk', value: number): void
|
package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue
CHANGED
|
@@ -24,6 +24,9 @@
|
|
|
24
24
|
:pci-devices-type="pciDevicesType"
|
|
25
25
|
:is-show-file-modal="isShowFileModal"
|
|
26
26
|
:pci-devices-index="pciDevicesIndex"
|
|
27
|
+
:available-usb-devices="availableUsbDevices"
|
|
28
|
+
:usb-devices-type="usbDevicesType"
|
|
29
|
+
:usb-devices-index="usbDevicesIndex"
|
|
27
30
|
:cd-dvd-drives-type="cdDvdDrivesType"
|
|
28
31
|
:cd-dvd-drives-index="cdDvdDrivesIndex"
|
|
29
32
|
:error-validation-fields="errorValidationFields"
|
|
@@ -31,8 +34,8 @@
|
|
|
31
34
|
:state="state"
|
|
32
35
|
:video-card="videoCard"
|
|
33
36
|
:guest-machine-type="guestMachineType"
|
|
34
|
-
:passthrough-devices="passthroughDevices"
|
|
35
|
-
:mediated-devices="mediatedDevices"
|
|
37
|
+
:passthrough-devices="props.passthroughDevices"
|
|
38
|
+
:mediated-devices="props.mediatedDevices"
|
|
36
39
|
:vm-cpu-help-text-second="vmCpuHelpTextSecond"
|
|
37
40
|
:compute-resource="props.computeResource"
|
|
38
41
|
:compatibility-info="props.compatibilityInfo"
|
|
@@ -43,6 +46,8 @@
|
|
|
43
46
|
@hide-file-modal="isShowFileModal = false"
|
|
44
47
|
@remove-hard-disk="onRemoveHardDisk(...$event)"
|
|
45
48
|
@remove-pci-device="onRemovePciDevice"
|
|
49
|
+
@remove-usb-device="onRemoveUsbDevice"
|
|
50
|
+
@change-usb-device="onChangeUsbDevice"
|
|
46
51
|
@get-networks-table="emits('get-networks-table', $event)"
|
|
47
52
|
@add-exist-hard-disk="onAddExistHardDisk"
|
|
48
53
|
@roll-back-hard-disk="onRollBackHardDisk"
|
|
@@ -117,6 +122,7 @@ const props = withDefaults(
|
|
|
117
122
|
cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
|
|
118
123
|
videoCard?: UI_I_SendDataVideoCard
|
|
119
124
|
// pciDevices?: UI_I_SendDataNewPciDevice[]
|
|
125
|
+
usbDevices?: any[]
|
|
120
126
|
passthroughDevices?: UI_I_PciDevice[]
|
|
121
127
|
mediatedDevices?: UI_I_MediatedDevice[]
|
|
122
128
|
guestMachineType?: UI_I_OptionItem | null
|
|
@@ -130,6 +136,7 @@ const props = withDefaults(
|
|
|
130
136
|
cdDvdDrives: undefined,
|
|
131
137
|
videoCard: undefined,
|
|
132
138
|
// pciDevices: undefined,
|
|
139
|
+
usbDevices: () => [],
|
|
133
140
|
passthroughDevices: undefined,
|
|
134
141
|
mediatedDevices: undefined,
|
|
135
142
|
guestMachineType: undefined,
|
|
@@ -158,12 +165,35 @@ const currentComponent = computed(() =>
|
|
|
158
165
|
|
|
159
166
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
160
167
|
|
|
168
|
+
const usbDevicesLocal = ref<any[]>(useDeepCopy(props.usbDevices))
|
|
169
|
+
watch(
|
|
170
|
+
() => props.usbDevices,
|
|
171
|
+
(newValue) => {
|
|
172
|
+
usbDevicesLocal.value = useDeepCopy(newValue)
|
|
173
|
+
},
|
|
174
|
+
{ deep: true }
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
const availableUsbDevices = computed<any[]>(() => {
|
|
178
|
+
return (
|
|
179
|
+
usbDevicesLocal.value.filter((device) => {
|
|
180
|
+
if (device.passthrough === 'Pathroughed') return null
|
|
181
|
+
|
|
182
|
+
const isUniqueDevice = model.value.passthrough_usb_devices.every(
|
|
183
|
+
(item) => item.product_id !== device.product_id
|
|
184
|
+
)
|
|
185
|
+
if (isUniqueDevice) return device
|
|
186
|
+
}) || []
|
|
187
|
+
)
|
|
188
|
+
})
|
|
189
|
+
|
|
161
190
|
const dropdownItems = computed<UI_I_DropdownTreeItem[]>(() =>
|
|
162
191
|
dropdownItemsFunc(
|
|
163
192
|
localization.value,
|
|
164
193
|
props.state,
|
|
165
194
|
props.passthroughDevices,
|
|
166
|
-
props.mediatedDevices
|
|
195
|
+
props.mediatedDevices,
|
|
196
|
+
availableUsbDevices.value
|
|
167
197
|
)
|
|
168
198
|
)
|
|
169
199
|
|
|
@@ -557,7 +587,8 @@ const addPciDevice = (): void => {
|
|
|
557
587
|
pciDevicesType.value.push('new')
|
|
558
588
|
|
|
559
589
|
// pciDevicesLocal.value.push(useDeepCopy(defaultPciDevice))
|
|
560
|
-
if (!model.value.passthrough_pci_devices)
|
|
590
|
+
if (!model.value.passthrough_pci_devices)
|
|
591
|
+
model.value.passthrough_pci_devices = []
|
|
561
592
|
model.value.passthrough_pci_devices.push(useDeepCopy(defaultPciDevice))
|
|
562
593
|
}
|
|
563
594
|
const onRemovePciDevice = (index: number): void => {
|
|
@@ -573,6 +604,75 @@ const onRemovePciDevice = (index: number): void => {
|
|
|
573
604
|
})
|
|
574
605
|
}
|
|
575
606
|
|
|
607
|
+
const usbDevicesIndex = ref<number[]>([0])
|
|
608
|
+
const usbDevicesType = ref<('new' | 'edit' | 'removed')[]>(['new'])
|
|
609
|
+
if (!model.value.passthrough_usb_devices?.length) {
|
|
610
|
+
usbDevicesIndex.value = []
|
|
611
|
+
usbDevicesType.value = []
|
|
612
|
+
} else {
|
|
613
|
+
model.value.passthrough_usb_devices.forEach((_disk, _index, array) => {
|
|
614
|
+
if (!props.isEdit && !props.isClone) return
|
|
615
|
+
|
|
616
|
+
const count = array.length
|
|
617
|
+
usbDevicesIndex.value = [...Array(count).keys()]
|
|
618
|
+
if (props.isEdit) {
|
|
619
|
+
usbDevicesType.value = Array(count).fill('edit')
|
|
620
|
+
} else if (props.isClone) {
|
|
621
|
+
usbDevicesType.value = Array(count).fill('clone') // before been new
|
|
622
|
+
}
|
|
623
|
+
})
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
const addUsbDevice = (): void => {
|
|
627
|
+
const newIndex = (usbDevicesIndex.value.at(-1) ?? -1) + 1
|
|
628
|
+
usbDevicesIndex.value.push(newIndex)
|
|
629
|
+
usbDevicesType.value.push('new')
|
|
630
|
+
|
|
631
|
+
if (!model.value.passthrough_usb_devices)
|
|
632
|
+
model.value.passthrough_usb_devices = []
|
|
633
|
+
model.value.passthrough_usb_devices.push(
|
|
634
|
+
useDeepCopy(availableUsbDevices.value[0])
|
|
635
|
+
)
|
|
636
|
+
}
|
|
637
|
+
const onRemoveUsbDevice = (index: number): void => {
|
|
638
|
+
const removeIndex = usbDevicesIndex.value.indexOf(index)
|
|
639
|
+
usbDevicesIndex.value = usbDevicesIndex.value.filter((item) => item !== index)
|
|
640
|
+
usbDevicesType.value = usbDevicesType.value.filter(
|
|
641
|
+
(_item, key) => key !== removeIndex
|
|
642
|
+
)
|
|
643
|
+
|
|
644
|
+
let removedItemId = ''
|
|
645
|
+
model.value.passthrough_usb_devices =
|
|
646
|
+
model.value.passthrough_usb_devices.filter((usbDevice, key: number) => {
|
|
647
|
+
if (removeIndex === key) {
|
|
648
|
+
removedItemId = usbDevice.product_id
|
|
649
|
+
}
|
|
650
|
+
return removeIndex !== key
|
|
651
|
+
})
|
|
652
|
+
|
|
653
|
+
usbDevicesLocal.value = usbDevicesLocal.value.map((device) => {
|
|
654
|
+
if (removedItemId) {
|
|
655
|
+
device.passthrough = 'Enable'
|
|
656
|
+
}
|
|
657
|
+
return device
|
|
658
|
+
})
|
|
659
|
+
}
|
|
660
|
+
const onChangeUsbDevice = (data: [number, string]): void => {
|
|
661
|
+
const [index, value] = data
|
|
662
|
+
|
|
663
|
+
usbDevicesLocal.value = usbDevicesLocal.value.map((device) => {
|
|
664
|
+
if (model.value.passthrough_usb_devices[index].product_id === device.product_id) {
|
|
665
|
+
device.passthrough = 'Enable'
|
|
666
|
+
}
|
|
667
|
+
return device
|
|
668
|
+
})
|
|
669
|
+
|
|
670
|
+
const newItem = usbDevicesLocal.value.find(
|
|
671
|
+
(device) => device.product_id === +value
|
|
672
|
+
)
|
|
673
|
+
if (newItem) model.value.passthrough_usb_devices[index] = newItem
|
|
674
|
+
}
|
|
675
|
+
|
|
576
676
|
const isShowFileModal = ref<boolean>(false)
|
|
577
677
|
const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
|
|
578
678
|
switch (item.value) {
|
|
@@ -582,6 +682,9 @@ const onAddDevice = (item: UI_I_DropdownTreeItemChild): void => {
|
|
|
582
682
|
case 2:
|
|
583
683
|
isShowFileModal.value = true
|
|
584
684
|
break
|
|
685
|
+
case 3:
|
|
686
|
+
addUsbDevice()
|
|
687
|
+
break
|
|
585
688
|
case 5:
|
|
586
689
|
addCdDvdDrive()
|
|
587
690
|
break
|
|
@@ -7,7 +7,8 @@ export const dropdownItemsFunc = (
|
|
|
7
7
|
localization: UI_I_Localization,
|
|
8
8
|
state: string | number | undefined,
|
|
9
9
|
passthroughDevices?: UI_I_PciDevice[],
|
|
10
|
-
mediatedDevices?: any[]
|
|
10
|
+
mediatedDevices?: any[],
|
|
11
|
+
availableUsbDevices?: any[]
|
|
11
12
|
): UI_I_DropdownTreeItem[] => {
|
|
12
13
|
const { $text } = useNuxtApp()
|
|
13
14
|
|
|
@@ -28,7 +29,12 @@ export const dropdownItemsFunc = (
|
|
|
28
29
|
testId: 'existing-hard-disk',
|
|
29
30
|
},
|
|
30
31
|
// { text: 'RDM Disk', value: 2 },
|
|
31
|
-
|
|
32
|
+
{
|
|
33
|
+
text: localization.vmWizard.hostUsbDevice,
|
|
34
|
+
value: 3,
|
|
35
|
+
disabled: !availableUsbDevices?.length,
|
|
36
|
+
testId: 'host-usb-device',
|
|
37
|
+
},
|
|
32
38
|
// { text: 'NVDIMM', value: 4 },
|
|
33
39
|
{
|
|
34
40
|
text: localization.common.cdDvdDrive,
|
|
@@ -49,7 +55,7 @@ export const dropdownItemsFunc = (
|
|
|
49
55
|
|
|
50
56
|
// TODO 700
|
|
51
57
|
{
|
|
52
|
-
text:
|
|
58
|
+
text: localization.common.otherDevices,
|
|
53
59
|
children: [
|
|
54
60
|
{
|
|
55
61
|
text: localization.common.pciDevice,
|
package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/New.vue
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<ui-stack-block
|
|
3
|
+
:removable="props.isRemovable"
|
|
4
|
+
test-id="usb-device-stack-block"
|
|
5
|
+
has-children
|
|
6
|
+
@remove="emits('remove')"
|
|
7
|
+
>
|
|
8
|
+
<template #stackBlockKey>
|
|
9
|
+
<div
|
|
10
|
+
:id="`vm-wizard-toggle-block-usb-device-${props.index}`"
|
|
11
|
+
:data-id="`vm-wizard-toggle-block-usb-device-${props.index}`"
|
|
12
|
+
class="flex-align-center"
|
|
13
|
+
>
|
|
14
|
+
<span>{{ props.label }}</span>
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
17
|
+
<template #stackBlockContent>
|
|
18
|
+
<ui-select
|
|
19
|
+
id="usb-device-select"
|
|
20
|
+
v-model="selectedUsbDevice"
|
|
21
|
+
:items="items"
|
|
22
|
+
width="auto"
|
|
23
|
+
test-id="usb-device-select"
|
|
24
|
+
size="sm"
|
|
25
|
+
@change="onChange"
|
|
26
|
+
/>
|
|
27
|
+
</template>
|
|
28
|
+
</ui-stack-block>
|
|
29
|
+
</template>
|
|
30
|
+
|
|
31
|
+
<script setup lang="ts">
|
|
32
|
+
// import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
|
|
33
|
+
// import type {
|
|
34
|
+
// UI_I_PciDevice,
|
|
35
|
+
// } from '~/lib/models/store/vm/interfaces'
|
|
36
|
+
|
|
37
|
+
import type { UI_T_SelectedValue } from 'bfg-uikit/components/ui/select/models/types'
|
|
38
|
+
import type { UI_I_Dropdown } from 'bfg-uikit/components/ui/dropdown/models/interfaces'
|
|
39
|
+
|
|
40
|
+
const props = defineProps<{
|
|
41
|
+
item: any
|
|
42
|
+
index: number
|
|
43
|
+
type: any
|
|
44
|
+
usbDevices: any[]
|
|
45
|
+
isRemovable: boolean
|
|
46
|
+
label: string
|
|
47
|
+
}>()
|
|
48
|
+
|
|
49
|
+
const emits = defineEmits<{
|
|
50
|
+
(event: 'change', value: any): void
|
|
51
|
+
(event: 'remove'): void
|
|
52
|
+
}>()
|
|
53
|
+
|
|
54
|
+
const items = computed<UI_I_Dropdown[]>(() => {
|
|
55
|
+
return props.usbDevices.map((device) => {
|
|
56
|
+
return {
|
|
57
|
+
text: device.product_name,
|
|
58
|
+
value: device.product_id,
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
const selectedUsbDevice = ref<any>(props.item.product_id)
|
|
63
|
+
|
|
64
|
+
const onChange = (value: UI_T_SelectedValue): void => {
|
|
65
|
+
emits('change', value)
|
|
66
|
+
}
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<style scoped lang="scss">
|
|
70
|
+
:deep(.stack-block.not-children .stack-block-label) {
|
|
71
|
+
height: auto;
|
|
72
|
+
}
|
|
73
|
+
</style>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component
|
|
3
|
+
:is="currentComponent"
|
|
4
|
+
:item="props.item"
|
|
5
|
+
:index="props.index"
|
|
6
|
+
:type="props.type"
|
|
7
|
+
:is-removable="isRemovable"
|
|
8
|
+
:label="label"
|
|
9
|
+
:usb-devices="availableUsbDevicesLocal"
|
|
10
|
+
@change="emits('change', $event)"
|
|
11
|
+
@remove="emits('remove')"
|
|
12
|
+
/>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
17
|
+
import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
|
|
18
|
+
|
|
19
|
+
const props = withDefaults(
|
|
20
|
+
defineProps<{
|
|
21
|
+
item: any
|
|
22
|
+
index: number
|
|
23
|
+
type: UI_T_PciDeviceType
|
|
24
|
+
availableUsbDevices: any[]
|
|
25
|
+
state?: string | number
|
|
26
|
+
}>(),
|
|
27
|
+
{
|
|
28
|
+
state: undefined,
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
const emits = defineEmits<{
|
|
32
|
+
(event: 'change', value: any): void
|
|
33
|
+
(event: 'remove'): void
|
|
34
|
+
}>()
|
|
35
|
+
|
|
36
|
+
const { $store }: any = useNuxtApp()
|
|
37
|
+
const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
|
|
38
|
+
const currentComponent = computed(() =>
|
|
39
|
+
isNewView.value
|
|
40
|
+
? defineAsyncComponent(() => import('./New.vue'))
|
|
41
|
+
: defineAsyncComponent(() => import('./Old.vue'))
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
45
|
+
|
|
46
|
+
const availableUsbDevicesLocal = computed<any[]>(() => {
|
|
47
|
+
return [...props.availableUsbDevices, props.item]
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
const isRunning = computed<boolean>(() => {
|
|
51
|
+
return props.state === 2
|
|
52
|
+
})
|
|
53
|
+
const isEdit = computed<boolean>(() => {
|
|
54
|
+
return props.type === 'edit'
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const isRemovable = computed<boolean>(() => {
|
|
58
|
+
// return !props.isEdit || !isRunning.value
|
|
59
|
+
return !isEdit.value || !isRunning.value
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const label = computed<string>(() => {
|
|
63
|
+
if (isEdit.value)
|
|
64
|
+
return `${localization.value.vmWizard.hostUsbDevice} ${
|
|
65
|
+
props.index + 1
|
|
66
|
+
}`
|
|
67
|
+
|
|
68
|
+
return `${localization.value.vmWizard.newHostUsbDevice} *`
|
|
69
|
+
})
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<style scoped lang="scss"></style>
|
package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbDevice/Old.vue
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="hardware-usb-device">
|
|
3
|
+
<atoms-stack-block
|
|
4
|
+
:removable="props.isRemovable"
|
|
5
|
+
test-id="usb-device-stack-block"
|
|
6
|
+
:has-children="false"
|
|
7
|
+
@remove="emits('remove')"
|
|
8
|
+
>
|
|
9
|
+
<template #stackBlockKey>
|
|
10
|
+
<div
|
|
11
|
+
:id="`vm-wizard-toggle-block-usb-device-${props.index}`"
|
|
12
|
+
:data-id="`vm-wizard-toggle-block-usb-device-${props.index}`"
|
|
13
|
+
class="flex-align-center"
|
|
14
|
+
>
|
|
15
|
+
<span>{{ props.label }}</span>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
<template #stackBlockContent>
|
|
19
|
+
<div class="select">
|
|
20
|
+
<select
|
|
21
|
+
id="usb-device-select"
|
|
22
|
+
:value="props.item.product_id"
|
|
23
|
+
data-id="usb-device-select"
|
|
24
|
+
@change="onChange"
|
|
25
|
+
@click.stop
|
|
26
|
+
>
|
|
27
|
+
<option
|
|
28
|
+
v-for="(item, key) in props.usbDevices"
|
|
29
|
+
:key="key"
|
|
30
|
+
:value="item.product_id"
|
|
31
|
+
>
|
|
32
|
+
{{ item.product_name }}
|
|
33
|
+
</option>
|
|
34
|
+
</select>
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
</atoms-stack-block>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup lang="ts">
|
|
42
|
+
// import type { UI_T_PciDeviceType } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
|
|
43
|
+
// import type {
|
|
44
|
+
// UI_I_PciDevice,
|
|
45
|
+
// } from '~/lib/models/store/vm/interfaces'
|
|
46
|
+
|
|
47
|
+
const props = defineProps<{
|
|
48
|
+
item: any
|
|
49
|
+
index: number
|
|
50
|
+
type: any
|
|
51
|
+
usbDevices: any[]
|
|
52
|
+
isRemovable: boolean
|
|
53
|
+
label: string
|
|
54
|
+
}>()
|
|
55
|
+
const emits = defineEmits<{
|
|
56
|
+
(event: 'change', value: string): void
|
|
57
|
+
(event: 'remove'): void
|
|
58
|
+
}>()
|
|
59
|
+
|
|
60
|
+
const onChange = (event: any): void => {
|
|
61
|
+
emits('change', event.target.value)
|
|
62
|
+
}
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<style scoped lang="scss"></style>
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
:error-validation-fields="props.errorValidationFields"
|
|
15
15
|
:state="props.state"
|
|
16
16
|
:vm-name-old="vmNameOld"
|
|
17
|
+
:usb-devices="props.usbDevices"
|
|
17
18
|
:passthrough-devices="props.passthroughDevices"
|
|
18
19
|
:mediated-devices="props.mediatedDevices"
|
|
19
20
|
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
@@ -73,6 +74,7 @@ const props = withDefaults(
|
|
|
73
74
|
validateSendDataFunc: UI_T_EditVmFinishFunc
|
|
74
75
|
getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
|
|
75
76
|
state?: string | number
|
|
77
|
+
usbDevices?: any[]
|
|
76
78
|
passthroughDevices?: UI_I_PciDevice[]
|
|
77
79
|
mediatedDevices?: UI_I_MediatedDevice[]
|
|
78
80
|
capabilities?: UI_I_Capabilities
|
|
@@ -81,6 +83,7 @@ const props = withDefaults(
|
|
|
81
83
|
{
|
|
82
84
|
getDatastoreTableFunc: undefined,
|
|
83
85
|
state: undefined,
|
|
86
|
+
usbDevices: undefined,
|
|
84
87
|
passthroughDevices: undefined,
|
|
85
88
|
mediatedDevices: undefined,
|
|
86
89
|
capabilities: undefined,
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
:networks-table="props.networksTable"
|
|
36
36
|
:error-validation-fields="props.errorValidationFields"
|
|
37
37
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
38
|
+
:usb-devices="props.usbDevices"
|
|
38
39
|
:passthrough-devices="props.passthroughDevices"
|
|
39
40
|
:mediated-devices="props.mediatedDevices"
|
|
40
41
|
:state="props.state"
|
|
@@ -95,6 +96,7 @@ const props = withDefaults(
|
|
|
95
96
|
cpuModels: UI_I_OptionItem[]
|
|
96
97
|
state?: string | number
|
|
97
98
|
vmNameOld?: string
|
|
99
|
+
usbDevices?: any[]
|
|
98
100
|
passthroughDevices?: UI_I_PciDevice[]
|
|
99
101
|
mediatedDevices?: any[]
|
|
100
102
|
getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
|
|
@@ -104,6 +106,7 @@ const props = withDefaults(
|
|
|
104
106
|
{
|
|
105
107
|
state: undefined,
|
|
106
108
|
vmNameOld: undefined,
|
|
109
|
+
usbDevices: undefined,
|
|
107
110
|
passthroughDevices: undefined,
|
|
108
111
|
mediatedDevices: undefined,
|
|
109
112
|
getDatastoreTableFunc: undefined,
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
:networks-table="props.networksTable"
|
|
39
39
|
:error-validation-fields="props.errorValidationFields"
|
|
40
40
|
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
41
|
+
:usb-devices="props.usbDevices"
|
|
41
42
|
:passthrough-devices="props.passthroughDevices"
|
|
42
43
|
:mediated-devices="props.mediatedDevices"
|
|
43
44
|
:state="props.state"
|
|
@@ -102,6 +103,7 @@ const props = withDefaults(
|
|
|
102
103
|
cpuModels: UI_I_OptionItem[]
|
|
103
104
|
state?: string | number
|
|
104
105
|
vmNameOld?: string
|
|
106
|
+
usbDevices?: any[]
|
|
105
107
|
passthroughDevices?: UI_I_PciDevice[]
|
|
106
108
|
mediatedDevices?: any[]
|
|
107
109
|
getDatastoreTableFunc?: (payload: UI_I_TablePayload) => Promise<void>
|
|
@@ -111,6 +113,7 @@ const props = withDefaults(
|
|
|
111
113
|
{
|
|
112
114
|
state: undefined,
|
|
113
115
|
vmNameOld: undefined,
|
|
116
|
+
usbDevices: undefined,
|
|
114
117
|
passthroughDevices: undefined,
|
|
115
118
|
mediatedDevices: undefined,
|
|
116
119
|
getDatastoreTableFunc: undefined,
|
|
@@ -139,6 +139,7 @@ export const constructSendDataForm = (
|
|
|
139
139
|
disk_devices,
|
|
140
140
|
network_devices,
|
|
141
141
|
passthrough_pci_devices,
|
|
142
|
+
passthrough_usb_devices,
|
|
142
143
|
cpu,
|
|
143
144
|
memory,
|
|
144
145
|
usb_controllers,
|
|
@@ -169,6 +170,7 @@ export const constructSendDataForm = (
|
|
|
169
170
|
disk_devices: diskDevices,
|
|
170
171
|
network_devices: network_devices,
|
|
171
172
|
passthrough_pci_devices: passthrough_pci_devices,
|
|
173
|
+
passthrough_usb_devices: passthrough_usb_devices,
|
|
172
174
|
cpu: {
|
|
173
175
|
vcpus: cpu.vcpus,
|
|
174
176
|
max_vcpus: cpu.hotplug ? cpu.max_vcpus : 0,
|
|
@@ -210,6 +210,7 @@ export interface API_UI_I_Pvm {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
passthrough_pci_devices: any[]
|
|
213
|
+
passthrough_usb_devices: any[]
|
|
213
214
|
snapshots: any
|
|
214
215
|
storage: {
|
|
215
216
|
folder: string
|
|
@@ -391,6 +392,7 @@ export interface API_UI_I_VmReadyToComplete {
|
|
|
391
392
|
usb_controllers: API_UI_I_VmReadyToCompleteUsbController[]
|
|
392
393
|
video_card: API_UI_I_VmReadyToCompleteVideoCard
|
|
393
394
|
passthrough_pci_devices: API_UI_I_VmReadyToCompletePciDevice[]
|
|
395
|
+
passthrough_usb_devices: any[]
|
|
394
396
|
}
|
|
395
397
|
compute_resource?: string
|
|
396
398
|
location?: string
|