]>
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
) {
21 var value
= field
.getValue();
23 var allowIOthread
= value
.match(/^(virtio|scsi)/);
24 me
.lookup('iothread').setDisabled(!allowIOthread
);
26 me
.lookup('iothread').setValue(false);
29 var virtio
= value
.match(/^virtio/);
30 me
.lookup('ssd').setDisabled(virtio
);
32 me
.lookup('ssd').setValue(false);
35 me
.lookup('scsiController').setVisible(value
.match(/^scsi/));
40 fireIdChange: function() {
41 let view
= this.getView();
42 view
.fireEvent('diskidchange', view
, view
.bussel
.getConfId());
46 'field[name=controller]': {
47 change
: 'onControllerChange',
48 afterrender
: 'onControllerChange',
50 'field[name=deviceid]': {
51 change
: 'fireIdChange',
53 'field[name=iothread]': {
54 change: function(f
, value
) {
55 if (!this.getView().insideWizard
) {
58 var vmScsiType
= value
? 'virtio-scsi-single': 'virtio-scsi-pci';
59 this.lookupReference('scsiController').setValue(vmScsiType
);
64 init: function(view
) {
65 var vm
= this.getViewModel();
67 vm
.set('isIncludedInBackup', true);
72 onGetValues: function(values
) {
76 var confid
= me
.confid
|| values
.controller
+ values
.deviceid
;
79 me
.drive
.file
= me
.vmconfig
[values
.unusedId
];
80 confid
= values
.controller
+ values
.deviceid
;
81 } else if (me
.isCreate
) {
83 me
.drive
.file
= values
.hdimage
;
85 me
.drive
.file
= values
.hdstorage
+ ":" + values
.disksize
;
87 me
.drive
.format
= values
.diskformat
;
90 PVE
.Utils
.propertyStringSet(me
.drive
, !values
.backup
, 'backup', '0');
91 PVE
.Utils
.propertyStringSet(me
.drive
, values
.noreplicate
, 'replicate', 'no');
92 PVE
.Utils
.propertyStringSet(me
.drive
, values
.discard
, 'discard', 'on');
93 PVE
.Utils
.propertyStringSet(me
.drive
, values
.ssd
, 'ssd', 'on');
94 PVE
.Utils
.propertyStringSet(me
.drive
, values
.iothread
, 'iothread', 'on');
95 PVE
.Utils
.propertyStringSet(me
.drive
, values
.cache
, 'cache');
97 var names
= ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
98 Ext
.Array
.each(names
, function(name
) {
99 var burst_name
= name
+ '_max';
100 PVE
.Utils
.propertyStringSet(me
.drive
, values
[name
], name
);
101 PVE
.Utils
.propertyStringSet(me
.drive
, values
[burst_name
], burst_name
);
105 params
[confid
] = PVE
.Parser
.printQemuDrive(me
.drive
);
110 setVMConfig: function(vmconfig
) {
113 me
.vmconfig
= vmconfig
;
116 me
.bussel
.setVMConfig(vmconfig
);
117 me
.scsiController
.setValue(vmconfig
.scsihw
);
119 if (me
.unusedDisks
) {
121 Ext
.Object
.each(vmconfig
, function(key
, value
) {
122 if (key
.match(/^unused\d+$/)) {
123 disklist
.push([key
, value
]);
126 me
.unusedDisks
.store
.loadData(disklist
);
127 me
.unusedDisks
.setValue(me
.confid
);
131 setDrive: function(drive
) {
137 var match
= drive
.file
.match(/^([^:]+):/);
139 values
.hdstorage
= match
[1];
142 values
.hdimage
= drive
.file
;
143 values
.backup
= PVE
.Parser
.parseBoolean(drive
.backup
, 1);
144 values
.noreplicate
= !PVE
.Parser
.parseBoolean(drive
.replicate
, 1);
145 values
.diskformat
= drive
.format
|| 'raw';
146 values
.cache
= drive
.cache
|| '__default__';
147 values
.discard
= drive
.discard
=== 'on';
148 values
.ssd
= PVE
.Parser
.parseBoolean(drive
.ssd
);
149 values
.iothread
= PVE
.Parser
.parseBoolean(drive
.iothread
);
151 values
.mbps_rd
= drive
.mbps_rd
;
152 values
.mbps_wr
= drive
.mbps_wr
;
153 values
.iops_rd
= drive
.iops_rd
;
154 values
.iops_wr
= drive
.iops_wr
;
155 values
.mbps_rd_max
= drive
.mbps_rd_max
;
156 values
.mbps_wr_max
= drive
.mbps_wr_max
;
157 values
.iops_rd_max
= drive
.iops_rd_max
;
158 values
.iops_wr_max
= drive
.iops_wr_max
;
160 me
.setValues(values
);
163 setNodename: function(nodename
) {
165 me
.down('#hdstorage').setNodename(nodename
);
166 me
.down('#hdimage').setStorage(undefined, nodename
);
171 initComponent: function() {
174 var labelWidth
= 140;
181 let advancedColumn1
= [];
182 let advancedColumn2
= [];
184 if (!me
.confid
|| me
.unused
) {
185 me
.bussel
= Ext
.create('PVE.form.ControllerSelector', {
186 vmconfig
: me
.insideWizard
? { ide2
: 'cdrom' } : {},
188 column1
.push(me
.bussel
);
190 me
.scsiController
= Ext
.create('Ext.form.field.Display', {
191 fieldLabel
: gettext('SCSI Controller'),
192 reference
: 'scsiController',
193 bind
: me
.insideWizard
? {
194 value
: '{current.scsihw}',
196 renderer
: PVE
.Utils
.render_scsihw
,
200 column1
.push(me
.scsiController
);
204 me
.unusedDisks
= Ext
.create('Proxmox.form.KVComboBox', {
206 fieldLabel
: gettext('Disk image'),
207 matchFieldWidth
: false,
214 column1
.push(me
.unusedDisks
);
215 } else if (me
.isCreate
) {
217 xtype
: 'pveDiskStorageSelector',
218 storageContent
: 'images',
220 nodename
: me
.nodename
,
221 autoSelect
: me
.insideWizard
,
228 fieldLabel
: gettext('Disk image'),
235 xtype
: 'CacheTypeSelector',
237 value
: '__default__',
238 fieldLabel
: gettext('Cache'),
241 xtype
: 'proxmoxcheckbox',
242 fieldLabel
: gettext('Discard'),
243 reference
: 'discard',
248 advancedColumn1
.push(
250 xtype
: 'proxmoxcheckbox',
251 disabled
: me
.confid
&& me
.confid
.match(/^virtio/),
252 fieldLabel
: gettext('SSD emulation'),
253 labelWidth
: labelWidth
,
258 xtype
: 'proxmoxcheckbox',
259 disabled
: me
.confid
&& !me
.confid
.match(/^(virtio|scsi)/),
260 fieldLabel
: 'IO thread',
261 labelWidth
: labelWidth
,
262 reference
: 'iothread',
267 advancedColumn2
.push(
269 xtype
: 'proxmoxcheckbox',
270 fieldLabel
: gettext('Backup'),
273 'data-qtip': gettext('Include volume in backup job'),
275 labelWidth
: labelWidth
,
278 value
: '{isIncludedInBackup}',
282 xtype
: 'proxmoxcheckbox',
283 fieldLabel
: gettext('Skip replication'),
284 labelWidth
: labelWidth
,
291 xtype
: 'numberfield',
295 fieldLabel
: gettext('Read limit') + ' (MB/s)',
296 labelWidth
: labelWidth
,
297 emptyText
: gettext('unlimited'),
300 xtype
: 'numberfield',
304 fieldLabel
: gettext('Write limit') + ' (MB/s)',
305 labelWidth
: labelWidth
,
306 emptyText
: gettext('unlimited'),
309 xtype
: 'proxmoxintegerfield',
313 fieldLabel
: gettext('Read limit') + ' (ops/s)',
314 labelWidth
: labelWidth
,
315 emptyText
: gettext('unlimited'),
318 xtype
: 'proxmoxintegerfield',
322 fieldLabel
: gettext('Write limit') + ' (ops/s)',
323 labelWidth
: labelWidth
,
324 emptyText
: gettext('unlimited'),
330 xtype
: 'numberfield',
334 fieldLabel
: gettext('Read max burst') + ' (MB)',
335 labelWidth
: labelWidth
,
336 emptyText
: gettext('default'),
339 xtype
: 'numberfield',
343 fieldLabel
: gettext('Write max burst') + ' (MB)',
344 labelWidth
: labelWidth
,
345 emptyText
: gettext('default'),
348 xtype
: 'proxmoxintegerfield',
352 fieldLabel
: gettext('Read max burst') + ' (ops)',
353 labelWidth
: labelWidth
,
354 emptyText
: gettext('default'),
357 xtype
: 'proxmoxintegerfield',
361 fieldLabel
: gettext('Write max burst') + ' (ops)',
362 labelWidth
: labelWidth
,
363 emptyText
: gettext('default'),
375 title
: gettext('Disk'),
377 reference
: 'diskpanel',
382 showAdvanced
: me
.showAdvanced
,
383 getValues
: () => ({}),
386 title
: gettext('Bandwidth'),
388 reference
: 'bwpanel',
391 showAdvanced
: me
.showAdvanced
,
392 getValues
: () => ({}),
401 setAdvancedVisible: function(visible
) {
402 this.lookup('diskpanel').setAdvancedVisible(visible
);
403 this.lookup('bwpanel').setAdvancedVisible(visible
);
407 Ext
.define('PVE.qemu.HDEdit', {
408 extend
: 'Proxmox.window.Edit',
417 initComponent: function() {
420 var nodename
= me
.pveSelNode
.data
.node
;
422 throw "no node name specified";
425 var unused
= me
.confid
&& me
.confid
.match(/^unused\d+$/);
427 me
.isCreate
= me
.confid
? unused
: true;
429 var ipanel
= Ext
.create('PVE.qemu.HDInputPanel', {
433 isCreate
: me
.isCreate
,
437 me
.subject
= gettext('Unused Disk');
438 } else if (me
.isCreate
) {
439 me
.subject
= gettext('Hard Disk');
441 me
.subject
= gettext('Hard Disk') + ' (' + me
.confid
+ ')';
447 /* 'data' is assigned an empty array in same file, and here we
448 * use it like an object
451 success: function(response
, options
) {
452 ipanel
.setVMConfig(response
.result
.data
);
454 var value
= response
.result
.data
[me
.confid
];
455 var drive
= PVE
.Parser
.parseQemuDrive(me
.confid
, value
);
457 Ext
.Msg
.alert(gettext('Error'), 'Unable to parse drive options');
461 ipanel
.setDrive(drive
);
462 me
.isValid(); // trigger validation