]>
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 scsi
= value
.match(/^scsi/);
28 this.lookup('discard').setDisabled(!scsi
);
30 this.lookup('discard').setValue(false);
32 this.lookup('scsiController').setVisible(scsi
);
36 'field[name=controller]': {
37 change
: 'onControllerChange',
38 afterrender
: 'onControllerChange'
40 'field[name=iothread]' : {
41 change: function(f
, value
) {
42 if (!this.getView().insideWizard
) {
45 var vmScsiType
= value
? 'virtio-scsi-single': 'virtio-scsi-pci';
46 this.lookupReference('scsiController').setValue(vmScsiType
);
52 onGetValues: function(values
) {
56 var confid
= me
.confid
|| (values
.controller
+ values
.deviceid
);
59 me
.drive
.file
= me
.vmconfig
[values
.unusedId
];
60 confid
= values
.controller
+ values
.deviceid
;
61 } else if (me
.isCreate
) {
63 me
.drive
.file
= values
.hdimage
;
65 me
.drive
.file
= values
.hdstorage
+ ":" + values
.disksize
;
67 me
.drive
.format
= values
.diskformat
;
70 if (values
.nobackup
) {
71 me
.drive
.backup
= 'no';
73 delete me
.drive
.backup
;
76 if (values
.noreplicate
) {
77 me
.drive
.replicate
= 'no';
79 delete me
.drive
.replicate
;
83 me
.drive
.discard
= 'on';
85 delete me
.drive
.discard
;
88 if (values
.iothread
) {
89 me
.drive
.iothread
= 'on';
91 delete me
.drive
.iothread
;
95 me
.drive
.cache
= values
.cache
;
97 delete me
.drive
.cache
;
101 params
.scsihw
= values
.scsihw
;
104 var names
= ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
105 Ext
.Array
.each(names
, function(name
) {
107 me
.drive
[name
] = values
[name
];
109 delete me
.drive
[name
];
111 var burst_name
= name
+ '_max';
112 if (values
[burst_name
] && values
[name
]) {
113 me
.drive
[burst_name
] = values
[burst_name
];
115 delete me
.drive
[burst_name
];
120 params
[confid
] = PVE
.Parser
.printQemuDrive(me
.drive
);
125 setVMConfig: function(vmconfig
) {
128 me
.vmconfig
= vmconfig
;
131 me
.bussel
.setVMConfig(vmconfig
);
132 me
.scsiController
.setValue(vmconfig
.scsihw
);
134 if (me
.unusedDisks
) {
136 Ext
.Object
.each(vmconfig
, function(key
, value
) {
137 if (key
.match(/^unused\d+$/)) {
138 disklist
.push([key
, value
]);
141 me
.unusedDisks
.store
.loadData(disklist
);
142 me
.unusedDisks
.setValue(me
.confid
);
146 setDrive: function(drive
) {
152 var match
= drive
.file
.match(/^([^:]+):/);
154 values
.hdstorage
= match
[1];
157 values
.hdimage
= drive
.file
;
158 values
.nobackup
= !PVE
.Parser
.parseBoolean(drive
.backup
, 1);
159 values
.noreplicate
= !PVE
.Parser
.parseBoolean(drive
.replicate
, 1);
160 values
.diskformat
= drive
.format
|| 'raw';
161 values
.cache
= drive
.cache
|| '__default__';
162 values
.discard
= (drive
.discard
=== 'on');
163 values
.iothread
= PVE
.Parser
.parseBoolean(drive
.iothread
);
165 values
.mbps_rd
= drive
.mbps_rd
;
166 values
.mbps_wr
= drive
.mbps_wr
;
167 values
.iops_rd
= drive
.iops_rd
;
168 values
.iops_wr
= drive
.iops_wr
;
169 values
.mbps_rd_max
= drive
.mbps_rd_max
;
170 values
.mbps_wr_max
= drive
.mbps_wr_max
;
171 values
.iops_rd_max
= drive
.iops_rd_max
;
172 values
.iops_wr_max
= drive
.iops_wr_max
;
174 me
.setValues(values
);
177 setNodename: function(nodename
) {
179 me
.down('#hdstorage').setNodename(nodename
);
180 me
.down('#hdimage').setStorage(undefined, nodename
);
183 initComponent : function() {
186 var labelWidth
= 140;
193 me
.advancedColumn1
= [];
194 me
.advancedColumn2
= [];
196 if (!me
.confid
|| me
.unused
) {
197 me
.bussel
= Ext
.create('PVE.form.ControllerSelector', {
198 vmconfig
: me
.insideWizard
? {ide2
: 'cdrom'} : {}
200 me
.column1
.push(me
.bussel
);
202 me
.scsiController
= Ext
.create('Ext.form.field.Display', {
204 fieldLabel
: gettext('SCSI Controller'),
205 reference
: 'scsiController',
206 renderer
: PVE
.Utils
.render_scsihw
,
207 // do not change a VM wide option after creation
208 submitValue
: me
.insideWizard
,
211 me
.column1
.push(me
.scsiController
);
215 me
.unusedDisks
= Ext
.create('Proxmox.form.KVComboBox', {
217 fieldLabel
: gettext('Disk image'),
218 matchFieldWidth
: false,
225 me
.column1
.push(me
.unusedDisks
);
226 } else if (me
.isCreate
) {
228 xtype
: 'pveDiskStorageSelector',
229 storageContent
: 'images',
231 nodename
: me
.nodename
,
232 autoSelect
: me
.insideWizard
239 fieldLabel
: gettext('Disk image'),
245 xtype
: 'CacheTypeSelector',
247 value
: '__default__',
248 fieldLabel
: gettext('Cache')
251 me
.advancedColumn1
.push(
253 xtype
: 'proxmoxcheckbox',
254 fieldLabel
: gettext('Discard'),
255 disabled
: me
.confid
&& !me
.confid
.match(/^scsi/),
256 reference
: 'discard',
257 labelWidth
: labelWidth
,
261 xtype
: 'proxmoxcheckbox',
262 disabled
: me
.confid
&& !me
.confid
.match(/^(virtio|scsi)/),
263 fieldLabel
: 'IO thread',
264 labelWidth
: labelWidth
,
265 reference
: 'iothread',
269 xtype
: 'numberfield',
273 fieldLabel
: gettext('Read limit') + ' (MB/s)',
274 labelWidth
: labelWidth
,
275 emptyText
: gettext('unlimited')
278 xtype
: 'numberfield',
282 fieldLabel
: gettext('Write limit') + ' (MB/s)',
283 labelWidth
: labelWidth
,
284 emptyText
: gettext('unlimited')
287 xtype
: 'proxmoxintegerfield',
291 fieldLabel
: gettext('Read limit') + ' (ops/s)',
292 labelWidth
: labelWidth
,
293 emptyText
: gettext('unlimited')
296 xtype
: 'proxmoxintegerfield',
300 fieldLabel
: gettext('Write limit') + ' (ops/s)',
301 labelWidth
: labelWidth
,
302 emptyText
: gettext('unlimited')
306 me
.advancedColumn2
.push(
308 xtype
: 'proxmoxcheckbox',
309 fieldLabel
: gettext('No backup'),
310 labelWidth
: labelWidth
,
314 xtype
: 'proxmoxcheckbox',
315 fieldLabel
: gettext('Skip replication'),
316 labelWidth
: labelWidth
,
320 xtype
: 'numberfield',
324 fieldLabel
: gettext('Read max burst') + ' (MB)',
325 labelWidth
: labelWidth
,
326 emptyText
: gettext('default')
329 xtype
: 'numberfield',
333 fieldLabel
: gettext('Write max burst') + ' (MB)',
334 labelWidth
: labelWidth
,
335 emptyText
: gettext('default')
338 xtype
: 'proxmoxintegerfield',
342 fieldLabel
: gettext('Read max burst') + ' (ops)',
343 labelWidth
: labelWidth
,
344 emptyText
: gettext('default')
347 xtype
: 'proxmoxintegerfield',
351 fieldLabel
: gettext('Write max burst') + ' (ops)',
352 labelWidth
: labelWidth
,
353 emptyText
: gettext('default')
360 /*jslint confusion: false */
362 Ext
.define('PVE.qemu.HDEdit', {
363 extend
: 'Proxmox.window.Edit',
367 initComponent : function() {
370 var nodename
= me
.pveSelNode
.data
.node
;
372 throw "no node name specified";
375 var unused
= me
.confid
&& me
.confid
.match(/^unused\d+$/);
377 me
.isCreate
= me
.confid
? unused
: true;
379 var ipanel
= Ext
.create('PVE.qemu.HDInputPanel', {
383 isCreate
: me
.isCreate
388 me
.subject
= gettext('Unused Disk');
389 } else if (me
.isCreate
) {
390 me
.subject
= gettext('Hard Disk');
392 me
.subject
= gettext('Hard Disk') + ' (' + me
.confid
+ ')';
395 me
.items
= [ ipanel
];
398 /*jslint confusion: true*/
399 /* 'data' is assigned an empty array in same file, and here we
400 * use it like an object
403 success: function(response
, options
) {
404 ipanel
.setVMConfig(response
.result
.data
);
406 var value
= response
.result
.data
[me
.confid
];
407 var drive
= PVE
.Parser
.parseQemuDrive(me
.confid
, value
);
409 Ext
.Msg
.alert(gettext('Error'), 'Unable to parse drive options');
413 ipanel
.setDrive(drive
);
414 me
.isValid(); // trigger validation
418 /*jslint confusion: false*/