]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/GuestImport.js
70cdb75f49edebc504f7dd51c7542c8fc40f9969
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 storageChange: 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);
57 // update records from widgetcolumns
58 change: function(widget
, value
) {
59 let rec
= widget
.getWidgetRecord();
60 rec
.set(widget
.name
, value
);
64 'pveStorageSelector': {
65 change
: 'storageChange',
78 totalCoreCount
: get => get('socketCount') * get('coreCount'),
79 hideWarnings
: get => get('warnings').length
=== 0,
80 warningsText
: get => '<ul style="margin: 0; padding-left: 20px;">'
81 + get('warnings').map(w
=> `<li>${w}</li>`).join('') + '</ul>',
88 onGetValues: function(values
) {
90 let grid
= me
.up('pveGuestImportWindow');
92 let config
= Ext
.apply(grid
.vmConfig
, values
);
95 config
.scsi0
= config
.scsi0
.replace('local:0,', 'local:0,format=qcow2,');
98 grid
.lookup('diskGrid').getStore().each((rec
) => {
99 if (!rec
.data
.enable
) {
102 let id
= rec
.data
.id
;
103 delete rec
.data
.enable
;
105 rec
.data
.file
+= ':0'; // for our special api format
106 if (id
=== 'efidisk0') {
107 delete rec
.data
['import-from'];
109 config
[id
] = PVE
.Parser
.printQemuDrive(rec
.data
);
112 grid
.lookup('netGrid').getStore().each((rec
) => {
113 if (!rec
.data
.enable
) {
116 let id
= rec
.data
.id
;
117 delete rec
.data
.enable
;
119 config
[id
] = PVE
.Parser
.printQemuNetwork(rec
.data
);
122 if (grid
.lookup('liveimport').getValue()) {
123 config
['live-restore'] = 1;
131 xtype
: 'pveGuestIDSelector',
135 loadNextFreeID
: true,
138 xtype
: 'proxmoxintegerfield',
139 fieldLabel
: gettext('Sockets'),
141 reference
: 'socketsField',
147 value
: '{socketCount}',
151 xtype
: 'proxmoxintegerfield',
152 fieldLabel
: gettext('Cores'),
154 reference
: 'coresField',
160 value
: '{coreCount}',
164 xtype
: 'pveMemoryField',
165 fieldLabel
: gettext('Memory'),
167 reference
: 'memoryField',
176 fieldLabel
: gettext('Name'),
179 reference
: 'nameField',
183 xtype
: 'CPUModelSelector',
185 reference
: 'cputype',
186 value
: 'x86-64-v2-AES',
187 fieldLabel
: gettext('Type'),
190 xtype
: 'displayfield',
191 fieldLabel
: gettext('Total cores'),
195 value
: '{totalCoreCount}',
201 xtype
: 'displayfield',
202 fieldLabel
: gettext('Disks'),
207 reference
: 'diskGrid',
212 xtype
: 'checkcolumn',
213 header
: gettext('Use'),
217 checkchange: function(_column
, _rowIndex
, _checked
, record
) {
223 text
: gettext('Disk'),
227 text
: gettext('Source'),
228 dataIndex
: 'import-from',
230 renderer: function(value
) {
231 return value
.replace(/^.*\//, '');
235 text
: gettext('Storage'),
237 xtype
: 'widgetcolumn',
240 xtype
: 'pveStorageSelector',
243 storageContent
: 'images',
245 onWidgetAttach
: 'setNodename',
248 text
: gettext('Format'),
250 xtype
: 'widgetcolumn',
253 xtype
: 'pveDiskFormatSelector',
256 matchFieldWidth
: false,
262 xtype
: 'displayfield',
263 fieldLabel
: gettext('Network Interfaces'),
269 reference
: 'netGrid',
273 xtype
: 'checkcolumn',
274 header
: gettext('Use'),
278 checkchange: function(_column
, _rowIndex
, _checked
, record
) {
288 text
: gettext('MAC address'),
290 dataIndex
: 'macaddr',
293 text
: gettext('Model'),
298 text
: gettext('Bridge'),
300 xtype
: 'widgetcolumn',
302 xtype
: 'PVE.form.BridgeSelector',
307 onWidgetAttach
: 'setNodename',
312 xtype
: 'displayfield',
313 fieldLabel
: gettext('Warnings'),
317 hidden
: '{hideWarnings}',
321 xtype
: 'displayfield',
322 reference
: 'warningText',
326 hidden
: '{hideWarnings}',
327 value
: '{warningsText}',
334 initComponent: function() {
337 if (!me
.volumeName
) {
338 throw "no volumeName given";
342 throw "no storage given";
346 throw "no nodename given";
351 me
.query('toolbar')?.[0]?.insert(0, {
352 xtype
: 'proxmoxcheckbox',
353 reference
: 'liveimport',
354 boxLabelAlign
: 'before',
355 boxLabel
: gettext('Live Import'),
358 me
.setTitle(Ext
.String
.format(gettext('Import Guest - {0}'), `${me.storage}:${me.volumeName}`));
360 let renderWarning
= w
=> {
361 const warningsCatalogue
= {
362 'cdrom-image-ignored': gettext("CD-ROM images cannot get imported, please reconfigure the '{0}' drive after the import"),
363 'nvme-unsupported': gettext("NVMe disks are currently not supported, '{0}' will get attaced as SCSI"),
364 'ovmf-with-lsi-unsupported': gettext("OVMF is built without LSI drivers, scsi hardware was set to '{1}'"),
365 'serial-port-socket-only': gettext("Serial socket '{0}' will be mapped to a socket"),
367 let message
= warningsCatalogue
[w
.type
];
368 if (!w
.type
|| !message
) {
369 return w
.message
?? w
.type
?? gettext('Unknown warning');
371 return Ext
.String
.format(message
, w
.key
?? 'unknown', w
.value
?? 'unknown');
375 success: function(response
) {
376 let data
= response
.result
.data
;
377 me
.vmConfig
= data
['create-args'];
380 for (const [id
, value
] of Object
.entries(data
.disks
?? {})) {
384 'import-from': id
=== 'efidisk0' ? Ext
.htmlEncode('<none>') : value
,
390 for (const [id
, parsed
] of Object
.entries(data
.net
?? {})) {
392 parsed
.enable
= true;
395 me
.lookup('diskGrid').getStore().setData(disks
);
396 me
.lookup('netGrid').getStore().setData(nets
);
398 me
.getViewModel().set('warnings', data
.warnings
.map(w
=> renderWarning(w
)));
400 me
.setValues(me
.vmConfig
);