]>
Commit | Line | Data |
---|---|---|
d7683c68 | 1 | Ext.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 | }); |