]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/HDEdit.js
1 /* 'change' property is assigned a string and then a function */
2 Ext
.define('PVE.qemu.HDInputPanel', {
3 extend
: 'Proxmox.panel.InputPanel',
4 alias
: 'widget.pveQemuHDInputPanel',
5 onlineHelp
: 'qm_hard_disk',
9 unused
: false, // ADD usused disk imaged
11 vmconfig
: {}, // used to select usused disks
17 xclass
: 'Ext.app.ViewController',
19 onControllerChange: function(field
) {
20 var value
= field
.getValue();
22 var allowIOthread
= value
.match(/^(virtio|scsi)/);
23 this.lookup('iothread').setDisabled(!allowIOthread
);
25 this.lookup('iothread').setValue(false);
28 var virtio
= value
.match(/^virtio/);
29 this.lookup('ssd').setDisabled(virtio
);
31 this.lookup('ssd').setValue(false);
34 this.lookup('scsiController').setVisible(value
.match(/^scsi/));
38 'field[name=controller]': {
39 change
: 'onControllerChange',
40 afterrender
: 'onControllerChange',
42 'field[name=iothread]' : {
43 change: function(f
, value
) {
44 if (!this.getView().insideWizard
) {
47 var vmScsiType
= value
? 'virtio-scsi-single': 'virtio-scsi-pci';
48 this.lookupReference('scsiController').setValue(vmScsiType
);
53 init: function(view
) {
54 var vm
= this.getViewModel();
56 vm
.set('isIncludedInBackup', true);
61 onGetValues: function(values
) {
65 var confid
= me
.confid
|| (values
.controller
+ values
.deviceid
);
68 me
.drive
.file
= me
.vmconfig
[values
.unusedId
];
69 confid
= values
.controller
+ values
.deviceid
;
70 } else if (me
.isCreate
) {
72 me
.drive
.file
= values
.hdimage
;
74 me
.drive
.file
= values
.hdstorage
+ ":" + values
.disksize
;
76 me
.drive
.format
= values
.diskformat
;
79 PVE
.Utils
.propertyStringSet(me
.drive
, !values
.backup
, 'backup', '0');
80 PVE
.Utils
.propertyStringSet(me
.drive
, values
.noreplicate
, 'replicate', 'no');
81 PVE
.Utils
.propertyStringSet(me
.drive
, values
.discard
, 'discard', 'on');
82 PVE
.Utils
.propertyStringSet(me
.drive
, values
.ssd
, 'ssd', 'on');
83 PVE
.Utils
.propertyStringSet(me
.drive
, values
.iothread
, 'iothread', 'on');
84 PVE
.Utils
.propertyStringSet(me
.drive
, values
.cache
, 'cache');
86 var names
= ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
87 Ext
.Array
.each(names
, function(name
) {
88 var burst_name
= name
+ '_max';
89 PVE
.Utils
.propertyStringSet(me
.drive
, values
[name
], name
);
90 PVE
.Utils
.propertyStringSet(me
.drive
, values
[burst_name
], burst_name
);
94 params
[confid
] = PVE
.Parser
.printQemuDrive(me
.drive
);
99 setVMConfig: function(vmconfig
) {
102 me
.vmconfig
= vmconfig
;
105 me
.bussel
.setVMConfig(vmconfig
);
106 me
.scsiController
.setValue(vmconfig
.scsihw
);
108 if (me
.unusedDisks
) {
110 Ext
.Object
.each(vmconfig
, function(key
, value
) {
111 if (key
.match(/^unused\d+$/)) {
112 disklist
.push([key
, value
]);
115 me
.unusedDisks
.store
.loadData(disklist
);
116 me
.unusedDisks
.setValue(me
.confid
);
120 setDrive: function(drive
) {
126 var match
= drive
.file
.match(/^([^:]+):/);
128 values
.hdstorage
= match
[1];
131 values
.hdimage
= drive
.file
;
132 values
.backup
= PVE
.Parser
.parseBoolean(drive
.backup
, 1);
133 values
.noreplicate
= !PVE
.Parser
.parseBoolean(drive
.replicate
, 1);
134 values
.diskformat
= drive
.format
|| 'raw';
135 values
.cache
= drive
.cache
|| '__default__';
136 values
.discard
= (drive
.discard
=== 'on');
137 values
.ssd
= PVE
.Parser
.parseBoolean(drive
.ssd
);
138 values
.iothread
= PVE
.Parser
.parseBoolean(drive
.iothread
);
140 values
.mbps_rd
= drive
.mbps_rd
;
141 values
.mbps_wr
= drive
.mbps_wr
;
142 values
.iops_rd
= drive
.iops_rd
;
143 values
.iops_wr
= drive
.iops_wr
;
144 values
.mbps_rd_max
= drive
.mbps_rd_max
;
145 values
.mbps_wr_max
= drive
.mbps_wr_max
;
146 values
.iops_rd_max
= drive
.iops_rd_max
;
147 values
.iops_wr_max
= drive
.iops_wr_max
;
149 me
.setValues(values
);
152 setNodename: function(nodename
) {
154 me
.down('#hdstorage').setNodename(nodename
);
155 me
.down('#hdimage').setStorage(undefined, nodename
);
158 initComponent : function() {
161 var labelWidth
= 140;
168 me
.advancedColumn1
= [];
169 me
.advancedColumn2
= [];
171 if (!me
.confid
|| me
.unused
) {
172 me
.bussel
= Ext
.create('PVE.form.ControllerSelector', {
173 vmconfig
: me
.insideWizard
? {ide2
: 'cdrom'} : {},
175 me
.column1
.push(me
.bussel
);
177 me
.scsiController
= Ext
.create('Ext.form.field.Display', {
178 fieldLabel
: gettext('SCSI Controller'),
179 reference
: 'scsiController',
180 bind
: me
.insideWizard
? {
181 value
: '{current.scsihw}',
183 renderer
: PVE
.Utils
.render_scsihw
,
187 me
.column1
.push(me
.scsiController
);
191 me
.unusedDisks
= Ext
.create('Proxmox.form.KVComboBox', {
193 fieldLabel
: gettext('Disk image'),
194 matchFieldWidth
: false,
201 me
.column1
.push(me
.unusedDisks
);
202 } else if (me
.isCreate
) {
204 xtype
: 'pveDiskStorageSelector',
205 storageContent
: 'images',
207 nodename
: me
.nodename
,
208 autoSelect
: me
.insideWizard
,
215 fieldLabel
: gettext('Disk image'),
222 xtype
: 'CacheTypeSelector',
224 value
: '__default__',
225 fieldLabel
: gettext('Cache'),
228 xtype
: 'proxmoxcheckbox',
229 fieldLabel
: gettext('Discard'),
230 reference
: 'discard',
235 me
.advancedColumn1
.push(
237 xtype
: 'proxmoxcheckbox',
238 disabled
: me
.confid
&& me
.confid
.match(/^virtio/),
239 fieldLabel
: gettext('SSD emulation'),
240 labelWidth
: labelWidth
,
245 xtype
: 'proxmoxcheckbox',
246 disabled
: me
.confid
&& !me
.confid
.match(/^(virtio|scsi)/),
247 fieldLabel
: 'IO thread',
248 labelWidth
: labelWidth
,
249 reference
: 'iothread',
253 xtype
: 'numberfield',
257 fieldLabel
: gettext('Read limit') + ' (MB/s)',
258 labelWidth
: labelWidth
,
259 emptyText
: gettext('unlimited'),
262 xtype
: 'numberfield',
266 fieldLabel
: gettext('Write limit') + ' (MB/s)',
267 labelWidth
: labelWidth
,
268 emptyText
: gettext('unlimited'),
271 xtype
: 'proxmoxintegerfield',
275 fieldLabel
: gettext('Read limit') + ' (ops/s)',
276 labelWidth
: labelWidth
,
277 emptyText
: gettext('unlimited'),
280 xtype
: 'proxmoxintegerfield',
284 fieldLabel
: gettext('Write limit') + ' (ops/s)',
285 labelWidth
: labelWidth
,
286 emptyText
: gettext('unlimited'),
290 me
.advancedColumn2
.push(
292 xtype
: 'proxmoxcheckbox',
293 fieldLabel
: gettext('Backup'),
296 'data-qtip': gettext('Include volume in backup job'),
298 labelWidth
: labelWidth
,
301 value
: '{isIncludedInBackup}',
305 xtype
: 'proxmoxcheckbox',
306 fieldLabel
: gettext('Skip replication'),
307 labelWidth
: labelWidth
,
311 xtype
: 'numberfield',
315 fieldLabel
: gettext('Read max burst') + ' (MB)',
316 labelWidth
: labelWidth
,
317 emptyText
: gettext('default'),
320 xtype
: 'numberfield',
324 fieldLabel
: gettext('Write max burst') + ' (MB)',
325 labelWidth
: labelWidth
,
326 emptyText
: gettext('default'),
329 xtype
: 'proxmoxintegerfield',
333 fieldLabel
: gettext('Read max burst') + ' (ops)',
334 labelWidth
: labelWidth
,
335 emptyText
: gettext('default'),
338 xtype
: 'proxmoxintegerfield',
342 fieldLabel
: gettext('Write max burst') + ' (ops)',
343 labelWidth
: labelWidth
,
344 emptyText
: gettext('default'),
352 Ext
.define('PVE.qemu.HDEdit', {
353 extend
: 'Proxmox.window.Edit',
359 initComponent : function() {
362 var nodename
= me
.pveSelNode
.data
.node
;
364 throw "no node name specified";
367 var unused
= me
.confid
&& me
.confid
.match(/^unused\d+$/);
369 me
.isCreate
= me
.confid
? unused
: true;
371 var ipanel
= Ext
.create('PVE.qemu.HDInputPanel', {
375 isCreate
: me
.isCreate
,
380 me
.subject
= gettext('Unused Disk');
381 } else if (me
.isCreate
) {
382 me
.subject
= gettext('Hard Disk');
384 me
.subject
= gettext('Hard Disk') + ' (' + me
.confid
+ ')';
387 me
.items
= [ ipanel
];
390 /* 'data' is assigned an empty array in same file, and here we
391 * use it like an object
394 success: function(response
, options
) {
395 ipanel
.setVMConfig(response
.result
.data
);
397 var value
= response
.result
.data
[me
.confid
];
398 var drive
= PVE
.Parser
.parseQemuDrive(me
.confid
, value
);
400 Ext
.Msg
.alert(gettext('Error'), 'Unable to parse drive options');
404 ipanel
.setDrive(drive
);
405 me
.isValid(); // trigger validation