]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/HDEdit.js
1 /*jslint confusion: true */
2 /* 'change' property is assigned a string and then a function */
3 Ext
.define('PVE.qemu.HDInputPanel', {
4 extend
: 'Proxmox.panel.InputPanel',
5 alias
: 'widget.pveQemuHDInputPanel',
6 onlineHelp
: 'qm_hard_disk',
10 unused
: false, // ADD usused disk imaged
12 vmconfig
: {}, // used to select usused disks
16 xclass
: 'Ext.app.ViewController',
18 onControllerChange: function(field
) {
19 var value
= field
.getValue();
21 var allowIOthread
= value
.match(/^(virtio|scsi)/);
22 this.lookup('iothread').setDisabled(!allowIOthread
);
24 this.lookup('iothread').setValue(false);
27 var virtio
= value
.match(/^virtio/);
28 this.lookup('discard').setDisabled(virtio
);
29 this.lookup('ssd').setDisabled(virtio
);
31 this.lookup('discard').setValue(false);
32 this.lookup('ssd').setValue(false);
35 this.lookup('scsiController').setVisible(value
.match(/^scsi/));
39 'field[name=controller]': {
40 change
: 'onControllerChange',
41 afterrender
: 'onControllerChange'
43 'field[name=iothread]' : {
44 change: function(f
, value
) {
45 if (!this.getView().insideWizard
) {
48 var vmScsiType
= value
? 'virtio-scsi-single': 'virtio-scsi-pci';
49 this.lookupReference('scsiController').setValue(vmScsiType
);
55 onGetValues: function(values
) {
59 var confid
= me
.confid
|| (values
.controller
+ values
.deviceid
);
62 me
.drive
.file
= me
.vmconfig
[values
.unusedId
];
63 confid
= values
.controller
+ values
.deviceid
;
64 } else if (me
.isCreate
) {
66 me
.drive
.file
= values
.hdimage
;
68 me
.drive
.file
= values
.hdstorage
+ ":" + values
.disksize
;
70 me
.drive
.format
= values
.diskformat
;
73 if (values
.nobackup
) {
74 me
.drive
.backup
= 'no';
76 delete me
.drive
.backup
;
79 if (values
.noreplicate
) {
80 me
.drive
.replicate
= 'no';
82 delete me
.drive
.replicate
;
86 me
.drive
.discard
= 'on';
88 delete me
.drive
.discard
;
97 if (values
.iothread
) {
98 me
.drive
.iothread
= 'on';
100 delete me
.drive
.iothread
;
104 me
.drive
.cache
= values
.cache
;
106 delete me
.drive
.cache
;
109 var names
= ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
110 Ext
.Array
.each(names
, function(name
) {
112 me
.drive
[name
] = values
[name
];
114 delete me
.drive
[name
];
116 var burst_name
= name
+ '_max';
117 if (values
[burst_name
] && values
[name
]) {
118 me
.drive
[burst_name
] = values
[burst_name
];
120 delete me
.drive
[burst_name
];
125 params
[confid
] = PVE
.Parser
.printQemuDrive(me
.drive
);
130 setVMConfig: function(vmconfig
) {
133 me
.vmconfig
= vmconfig
;
136 me
.bussel
.setVMConfig(vmconfig
);
137 me
.scsiController
.setValue(vmconfig
.scsihw
);
139 if (me
.unusedDisks
) {
141 Ext
.Object
.each(vmconfig
, function(key
, value
) {
142 if (key
.match(/^unused\d+$/)) {
143 disklist
.push([key
, value
]);
146 me
.unusedDisks
.store
.loadData(disklist
);
147 me
.unusedDisks
.setValue(me
.confid
);
151 setDrive: function(drive
) {
157 var match
= drive
.file
.match(/^([^:]+):/);
159 values
.hdstorage
= match
[1];
162 values
.hdimage
= drive
.file
;
163 values
.nobackup
= !PVE
.Parser
.parseBoolean(drive
.backup
, 1);
164 values
.noreplicate
= !PVE
.Parser
.parseBoolean(drive
.replicate
, 1);
165 values
.diskformat
= drive
.format
|| 'raw';
166 values
.cache
= drive
.cache
|| '__default__';
167 values
.discard
= (drive
.discard
=== 'on');
168 values
.ssd
= PVE
.Parser
.parseBoolean(drive
.ssd
);
169 values
.iothread
= PVE
.Parser
.parseBoolean(drive
.iothread
);
171 values
.mbps_rd
= drive
.mbps_rd
;
172 values
.mbps_wr
= drive
.mbps_wr
;
173 values
.iops_rd
= drive
.iops_rd
;
174 values
.iops_wr
= drive
.iops_wr
;
175 values
.mbps_rd_max
= drive
.mbps_rd_max
;
176 values
.mbps_wr_max
= drive
.mbps_wr_max
;
177 values
.iops_rd_max
= drive
.iops_rd_max
;
178 values
.iops_wr_max
= drive
.iops_wr_max
;
180 me
.setValues(values
);
183 setNodename: function(nodename
) {
185 me
.down('#hdstorage').setNodename(nodename
);
186 me
.down('#hdimage').setStorage(undefined, nodename
);
189 initComponent : function() {
192 var labelWidth
= 140;
199 me
.advancedColumn1
= [];
200 me
.advancedColumn2
= [];
202 if (!me
.confid
|| me
.unused
) {
203 me
.bussel
= Ext
.create('PVE.form.ControllerSelector', {
204 vmconfig
: me
.insideWizard
? {ide2
: 'cdrom'} : {}
206 me
.column1
.push(me
.bussel
);
208 me
.scsiController
= Ext
.create('Ext.form.field.Display', {
209 fieldLabel
: gettext('SCSI Controller'),
210 reference
: 'scsiController',
211 bind
: me
.insideWizard
? {
212 value
: '{current.scsihw}'
214 renderer
: PVE
.Utils
.render_scsihw
,
218 me
.column1
.push(me
.scsiController
);
222 me
.unusedDisks
= Ext
.create('Proxmox.form.KVComboBox', {
224 fieldLabel
: gettext('Disk image'),
225 matchFieldWidth
: false,
232 me
.column1
.push(me
.unusedDisks
);
233 } else if (me
.isCreate
) {
235 xtype
: 'pveDiskStorageSelector',
236 storageContent
: 'images',
238 nodename
: me
.nodename
,
239 autoSelect
: me
.insideWizard
246 fieldLabel
: gettext('Disk image'),
253 xtype
: 'CacheTypeSelector',
255 value
: '__default__',
256 fieldLabel
: gettext('Cache')
259 xtype
: 'proxmoxcheckbox',
260 fieldLabel
: gettext('Discard'),
261 disabled
: me
.confid
&& me
.confid
.match(/^virtio/),
262 reference
: 'discard',
267 me
.advancedColumn1
.push(
269 xtype
: 'proxmoxcheckbox',
270 disabled
: me
.confid
&& me
.confid
.match(/^virtio/),
271 fieldLabel
: gettext('SSD emulation'),
272 labelWidth
: labelWidth
,
277 xtype
: 'proxmoxcheckbox',
278 disabled
: me
.confid
&& !me
.confid
.match(/^(virtio|scsi)/),
279 fieldLabel
: 'IO thread',
280 labelWidth
: labelWidth
,
281 reference
: 'iothread',
285 xtype
: 'numberfield',
289 fieldLabel
: gettext('Read limit') + ' (MB/s)',
290 labelWidth
: labelWidth
,
291 emptyText
: gettext('unlimited')
294 xtype
: 'numberfield',
298 fieldLabel
: gettext('Write limit') + ' (MB/s)',
299 labelWidth
: labelWidth
,
300 emptyText
: gettext('unlimited')
303 xtype
: 'proxmoxintegerfield',
307 fieldLabel
: gettext('Read limit') + ' (ops/s)',
308 labelWidth
: labelWidth
,
309 emptyText
: gettext('unlimited')
312 xtype
: 'proxmoxintegerfield',
316 fieldLabel
: gettext('Write limit') + ' (ops/s)',
317 labelWidth
: labelWidth
,
318 emptyText
: gettext('unlimited')
322 me
.advancedColumn2
.push(
324 xtype
: 'proxmoxcheckbox',
325 fieldLabel
: gettext('No backup'),
326 labelWidth
: labelWidth
,
330 xtype
: 'proxmoxcheckbox',
331 fieldLabel
: gettext('Skip replication'),
332 labelWidth
: labelWidth
,
336 xtype
: 'numberfield',
340 fieldLabel
: gettext('Read max burst') + ' (MB)',
341 labelWidth
: labelWidth
,
342 emptyText
: gettext('default')
345 xtype
: 'numberfield',
349 fieldLabel
: gettext('Write max burst') + ' (MB)',
350 labelWidth
: labelWidth
,
351 emptyText
: gettext('default')
354 xtype
: 'proxmoxintegerfield',
358 fieldLabel
: gettext('Read max burst') + ' (ops)',
359 labelWidth
: labelWidth
,
360 emptyText
: gettext('default')
363 xtype
: 'proxmoxintegerfield',
367 fieldLabel
: gettext('Write max burst') + ' (ops)',
368 labelWidth
: labelWidth
,
369 emptyText
: gettext('default')
376 /*jslint confusion: false */
378 Ext
.define('PVE.qemu.HDEdit', {
379 extend
: 'Proxmox.window.Edit',
385 initComponent : function() {
388 var nodename
= me
.pveSelNode
.data
.node
;
390 throw "no node name specified";
393 var unused
= me
.confid
&& me
.confid
.match(/^unused\d+$/);
395 me
.isCreate
= me
.confid
? unused
: true;
397 var ipanel
= Ext
.create('PVE.qemu.HDInputPanel', {
401 isCreate
: me
.isCreate
406 me
.subject
= gettext('Unused Disk');
407 } else if (me
.isCreate
) {
408 me
.subject
= gettext('Hard Disk');
410 me
.subject
= gettext('Hard Disk') + ' (' + me
.confid
+ ')';
413 me
.items
= [ ipanel
];
416 /*jslint confusion: true*/
417 /* 'data' is assigned an empty array in same file, and here we
418 * use it like an object
421 success: function(response
, options
) {
422 ipanel
.setVMConfig(response
.result
.data
);
424 var value
= response
.result
.data
[me
.confid
];
425 var drive
= PVE
.Parser
.parseQemuDrive(me
.confid
, value
);
427 Ext
.Msg
.alert(gettext('Error'), 'Unable to parse drive options');
431 ipanel
.setDrive(drive
);
432 me
.isValid(); // trigger validation
436 /*jslint confusion: false*/