]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/Restore.js
ui: restore: fix bandwidth limit behavior
[pve-manager.git] / www / manager6 / window / Restore.js
CommitLineData
d7683c68 1Ext.define('PVE.window.Restore', {
9fccc702 2 extend: 'Ext.window.Window', // fixme: Proxmox.window.Edit?
d7683c68
DM
3
4 resizable: false,
5
8058410f 6 initComponent: function() {
d7683c68
DM
7 var me = this;
8
9 if (!me.nodename) {
10 throw "no node name specified";
11 }
12
13 if (!me.volid) {
14 throw "no volume ID specified";
15 }
16
17 if (!me.vmtype) {
18 throw "no vmtype specified";
19 }
20
21 var storagesel = Ext.create('PVE.form.StorageSelector', {
22 nodename: me.nodename,
23 name: 'storage',
24 value: '',
25 fieldLabel: gettext('Storage'),
53e3ea84 26 storageContent: me.vmtype === 'lxc' ? 'rootdir' : 'images',
6fe863ba
FE
27 // when restoring a container without specifying a storage, the backend defaults
28 // to 'local', which is unintuitive and 'rootdir' might not even be allowed on it
29 allowBlank: me.vmtype !== 'lxc',
53e3ea84 30 emptyText: me.vmtype === 'lxc' ? '' : gettext('From backup configuration'),
6fe863ba 31 autoSelect: me.vmtype === 'lxc',
d7683c68
DM
32 });
33
ed416f20
EK
34 var IDfield;
35 if (me.vmid) {
36 IDfield = Ext.create('Ext.form.field.Display', {
37 name: 'vmid',
38 value: me.vmid,
53e3ea84 39 fieldLabel: me.vmtype === 'lxc' ? 'CT' : 'VM',
ed416f20
EK
40 });
41 } else {
42 IDfield = Ext.create('PVE.form.GuestIDSelector', {
43 name: 'vmid',
44 guestType: me.vmtype,
677bb0e8 45 loadNextFreeID: true,
f6710aac 46 validateExists: false,
ed416f20
EK
47 });
48 }
49
9cf2e84b
DM
50 var items = [
51 {
52 xtype: 'displayfield',
53 value: me.volidText || me.volid,
f6710aac 54 fieldLabel: gettext('Source'),
9cf2e84b
DM
55 },
56 storagesel,
9fa4ce6d
TL
57 IDfield,
58 {
a331258a 59 xtype: 'pveBandwidthField',
9fa4ce6d 60 name: 'bwlimit',
0545b2a5 61 backendUnit: 'KiB',
9ae4a024
FE
62 allowZero: true,
63 fieldLabel: gettext('Bandwidth Limit'),
9fa4ce6d
TL
64 emptyText: gettext('Defaults to target storage restore limit'),
65 autoEl: {
66 tag: 'div',
f6710aac
TL
67 'data-qtip': gettext("Use '0' to disable all bandwidth limits."),
68 },
c517e212 69 },
8b030d08 70 {
24c55f41
TL
71 xtype: 'fieldcontainer',
72 layout: 'hbox',
73 items: [{
74 xtype: 'proxmoxcheckbox',
75 name: 'unique',
76 fieldLabel: gettext('Unique'),
77 hidden: !!me.vmid,
78 flex: 1,
79 autoEl: {
80 tag: 'div',
f6710aac 81 'data-qtip': gettext('Autogenerate unique properties, e.g., MAC addresses'),
24c55f41 82 },
f6710aac 83 checked: false,
8b030d08 84 },
24c55f41
TL
85 {
86 xtype: 'proxmoxcheckbox',
87 name: 'start',
88 flex: 1,
89 fieldLabel: gettext('Start after restore'),
90 labelWidth: 105,
f6710aac 91 checked: false,
24c55f41
TL
92 }],
93 },
9cf2e84b
DM
94 ];
95
96 if (me.vmtype === 'lxc') {
97 items.push({
896c0d50 98 xtype: 'proxmoxcheckbox',
9cf2e84b 99 name: 'unprivileged',
a1892701 100 value: true,
f6710aac 101 fieldLabel: gettext('Unprivileged container'),
9cf2e84b
DM
102 });
103 }
104
d7683c68
DM
105 me.formPanel = Ext.create('Ext.form.Panel', {
106 bodyPadding: 10,
107 border: false,
108 fieldDefaults: {
109 labelWidth: 100,
f6710aac 110 anchor: '100%',
d7683c68 111 },
f6710aac 112 items: items,
d7683c68
DM
113 });
114
115 var form = me.formPanel.getForm();
116
117 var doRestore = function(url, params) {
e7ade592 118 Proxmox.Utils.API2Request({
d7683c68
DM
119 url: url,
120 params: params,
121 method: 'POST',
122 waitMsgTarget: me,
8058410f 123 failure: function(response, opts) {
d7683c68
DM
124 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
125 },
126 success: function(response, options) {
127 var upid = response.result.data;
2a4971d8 128
8cbc11a7 129 var win = Ext.create('Proxmox.window.TaskViewer', {
f6710aac 130 upid: upid,
d7683c68
DM
131 });
132 win.show();
133 me.close();
f6710aac 134 },
d7683c68
DM
135 });
136 };
137
138 var submitBtn = Ext.create('Ext.Button', {
139 text: gettext('Restore'),
8058410f 140 handler: function() {
d7683c68
DM
141 var values = form.getValues();
142
143 var params = {
d7683c68 144 vmid: me.vmid || values.vmid,
f6710aac 145 force: me.vmid ? 1 : 0,
d7683c68 146 };
c517e212 147 if (values.unique) { params.unique = 1; }
24c55f41 148 if (values.start) { params.start = 1; }
6fe863ba 149 if (values.storage) { params.storage = values.storage; }
d7683c68 150
9fa4ce6d 151 if (values.bwlimit !== undefined) {
0545b2a5 152 params.bwlimit = values.bwlimit;
9fa4ce6d
TL
153 }
154
d7683c68 155 var url;
16152937 156 var msg;
a00a9ffd
AG
157 if (me.vmtype === 'lxc') {
158 url = '/nodes/' + me.nodename + '/lxc';
d7683c68
DM
159 params.ostemplate = me.volid;
160 params.restore = 1;
9cf2e84b 161 if (values.unprivileged) { params.unprivileged = 1; }
e7ade592 162 msg = Proxmox.Utils.format_task_description('vzrestore', params.vmid);
d7683c68
DM
163 } else if (me.vmtype === 'qemu') {
164 url = '/nodes/' + me.nodename + '/qemu';
165 params.archive = me.volid;
e7ade592 166 msg = Proxmox.Utils.format_task_description('qmrestore', params.vmid);
d7683c68
DM
167 } else {
168 throw 'unknown VM type';
169 }
170
171 if (me.vmid) {
16152937 172 msg += '. ' + gettext('This will permanently erase current VM data.');
d7683c68
DM
173 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
174 if (btn !== 'yes') {
175 return;
176 }
177 doRestore(url, params);
178 });
179 } else {
180 doRestore(url, params);
181 }
f6710aac 182 },
d7683c68
DM
183 });
184
185 form.on('validitychange', function(f, valid) {
186 submitBtn.setDisabled(!valid);
187 });
188
8058410f 189 var title = gettext('Restore') + ": " + (
53e3ea84 190 me.vmtype === 'lxc' ? 'CT' : 'VM');
185a77e5
DM
191
192 if (me.vmid) {
193 title += " " + me.vmid;
194 }
d7683c68
DM
195
196 Ext.apply(me, {
197 title: title,
198 width: 500,
199 modal: true,
200 layout: 'auto',
201 border: false,
8058410f
TL
202 items: [me.formPanel],
203 buttons: [submitBtn],
d7683c68
DM
204 });
205
206 me.callParent();
f6710aac 207 },
d7683c68 208});