]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/window/Restore.js
ui: safe destroy guest: add checkbox for removal of unreferenced disks
[pve-manager.git] / www / manager6 / window / Restore.js
index 14969f0982693674f1d5f019ad8e6904bf65ace4..e30956b03c2e0230188ac8629e9cf5dd1398b0fa 100644 (file)
@@ -3,7 +3,21 @@ Ext.define('PVE.window.Restore', {
 
     resizable: false,
 
-    initComponent : function() {
+    controller: {
+       xclass: 'Ext.app.ViewController',
+       control: {
+           '#liveRestore': {
+               change: function(el, newVal) {
+                   let liveWarning = this.lookupReference('liveWarning');
+                   liveWarning.setHidden(!newVal);
+                   let start = this.lookupReference('start');
+                   start.setDisabled(newVal);
+               },
+           },
+       },
+    },
+
+    initComponent: function() {
        var me = this;
 
        if (!me.nodename) {
@@ -23,8 +37,12 @@ Ext.define('PVE.window.Restore', {
            name: 'storage',
            value: '',
            fieldLabel: gettext('Storage'),
-           storageContent: (me.vmtype === 'lxc') ? 'rootdir' : 'images',
-           allowBlank: true
+           storageContent: me.vmtype === 'lxc' ? 'rootdir' : 'images',
+           // when restoring a container without specifying a storage, the backend defaults
+           // to 'local', which is unintuitive and 'rootdir' might not even be allowed on it
+           allowBlank: me.vmtype !== 'lxc',
+           emptyText: me.vmtype === 'lxc' ? '' : gettext('From backup configuration'),
+           autoSelect: me.vmtype === 'lxc',
        });
 
        var IDfield;
@@ -32,14 +50,14 @@ Ext.define('PVE.window.Restore', {
            IDfield = Ext.create('Ext.form.field.Display', {
                name: 'vmid',
                value: me.vmid,
-               fieldLabel: (me.vmtype === 'lxc') ? 'CT' : 'VM'
+               fieldLabel: me.vmtype === 'lxc' ? 'CT' : 'VM',
            });
        } else {
            IDfield = Ext.create('PVE.form.GuestIDSelector', {
                name: 'vmid',
                guestType: me.vmtype,
-               loadNextGuestID: true,
-               validateExists: false
+               loadNextFreeID: true,
+               validateExists: false,
            });
        }
 
@@ -47,18 +65,75 @@ Ext.define('PVE.window.Restore', {
            {
                xtype: 'displayfield',
                value: me.volidText || me.volid,
-               fieldLabel: gettext('Source')
+               fieldLabel: gettext('Source'),
            },
            storagesel,
-           IDfield
+           IDfield,
+           {
+               xtype: 'pveBandwidthField',
+               name: 'bwlimit',
+               backendUnit: 'KiB',
+               allowZero: true,
+               fieldLabel: gettext('Bandwidth Limit'),
+               emptyText: gettext('Defaults to target storage restore limit'),
+               autoEl: {
+                   tag: 'div',
+                   'data-qtip': gettext("Use '0' to disable all bandwidth limits."),
+               },
+           },
+           {
+               xtype: 'fieldcontainer',
+               layout: 'hbox',
+               items: [{
+                   xtype: 'proxmoxcheckbox',
+                   name: 'unique',
+                   fieldLabel: gettext('Unique'),
+                   hidden: !!me.vmid,
+                   flex: 1,
+                   autoEl: {
+                       tag: 'div',
+                       'data-qtip': gettext('Autogenerate unique properties, e.g., MAC addresses'),
+                   },
+                   checked: false,
+               },
+               {
+                   xtype: 'proxmoxcheckbox',
+                   name: 'start',
+                   reference: 'start',
+                   flex: 1,
+                   fieldLabel: gettext('Start after restore'),
+                   labelWidth: 105,
+                   checked: false,
+               }],
+           },
        ];
 
        if (me.vmtype === 'lxc') {
            items.push({
                xtype: 'proxmoxcheckbox',
                name: 'unprivileged',
-               value: '',
-               fieldLabel: gettext('Unprivileged container')
+               value: true,
+               fieldLabel: gettext('Unprivileged container'),
+           });
+       } else if (me.vmtype === 'qemu') {
+           items.push({
+               xtype: 'proxmoxcheckbox',
+               name: 'live-restore',
+               itemId: 'liveRestore',
+               flex: 1,
+               fieldLabel: gettext('Live restore'),
+               checked: false,
+               hidden: !me.isPBS,
+               // align checkbox with 'start' if 'unique' is hidden
+               labelWidth: me.vmid ? 105 : 100,
+           });
+           items.push({
+               xtype: 'displayfield',
+               reference: 'liveWarning',
+               // TODO: Remove once more tested/stable?
+               value: gettext('Note: If anything goes wrong during the live-restore, new data written by the VM will be lost.'),
+               userCls: 'pmx-hint',
+               hidden: true,
            });
        }
 
@@ -67,9 +142,9 @@ Ext.define('PVE.window.Restore', {
            border: false,
            fieldDefaults: {
                labelWidth: 100,
-               anchor: '100%'
+               anchor: '100%',
            },
-           items: items
+           items: items,
        });
 
        var form = me.formPanel.getForm();
@@ -80,32 +155,38 @@ Ext.define('PVE.window.Restore', {
                params: params,
                method: 'POST',
                waitMsgTarget: me,
-               failure: function (response, opts) {
+               failure: function(response, opts) {
                    Ext.Msg.alert(gettext('Error'), response.htmlStatus);
                },
                success: function(response, options) {
                    var upid = response.result.data;
-                   
+
                    var win = Ext.create('Proxmox.window.TaskViewer', {
-                       upid: upid
+                       upid: upid,
                    });
                    win.show();
                    me.close();
-               }
+               },
            });
        };
 
        var submitBtn = Ext.create('Ext.Button', {
            text: gettext('Restore'),
-           handler: function(){
-               var storage = storagesel.getValue();
+           handler: function() {
                var values = form.getValues();
 
                var params = {
-                   storage: storage,
                    vmid: me.vmid || values.vmid,
-                   force: me.vmid ? 1 : 0
+                   force: me.vmid ? 1 : 0,
                };
+               if (values.unique) { params.unique = 1; }
+               if (values.start && !values['live-restore']) { params.start = 1; }
+               if (values['live-restore']) { params['live-restore'] = 1; }
+               if (values.storage) { params.storage = values.storage; }
+
+               if (values.bwlimit !== undefined) {
+                   params.bwlimit = values.bwlimit;
+               }
 
                var url;
                var msg;
@@ -134,15 +215,15 @@ Ext.define('PVE.window.Restore', {
                } else {
                    doRestore(url, params);
                }
-           }
+           },
        });
 
        form.on('validitychange', function(f, valid) {
            submitBtn.setDisabled(!valid);
        });
 
-       var title =  gettext('Restore') + ": " + (
-           (me.vmtype === 'lxc') ? 'CT' : 'VM');
+       var title = gettext('Restore') + ": " + (
+           me.vmtype === 'lxc' ? 'CT' : 'VM');
 
        if (me.vmid) {
            title += " " + me.vmid;
@@ -154,10 +235,10 @@ Ext.define('PVE.window.Restore', {
            modal: true,
            layout: 'auto',
            border: false,
-           items: [ me.formPanel ],
-           buttons: [ submitBtn ]
+           items: [me.formPanel],
+           buttons: [submitBtn],
        });
 
        me.callParent();
-    }
+    },
 });