]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/lxc/MPEdit.js
fix #1897: bump max number of mountpoints to 256
[pve-manager.git] / www / manager6 / lxc / MPEdit.js
CommitLineData
34c235be
DC
1/*jslint confusion: true*/
2/* hidden: boolean and string
3 * bind: function and object
4 * disabled: boolean and string
5 */
342225bf 6Ext.define('PVE.lxc.MountPointInputPanel', {
ef4ef788 7 extend: 'Proxmox.panel.InputPanel',
34c235be 8 xtype: 'pveLxcMountPointInputPanel',
342225bf
DC
9
10 insideWizard: false,
11
12 onlineHelp: 'pct_container_storage',
13
14 unused: false, // add unused disk imaged
15
16 unprivileged: false,
17
18 vmconfig: {}, // used to select unused disks
19
658bf725 20 setUnprivileged: function(unprivileged) {
34c235be
DC
21 var me = this;
22 var vm = me.getViewModel();
23 me.unprivileged = unprivileged;
24 vm.set('unpriv', unprivileged);
658bf725
TL
25 },
26
342225bf
DC
27 onGetValues: function(values) {
28 var me = this;
29
30 var confid = me.confid || values.mpsel;
34c235be 31 values.file = me.down('field[name=file]').getValue();
342225bf
DC
32
33 if (me.unused) {
342225bf
DC
34 confid = values.mpsel;
35 } else if (me.isCreate) {
34c235be 36 values.file = values.hdstorage + ':' + values.disksize;
342225bf
DC
37 }
38
34c235be
DC
39 // delete unnecessary fields
40 delete values.mpsel;
41 delete values.hdstorage;
42 delete values.disksize;
43 delete values.diskformat;
342225bf
DC
44
45 var res = {};
34c235be 46 res[confid] = PVE.Parser.printLxcMountPoint(values);
342225bf
DC
47 return res;
48 },
49
34c235be 50
342225bf
DC
51 setMountPoint: function(mp) {
52 var me = this;
34c235be
DC
53 var vm = this.getViewModel();
54 vm.set('mptype', mp.type);
342225bf
DC
55 me.setValues(mp);
56 },
57
58 setVMConfig: function(vmconfig) {
59 var me = this;
34c235be 60 var vm = me.getViewModel();
342225bf 61 me.vmconfig = vmconfig;
34c235be
DC
62 vm.set('unpriv', vmconfig.unprivileged);
63 vm.notify();
64
65 PVE.Utils.forEachMP(function(bus, i) {
66 var name = "mp" + i.toString();
67 if (!Ext.isDefined(vmconfig[name])) {
68 me.down('field[name=mpsel]').setValue(name);
69 return false;
342225bf 70 }
34c235be 71 });
342225bf
DC
72 },
73
74 setNodename: function(nodename) {
75 var me = this;
34c235be
DC
76 var vm = me.getViewModel();
77 vm.set('node', nodename);
78 vm.notify();
79 me.down('#diskstorage').setNodename(nodename);
342225bf
DC
80 },
81
34c235be
DC
82 controller: {
83 xclass: 'Ext.app.ViewController',
342225bf 84
34c235be
DC
85 control: {
86 'field[name=mpsel]': {
87 change: function(field, value) {
88 field.validate();
89 }
90 },
91 '#hdstorage': {
92 change: function(field, newValue) {
93 var me = this;
94 if (!newValue) {
342225bf
DC
95 return;
96 }
34c235be
DC
97
98 var rec = field.store.getById(newValue);
99 if (!rec) {
100 return;
342225bf 101 }
34c235be
DC
102
103 var vm = me.getViewModel();
104 vm.set('type', rec.data.type);
105 vm.notify();
342225bf 106 }
34c235be
DC
107 }
108 },
109
110 init: function(view) {
111 var me = this;
112 var vm = this.getViewModel();
113 vm.set('confid', view.confid);
114 vm.set('unused', view.unused);
115 vm.set('node', view.nodename);
116 vm.set('unpriv', view.unprivileged);
117 vm.set('hideStorSelector', view.unused || !view.isCreate);
118 vm.notify();
119 }
120 },
121
122 viewModel: {
123 data: {
124 unpriv: false,
125 unused: false,
126 showStorageSelector: false,
127 mptype: '',
128 type: '',
129 confid: '',
130 node: ''
131 },
132
133 formulas: {
134 quota: function(get) {
135 return !(get('type') === 'zfs' ||
136 get('type') === 'zfspool' ||
137 get('unpriv') ||
138 get('isBind'));
139 },
140 hasMP: function(get) {
141 return !!get('confid') && !get('unused');
142 },
143 isRoot: function(get) {
144 return get('confid') === 'rootfs';
145 },
146 isBind: function(get) {
147 return get('mptype') === 'bind';
148 },
149 isBindOrRoot: function(get) {
150 return get('isBind') || get('isRoot');
151 }
342225bf 152 }
34c235be 153 },
342225bf 154
34c235be
DC
155 column1: [
156 {
157 xtype: 'proxmoxKVComboBox',
158 name: 'mpsel',
159 fieldLabel: gettext('Mount Point'),
160 matchFieldWidth: false,
161 hidden: true,
162 allowBlank: false,
6c442961 163 disabled: true,
34c235be
DC
164 bind: {
165 hidden: '{hasMP}',
166 disabled: '{hasMP}'
167 },
168 comboItems: (function(){
169 var mps = [];
170 PVE.Utils.forEachMP(function(bus,i) {
171 var name = 'mp' + i.toString();
172 mps.push([name,name]);
173 });
174 return mps;
175 }()),
176 validator: function(value) {
177 var me = this.up('inputpanel');
178 if (!me.rendered) {
179 return;
180 }
181 if (Ext.isDefined(me.vmconfig[value])) {
182 return "Mount point is already in use.";
183 }
184 /*jslint confusion: true*/
185 /* returns a string above */
186 return true;
187 }
188 },
189 {
234d2e37 190 xtype: 'pveDiskStorageSelector',
34c235be 191 itemId: 'diskstorage',
342225bf 192 storageContent: 'rootdir',
34c235be 193 hidden: true,
342225bf 194 autoSelect: true,
34c235be 195 selectformat: false,
c6c8e2fc 196 defaultSize: 8,
34c235be
DC
197 bind: {
198 hidden: '{hideStorSelector}',
199 disabled: '{hideStorSelector}',
200 nodename: '{node}'
201 }
202 },
203 {
204 xtype: 'textfield',
205 disabled: true,
206 submitValue: false,
207 fieldLabel: gettext('Disk image'),
208 name: 'file',
209 bind: {
210 hidden: '{!hideStorSelector}'
211 }
342225bf 212 }
34c235be
DC
213 ],
214
215 column2: [
216 {
217 xtype: 'textfield',
218 name: 'mp',
219 value: '',
220 emptyText: gettext('/some/path'),
221 allowBlank: false,
6c442961 222 disabled: true,
34c235be
DC
223 fieldLabel: gettext('Path'),
224 bind: {
225 hidden: '{isRoot}',
226 disabled: '{isRoot}'
227 }
228 },
229 {
230 xtype: 'proxmoxcheckbox',
231 name: 'backup',
232 fieldLabel: gettext('Backup'),
233 bind: {
234 hidden: '{isRoot}',
235 disabled: '{isBindOrRoot}'
236 }
237 }
238 ],
342225bf 239
34c235be
DC
240 advancedColumn1: [
241 {
242 xtype: 'proxmoxcheckbox',
342225bf
DC
243 name: 'quota',
244 defaultValue: 0,
34c235be
DC
245 bind: {
246 disabled: '{!quota}'
247 },
658bf725
TL
248 fieldLabel: gettext('Enable quota'),
249 listeners: {
250 disable: function() {
251 this.reset();
252 }
253 }
34c235be
DC
254 },
255 {
256 xtype: 'proxmoxcheckbox',
257 name: 'ro',
258 defaultValue: 0,
259 bind: {
260 hidden: '{isRoot}',
261 disabled: '{isRoot}'
262 },
263 fieldLabel: gettext('Read-only')
342225bf 264 }
34c235be 265 ],
342225bf 266
34c235be
DC
267 advancedColumn2: [
268 {
269 xtype: 'proxmoxKVComboBox',
270 name: 'acl',
271 fieldLabel: 'ACLs',
272 deleteEmpty: false,
273 comboItems: [
274 ['__default__', Proxmox.Utils.defaultText],
275 ['1', Proxmox.Utils.enabledText],
276 ['0', Proxmox.Utils.disabledText]
277 ],
278 value: '__default__',
279 bind: {
280 disabled: '{isBind}'
281 },
282 allowBlank: true
283 },
284 {
285 xtype: 'proxmoxcheckbox',
286 inputValue: '0', // reverses the logic
287 name: 'replicate',
288 fieldLabel: gettext('Skip replication')
234d2e37 289 }
34c235be 290 ]
342225bf
DC
291});
292
293Ext.define('PVE.lxc.MountPointEdit', {
9fccc702 294 extend: 'Proxmox.window.Edit',
342225bf
DC
295
296 unprivileged: false,
297
298 initComponent : function() {
299 var me = this;
300
301 var nodename = me.pveSelNode.data.node;
302 if (!nodename) {
303 throw "no node name specified";
304 }
305
306 var unused = me.confid && me.confid.match(/^unused\d+$/);
307
308 me.isCreate = me.confid ? unused : true;
309
310 var ipanel = Ext.create('PVE.lxc.MountPointInputPanel', {
311 confid: me.confid,
312 nodename: nodename,
313 unused: unused,
314 unprivileged: me.unprivileged,
315 isCreate: me.isCreate
316 });
317
318 var subject;
319 if (unused) {
320 subject = gettext('Unused Disk');
321 } else if (me.isCreate) {
322 subject = gettext('Mount Point');
323 } else {
324 subject = gettext('Mount Point') + ' (' + me.confid + ')';
325 }
326
327 Ext.apply(me, {
328 subject: subject,
dc683ca0 329 defaultFocus: me.confid !== 'rootfs' ? 'textfield[name=mp]' : 'tool',
342225bf
DC
330 items: ipanel
331 });
332
333 me.callParent();
334
335 me.load({
336 success: function(response, options) {
337 ipanel.setVMConfig(response.result.data);
338 if (me.confid) {
339 /*jslint confusion: true*/
340 /*data is defined as array above*/
341 var value = response.result.data[me.confid];
342 /*jslint confusion: false*/
343 var mp = PVE.Parser.parseLxcMountPoint(value);
344
345 if (!mp) {
346 Ext.Msg.alert(gettext('Error'), 'Unable to parse mount point options');
347 me.close();
348 return;
349 }
350
351 ipanel.setMountPoint(mp);
352 me.isValid(); // trigger validation
353 }
354 }
355 });
356 }
357});