]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/window/Restore.js
ui: guest import: add field for scsi controller
[pve-manager.git] / www / manager6 / window / Restore.js
index 4957a404d8eb81ae2d02c23ba4132f5fd9944a33..36aecc39230b10c4a3b5fc78005a7ce7dca52440 100644 (file)
@@ -47,8 +47,16 @@ Ext.define('PVE.window.Restore', {
            if (values.storage) {
                params.storage = values.storage;
            }
-           if (values.bwlimit !== undefined) {
-               params.bwlimit = values.bwlimit;
+
+           ['bwlimit', 'cores', 'name', 'memory', 'sockets'].forEach(opt => {
+               if ((values[opt] ?? '') !== '') {
+                   params[opt] = values[opt];
+               }
+           });
+
+           if (params.name && view.vmtype === 'lxc') {
+               params.hostname = params.name;
+               delete params.name;
            }
 
            let confirmMsg;
@@ -84,7 +92,13 @@ Ext.define('PVE.window.Restore', {
            };
 
            if (view.vmid) {
-               confirmMsg += '. ' + gettext('This will permanently erase current VM data.');
+               confirmMsg += `. ${Ext.String.format(
+                   gettext('This will permanently erase current {0} data.'),
+                   view.vmtype === 'lxc' ? 'CT' : 'VM',
+               )}`;
+               if (view.vmtype === 'lxc') {
+                   confirmMsg += `<br>${gettext('Mount point volumes are also erased.')}`;
+               }
                Ext.Msg.confirm(gettext('Confirm'), confirmMsg, function(btn) {
                    if (btn === 'yes') {
                        executeRestore();
@@ -94,6 +108,48 @@ Ext.define('PVE.window.Restore', {
                executeRestore();
            }
        },
+
+       afterRender: function() {
+           let view = this.getView();
+
+           Proxmox.Utils.API2Request({
+               url: `/nodes/${view.nodename}/vzdump/extractconfig`,
+               method: 'GET',
+               waitMsgTarget: view,
+               params: {
+                   volume: view.volid,
+               },
+               failure: response => Ext.Msg.alert('Error', response.htmlStatus),
+               success: function(response, options) {
+                   let allStoragesAvailable = true;
+
+                   response.result.data.split('\n').forEach(line => {
+                       let [_, key, value] = line.match(/^([^:]+):\s*(\S+)\s*$/) ?? [];
+
+                       if (!key) {
+                           return;
+                       }
+
+                       if (key === '#qmdump#map') {
+                           let match = value.match(/^(\S+):(\S+):(\S*):(\S*):$/) ?? [];
+                           // if a /dev/XYZ disk was backed up, ther is no storage hint
+                           allStoragesAvailable &&= !!match[3] && !!PVE.data.ResourceStore.getById(
+                               `storage/${view.nodename}/${match[3]}`);
+                       } else if (key === 'name' || key === 'hostname') {
+                           view.lookupReference('nameField').setEmptyText(value);
+                       } else if (key === 'memory' || key === 'cores' || key === 'sockets') {
+                           view.lookupReference(`${key}Field`).setEmptyText(value);
+                       }
+                   });
+
+                   if (!allStoragesAvailable) {
+                       let storagesel = view.down('pveStorageSelector[name=storage]');
+                       storagesel.allowBlank = false;
+                       storagesel.setEmptyText('');
+                   }
+               },
+           });
+       },
     },
 
     initComponent: function() {
@@ -161,7 +217,6 @@ Ext.define('PVE.window.Restore', {
                    xtype: 'proxmoxcheckbox',
                    name: 'unique',
                    fieldLabel: gettext('Unique'),
-                   hidden: !!me.vmid,
                    flex: 1,
                    autoEl: {
                        tag: 'div',
@@ -233,8 +288,6 @@ Ext.define('PVE.window.Restore', {
                fieldLabel: gettext('Live restore'),
                checked: false,
                hidden: !me.isPBS,
-               // align checkbox with 'start' if 'unique' is hidden
-               labelWidth: me.vmid ? 105 : 100,
            },
            {
                xtype: 'displayfield',
@@ -246,9 +299,64 @@ Ext.define('PVE.window.Restore', {
            });
        }
 
+       items.push({
+           xtype: 'fieldset',
+           title: `${gettext('Override Settings')}:`,
+           layout: 'hbox',
+           defaults: {
+               border: false,
+               layout: 'anchor',
+               flex: 1,
+           },
+           items: [
+               {
+                   padding: '0 10 0 0',
+                   items: [{
+                       xtype: 'textfield',
+                       fieldLabel: me.vmtype === 'lxc' ? gettext('Hostname') : gettext('Name'),
+                       name: 'name',
+                       vtype: 'DnsName',
+                       reference: 'nameField',
+                       allowBlank: true,
+                   }, {
+                       xtype: 'proxmoxintegerfield',
+                       fieldLabel: gettext('Cores'),
+                       name: 'cores',
+                       reference: 'coresField',
+                       minValue: 1,
+                       maxValue: 128,
+                       allowBlank: true,
+                   }],
+               },
+               {
+                   padding: '0 0 0 10',
+                   items: [
+                   {
+                       xtype: 'pveMemoryField',
+                       fieldLabel: gettext('Memory'),
+                       name: 'memory',
+                       reference: 'memoryField',
+                       value: '',
+                       allowBlank: true,
+                   },
+                   {
+                       xtype: 'proxmoxintegerfield',
+                       fieldLabel: gettext('Sockets'),
+                       name: 'sockets',
+                       reference: 'socketsField',
+                       minValue: 1,
+                       maxValue: 4,
+                       allowBlank: true,
+                       hidden: me.vmtype !== 'qemu',
+                       disabled: me.vmtype !== 'qemu',
+                   }],
+               },
+           ],
+       });
+
        let title = gettext('Restore') + ": " + (me.vmtype === 'lxc' ? 'CT' : 'VM');
        if (me.vmid) {
-           title += " " + me.vmid;
+           title = `${gettext('Overwrite')} ${title} ${me.vmid}`;
        }
 
        Ext.apply(me, {