]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/HDEdit.js
qemu/HDEdit: whitespace cleanup
[pve-manager.git] / www / manager6 / qemu / HDEdit.js
CommitLineData
df15b3da 1/*jslint confusion: true */
d5e771ce 2/* 'change' property is assigned a string and then a function */
df15b3da
DM
3Ext.define('PVE.qemu.HDInputPanel', {
4 extend: 'PVE.panel.InputPanel',
85806e47 5 alias: 'widget.pveQemuHDInputPanel',
c8802a60 6 onlineHelp: 'qm_hard_disk',
df15b3da
DM
7
8 insideWizard: false,
9
10 unused: false, // ADD usused disk imaged
11
12 vmconfig: {}, // used to select usused disks
13
180d7ef5
DM
14 controller: {
15
16 xclass: 'Ext.app.ViewController',
17
18 onControllerChange: function(field) {
19 var value = field.getValue();
20 this.lookup('iothread').setDisabled(!value.match(/^(virtio|scsi)/));
21 },
22
23 control: {
9cac6b75 24 'field[name=controller]': {
180d7ef5
DM
25 change: 'onControllerChange',
26 afterrender: 'onControllerChange'
9cac6b75
DM
27 },
28 'field[name=hdstorage]': {
29 change: function(f, value) {
30 if (!value) { // initial store loading fires an unwanted 'change'
31 return;
32 }
33 var me = this.getView();
34 var rec = f.store.getById(value);
35 if (rec.data.type === 'iscsi') {
36 me.hdfilesel.setStorage(value);
37 me.hdfilesel.setDisabled(false);
38 me.formatsel.setValue('raw');
39 me.formatsel.setDisabled(true);
40 me.hdfilesel.setVisible(true);
41 me.hdsizesel.setDisabled(true);
42 me.hdsizesel.setVisible(false);
43 } else if (rec.data.type === 'lvm' ||
44 rec.data.type === 'lvmthin' ||
45 rec.data.type === 'drbd' ||
46 rec.data.type === 'rbd' ||
47 rec.data.type === 'sheepdog' ||
48 rec.data.type === 'zfs' ||
49 rec.data.type === 'zfspool') {
50 me.hdfilesel.setDisabled(true);
51 me.hdfilesel.setVisible(false);
52 me.formatsel.setValue('raw');
53 me.formatsel.setDisabled(true);
54 me.hdsizesel.setDisabled(false);
55 me.hdsizesel.setVisible(true);
56 } else {
57 me.hdfilesel.setDisabled(true);
58 me.hdfilesel.setVisible(false);
59 me.formatsel.setValue('qcow2');
60 me.formatsel.setDisabled(false);
61 me.hdsizesel.setDisabled(false);
62 me.hdsizesel.setVisible(true);
63 }
64 }
180d7ef5
DM
65 }
66 }
67 },
68
df15b3da
DM
69 onGetValues: function(values) {
70 var me = this;
71
72 var confid = me.confid || (values.controller + values.deviceid);
7a6e0635 73
df15b3da
DM
74 if (me.unused) {
75 me.drive.file = me.vmconfig[values.unusedId];
76 confid = values.controller + values.deviceid;
d5e771ce 77 } else if (me.isCreate) {
df15b3da
DM
78 if (values.hdimage) {
79 me.drive.file = values.hdimage;
80 } else {
81 me.drive.file = values.hdstorage + ":" + values.disksize;
82 }
83 me.drive.format = values.diskformat;
84 }
7a6e0635 85
df15b3da
DM
86 if (values.nobackup) {
87 me.drive.backup = 'no';
88 } else {
89 delete me.drive.backup;
90 }
91
1b6f87ab
EK
92 if (values.noreplicate) {
93 me.drive.replicate = 'no';
94 } else {
95 delete me.drive.replicate;
96 }
97
df15b3da
DM
98 if (values.discard) {
99 me.drive.discard = 'on';
100 } else {
101 delete me.drive.discard;
102 }
103
180d7ef5 104 if (values.iothread && confid.match(/^(virtio|scsi)\d+$/)) {
df15b3da
DM
105 me.drive.iothread = 'on';
106 } else {
107 delete me.drive.iothread;
108 }
109
110 if (values.cache) {
111 me.drive.cache = values.cache;
112 } else {
113 delete me.drive.cache;
114 }
115
116 var params = {};
7a6e0635 117
df15b3da 118 params[confid] = PVE.Parser.printQemuDrive(me.drive);
7a6e0635
TL
119
120 return params;
df15b3da
DM
121 },
122
123 setVMConfig: function(vmconfig) {
124 var me = this;
125
126 me.vmconfig = vmconfig;
127
128 if (me.bussel) {
129 me.bussel.setVMConfig(vmconfig, true);
130 }
131 if (me.unusedDisks) {
7a6e0635 132 var disklist = [];
df15b3da
DM
133 Ext.Object.each(vmconfig, function(key, value) {
134 if (key.match(/^unused\d+$/)) {
135 disklist.push([key, value]);
136 }
137 });
138 me.unusedDisks.store.loadData(disklist);
139 me.unusedDisks.setValue(me.confid);
140 }
141 },
142
143 setDrive: function(drive) {
144 var me = this;
145
146 me.drive = drive;
147
148 var values = {};
149 var match = drive.file.match(/^([^:]+):/);
150 if (match) {
151 values.hdstorage = match[1];
152 }
153
154 values.hdimage = drive.file;
155 values.nobackup = !PVE.Parser.parseBoolean(drive.backup, 1);
1b6f87ab 156 values.noreplicate = !PVE.Parser.parseBoolean(drive.replicate, 1);
df15b3da 157 values.diskformat = drive.format || 'raw';
ac7db8f7 158 values.cache = drive.cache || '__default__';
df15b3da
DM
159 values.discard = (drive.discard === 'on');
160 values.iothread = PVE.Parser.parseBoolean(drive.iothread);
161
162 me.setValues(values);
163 },
164
165 setNodename: function(nodename) {
166 var me = this;
167 me.hdstoragesel.setNodename(nodename);
168 me.hdfilesel.setStorage(undefined, nodename);
169 },
170
171 initComponent : function() {
172 var me = this;
173
174 me.drive = {};
175
176 me.column1 = [];
177 me.column2 = [];
178
179 if (!me.confid || me.unused) {
42902182 180 me.bussel = Ext.create('PVE.form.ControllerSelector', {
df15b3da
DM
181 vmconfig: me.insideWizard ? {ide2: 'cdrom'} : {}
182 });
183 me.column1.push(me.bussel);
184 }
185
186 if (me.unused) {
187 me.unusedDisks = Ext.create('PVE.form.KVComboBox', {
7a6e0635 188 name: 'unusedId',
df15b3da
DM
189 fieldLabel: gettext('Disk image'),
190 matchFieldWidth: false,
191 listConfig: {
192 width: 350
193 },
194 data: [],
195 allowBlank: false
196 });
197 me.column1.push(me.unusedDisks);
d5e771ce 198 } else if (me.isCreate) {
df15b3da
DM
199 me.formatsel = Ext.create('PVE.form.DiskFormatSelector', {
200 name: 'diskformat',
201 fieldLabel: gettext('Format'),
202 value: 'qcow2',
203 allowBlank: false
204 });
205
206 me.hdfilesel = Ext.create('PVE.form.FileSelector', {
207 name: 'hdimage',
208 nodename: me.nodename,
209 storageContent: 'images',
210 fieldLabel: gettext('Disk image'),
211 disabled: true,
212 hidden: true,
213 allowBlank: false
214 });
215
216 me.hdsizesel = Ext.createWidget('numberfield', {
217 name: 'disksize',
218 minValue: 0.001,
219 maxValue: 128*1024,
220 decimalPrecision: 3,
221 value: '32',
222 fieldLabel: gettext('Disk size') + ' (GB)',
223 allowBlank: false
224 });
225
226 me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
227 name: 'hdstorage',
228 nodename: me.nodename,
229 fieldLabel: gettext('Storage'),
230 storageContent: 'images',
231 autoSelect: me.insideWizard,
9cac6b75 232 allowBlank: false
df15b3da
DM
233 });
234 me.column1.push(me.hdstoragesel);
235 me.column1.push(me.hdfilesel);
236 me.column1.push(me.hdsizesel);
237 me.column1.push(me.formatsel);
238
239 } else {
240 me.column1.push({
241 xtype: 'textfield',
242 disabled: true,
243 submitValue: false,
244 fieldLabel: gettext('Disk image'),
245 name: 'hdimage'
246 });
247 }
248
249 me.column2.push({
250 xtype: 'CacheTypeSelector',
251 name: 'cache',
ca6372bd 252 value: '__default__',
df15b3da
DM
253 fieldLabel: gettext('Cache')
254 });
255
256 me.column2.push({
257 xtype: 'pvecheckbox',
258 fieldLabel: gettext('No backup'),
259 name: 'nobackup'
260 });
261
1b6f87ab
EK
262 me.column2.push({
263 xtype: 'pvecheckbox',
264 hidden: me.insideWizard,
265 fieldLabel: gettext('Skip replication'),
266 name: 'noreplicate'
267 });
268
df15b3da
DM
269 me.column2.push({
270 xtype: 'pvecheckbox',
271 fieldLabel: gettext('Discard'),
272 name: 'discard'
273 });
274
275 me.column2.push({
276 xtype: 'pvecheckbox',
180d7ef5 277 disabled: me.insideWizard || (me.confid && !me.confid.match(/^(virtio|scsi)/)),
185a77e5 278 fieldLabel: gettext('IO thread'),
180d7ef5 279 reference: 'iothread',
df15b3da
DM
280 name: 'iothread'
281 });
282
283 me.callParent();
284 }
285});
d5e771ce 286/*jslint confusion: false */
df15b3da
DM
287
288Ext.define('PVE.qemu.HDEdit', {
289 extend: 'PVE.window.Edit',
290
291 isAdd: true,
292
293 initComponent : function() {
294 var me = this;
295
296 var nodename = me.pveSelNode.data.node;
7a6e0635
TL
297 if (!nodename) {
298 throw "no node name specified";
df15b3da
DM
299 }
300
301 var unused = me.confid && me.confid.match(/^unused\d+$/);
302
d5e771ce 303 me.isCreate = me.confid ? unused : true;
df15b3da
DM
304
305 var ipanel = Ext.create('PVE.qemu.HDInputPanel', {
306 confid: me.confid,
307 nodename: nodename,
308 unused: unused,
d5e771ce 309 isCreate: me.isCreate
df15b3da
DM
310 });
311
312 var subject;
313 if (unused) {
314 me.subject = gettext('Unused Disk');
d5e771ce 315 } else if (me.isCreate) {
df15b3da
DM
316 me.subject = gettext('Hard Disk');
317 } else {
318 me.subject = gettext('Hard Disk') + ' (' + me.confid + ')';
319 }
320
321 me.items = [ ipanel ];
322
323 me.callParent();
d5e771ce
EK
324 /*jslint confusion: true*/
325 /* 'data' is assigned an empty array in same file, and here we
326 * use it like an object
327 */
df15b3da
DM
328 me.load({
329 success: function(response, options) {
330 ipanel.setVMConfig(response.result.data);
331 if (me.confid) {
332 var value = response.result.data[me.confid];
333 var drive = PVE.Parser.parseQemuDrive(me.confid, value);
334 if (!drive) {
185a77e5 335 Ext.Msg.alert(gettext('Error'), 'Unable to parse drive options');
df15b3da
DM
336 me.close();
337 return;
338 }
339 ipanel.setDrive(drive);
340 me.isValid(); // trigger validation
341 }
342 }
343 });
d5e771ce 344 /*jslint confusion: false*/
df15b3da
DM
345 }
346});