]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/GuestImport.js
1 Ext
.define('PVE.window.GuestImport', {
2 extend
: 'Proxmox.window.Edit', // fixme: Proxmox.window.Edit?
3 alias
: 'widget.pveGuestImportWindow',
5 title
: gettext('Import Guest'),
7 submitUrl: function() {
9 return `/nodes/${me.nodename}/qemu`;
14 submitText
: gettext('Import'),
18 loadUrl: function(_url
, { storage
, nodename
, volumeName
}) {
19 let args
= Ext
.Object
.toQueryString({ volume
: volumeName
});
20 return `/nodes/${nodename}/storage/${storage}/import-metadata?${args}`;
24 xclass
: 'Ext.app.ViewController',
26 setNodename: function(_column
, widget
) {
28 let view
= me
.getView();
29 widget
.setNodename(view
.nodename
);
32 diskStorageChange: function(storageSelector
, value
) {
35 let grid
= me
.lookup('diskGrid');
36 let rec
= storageSelector
.getWidgetRecord();
37 let validFormats
= storageSelector
.store
.getById(value
)?.data
.format
;
38 grid
.query('pveDiskFormatSelector').some((selector
) => {
39 if (selector
.getWidgetRecord().data
.id
!== rec
.data
.id
) {
43 if (validFormats
?.[0]?.qcow2
) {
44 selector
.setDisabled(false);
45 selector
.setValue('qcow2');
47 selector
.setValue('raw');
48 selector
.setDisabled(true);
55 isoStorageChange: function(storageSelector
, value
) {
58 let grid
= me
.lookup('cdGrid');
59 let rec
= storageSelector
.getWidgetRecord();
60 grid
.query('pveFileSelector').some((selector
) => {
61 if (selector
.getWidgetRecord().data
.id
!== rec
.data
.id
) {
65 selector
.setStorage(value
);
67 selector
.setValue('');
74 onOSBaseChange: function(_field
, value
) {
76 let ostype
= me
.lookup('ostype');
77 let store
= ostype
.getStore();
78 store
.setData(PVE
.Utils
.kvm_ostypes
[value
]);
79 let old_val
= ostype
.getValue();
80 if (old_val
&& store
.find('val', old_val
) !== -1) {
81 ostype
.setValue(old_val
);
83 ostype
.setValue(store
.getAt(0));
89 // update records from widgetcolumns
90 change: function(widget
, value
) {
91 let rec
= widget
.getWidgetRecord();
92 rec
.set(widget
.name
, value
);
96 'grid[reference=diskGrid] pveStorageSelector': {
97 change
: 'diskStorageChange',
99 'grid[reference=cdGrid] pveStorageSelector': {
100 change
: 'isoStorageChange',
102 'field[name=osbase]': {
103 change
: 'onOSBaseChange',
116 totalCoreCount
: get => get('socketCount') * get('coreCount'),
117 hideWarnings
: get => get('warnings').length
=== 0,
118 warningsText
: get => '<ul style="margin: 0; padding-left: 20px;">'
119 + get('warnings').map(w
=> `<li>${w}</li>`).join('') + '</ul>',
126 onGetValues: function(values
) {
128 let grid
= me
.up('pveGuestImportWindow');
130 let config
= Ext
.apply(grid
.vmConfig
, values
);
133 config
.scsi0
= config
.scsi0
.replace('local:0,', 'local:0,format=qcow2,');
136 grid
.lookup('diskGrid').getStore().each((rec
) => {
137 if (!rec
.data
.enable
) {
140 let id
= rec
.data
.id
;
141 delete rec
.data
.enable
;
143 rec
.data
.file
+= ':0'; // for our special api format
144 if (id
=== 'efidisk0') {
145 delete rec
.data
['import-from'];
147 config
[id
] = PVE
.Parser
.printQemuDrive(rec
.data
);
150 grid
.lookup('netGrid').getStore().each((rec
) => {
151 if (!rec
.data
.enable
) {
154 let id
= rec
.data
.id
;
155 delete rec
.data
.enable
;
157 config
[id
] = PVE
.Parser
.printQemuNetwork(rec
.data
);
160 grid
.lookup('cdGrid').getStore().each((rec
) => {
161 if (!rec
.data
.enable
) {
164 let id
= rec
.data
.id
;
165 delete rec
.data
.enable
;
169 file
: rec
.data
.file
? rec
.data
.file
: 'none',
171 config
[id
] = PVE
.Parser
.printPropertyString(cd
);
174 if (grid
.lookup('liveimport').getValue()) {
175 config
['live-restore'] = 1;
183 xtype
: 'pveGuestIDSelector',
187 loadNextFreeID
: true,
190 xtype
: 'proxmoxintegerfield',
191 fieldLabel
: gettext('Sockets'),
193 reference
: 'socketsField',
199 value
: '{socketCount}',
203 xtype
: 'proxmoxintegerfield',
204 fieldLabel
: gettext('Cores'),
206 reference
: 'coresField',
212 value
: '{coreCount}',
216 xtype
: 'pveMemoryField',
217 fieldLabel
: gettext('Memory'),
219 reference
: 'memoryField',
228 fieldLabel
: gettext('Name'),
231 reference
: 'nameField',
235 xtype
: 'CPUModelSelector',
237 reference
: 'cputype',
238 value
: 'x86-64-v2-AES',
239 fieldLabel
: gettext('Type'),
242 xtype
: 'displayfield',
243 fieldLabel
: gettext('Total cores'),
247 value
: '{totalCoreCount}',
254 fieldLabel
: gettext('OS Type'),
258 store
: Object
.keys(PVE
.Utils
.kvm_ostypes
),
264 fieldLabel
: gettext('Version'),
270 displayField
: 'desc',
272 fields
: ['desc', 'val'],
273 data
: PVE
.Utils
.kvm_ostypes
.Linux
,
279 xtype
: 'displayfield',
280 fieldLabel
: gettext('Disks'),
285 reference
: 'diskGrid',
295 xtype
: 'checkcolumn',
296 header
: gettext('Use'),
300 checkchange: function(_column
, _rowIndex
, _checked
, record
) {
306 text
: gettext('Disk'),
310 text
: gettext('Source'),
311 dataIndex
: 'import-from',
313 renderer: function(value
) {
314 return value
.replace(/^.*\//, '');
318 text
: gettext('Storage'),
320 xtype
: 'widgetcolumn',
323 xtype
: 'pveStorageSelector',
326 storageContent
: 'images',
328 onWidgetAttach
: 'setNodename',
331 text
: gettext('Format'),
333 xtype
: 'widgetcolumn',
336 xtype
: 'pveDiskFormatSelector',
339 matchFieldWidth
: false,
345 xtype
: 'displayfield',
346 fieldLabel
: gettext('CD/DVD Drives'),
361 xtype
: 'checkcolumn',
362 header
: gettext('Use'),
366 checkchange: function(_column
, _rowIndex
, _checked
, record
) {
372 text
: gettext('Slot'),
377 text
: gettext('Storage'),
378 xtype
: 'widgetcolumn',
381 xtype
: 'pveStorageSelector',
385 emptyText
: Proxmox
.Utils
.noneText
,
386 storageContent
: 'iso',
388 onWidgetAttach
: 'setNodename',
391 text
: gettext('ISO'),
393 xtype
: 'widgetcolumn',
396 xtype
: 'pveFileSelector',
400 emptyText
: Proxmox
.Utils
.noneText
,
401 storageContent
: 'iso',
403 onWidgetAttach
: 'setNodename',
408 xtype
: 'displayfield',
409 fieldLabel
: gettext('Network Interfaces'),
415 reference
: 'netGrid',
424 xtype
: 'checkcolumn',
425 header
: gettext('Use'),
429 checkchange: function(_column
, _rowIndex
, _checked
, record
) {
439 text
: gettext('MAC address'),
441 dataIndex
: 'macaddr',
442 renderer
: value
=> value
?? 'auto',
445 text
: gettext('Model'),
448 xtype
: 'widgetcolumn',
450 xtype
: 'pveNetworkCardSelector',
457 text
: gettext('Bridge'),
459 xtype
: 'widgetcolumn',
461 xtype
: 'PVE.form.BridgeSelector',
466 onWidgetAttach
: 'setNodename',
471 xtype
: 'displayfield',
472 fieldLabel
: gettext('Warnings'),
476 hidden
: '{hideWarnings}',
480 xtype
: 'displayfield',
481 reference
: 'warningText',
485 hidden
: '{hideWarnings}',
486 value
: '{warningsText}',
493 initComponent: function() {
496 if (!me
.volumeName
) {
497 throw "no volumeName given";
501 throw "no storage given";
505 throw "no nodename given";
510 me
.query('toolbar')?.[0]?.insert(0, {
511 xtype
: 'proxmoxcheckbox',
512 reference
: 'liveimport',
513 boxLabelAlign
: 'before',
514 boxLabel
: gettext('Live Import'),
517 me
.setTitle(Ext
.String
.format(gettext('Import Guest - {0}'), `${me.storage}:${me.volumeName}`));
519 let renderWarning
= w
=> {
520 const warningsCatalogue
= {
521 'cdrom-image-ignored': gettext("CD-ROM images cannot get imported, please reconfigure the '{0}' drive after the import"),
522 'nvme-unsupported': gettext("NVMe disks are currently not supported, '{0}' will get attaced as SCSI"),
523 'ovmf-with-lsi-unsupported': gettext("OVMF is built without LSI drivers, scsi hardware was set to '{1}'"),
524 'serial-port-socket-only': gettext("Serial socket '{0}' will be mapped to a socket"),
526 let message
= warningsCatalogue
[w
.type
];
527 if (!w
.type
|| !message
) {
528 return w
.message
?? w
.type
?? gettext('Unknown warning');
530 return Ext
.String
.format(message
, w
.key
?? 'unknown', w
.value
?? 'unknown');
534 success: function(response
) {
535 let data
= response
.result
.data
;
536 me
.vmConfig
= data
['create-args'];
539 for (const [id
, value
] of Object
.entries(data
.disks
?? {})) {
543 'import-from': id
=== 'efidisk0' ? Ext
.htmlEncode('<none>') : value
,
549 for (const [id
, parsed
] of Object
.entries(data
.net
?? {})) {
551 parsed
.enable
= true;
556 for (const [id
, value
] of Object
.entries(me
.vmConfig
)) {
557 if (!Ext
.isString(value
) || !value
.match(/media=cdrom/)) {
564 delete me
.vmConfig
[id
];
566 me
.lookup('diskGrid').getStore().setData(disks
);
567 me
.lookup('netGrid').getStore().setData(nets
);
568 me
.lookup('cdGrid').getStore().setData(cdroms
);
570 me
.getViewModel().set('warnings', data
.warnings
.map(w
=> renderWarning(w
)));
572 let osinfo
= PVE
.Utils
.get_kvm_osinfo(me
.vmConfig
.ostype
?? '');