]>
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
21 xclass
: 'Ext.app.ViewController',
23 onControllerChange: function(field
) {
25 let vm
= this.getViewModel();
27 let value
= field
.getValue();
28 vm
.set('isSCSI', value
.match(/^scsi/));
29 vm
.set('isVirtIO', value
.match(/^virtio/));
34 fireIdChange: function() {
35 let view
= this.getView();
36 view
.fireEvent('diskidchange', view
, view
.bussel
.getConfId());
40 'field[name=controller]': {
41 change
: 'onControllerChange',
42 afterrender
: 'onControllerChange',
44 'field[name=deviceid]': {
45 change
: 'fireIdChange',
47 'field[name=iothread]': {
48 change: function(f
, value
) {
49 if (!this.getView().insideWizard
) {
52 var vmScsiType
= value
? 'virtio-scsi-single': 'virtio-scsi-pci';
53 this.lookupReference('scsiController').setValue(vmScsiType
);
58 init: function(view
) {
59 var vm
= this.getViewModel();
61 vm
.set('isIncludedInBackup', true);
64 vm
.set('isSCSI', view
.confid
.match(/^scsi/));
65 vm
.set('isVirtIO', view
.confid
.match(/^virtio/));
70 onGetValues: function(values
) {
74 var confid
= me
.confid
|| values
.controller
+ values
.deviceid
;
77 me
.drive
.file
= me
.vmconfig
[values
.unusedId
];
78 confid
= values
.controller
+ values
.deviceid
;
79 } else if (me
.isCreate
) {
81 me
.drive
.file
= values
.hdimage
;
83 me
.drive
.file
= values
.hdstorage
+ ":" + values
.disksize
;
85 me
.drive
.format
= values
.diskformat
;
88 PVE
.Utils
.propertyStringSet(me
.drive
, !values
.backup
, 'backup', '0');
89 PVE
.Utils
.propertyStringSet(me
.drive
, values
.noreplicate
, 'replicate', 'no');
90 PVE
.Utils
.propertyStringSet(me
.drive
, values
.discard
, 'discard', 'on');
91 PVE
.Utils
.propertyStringSet(me
.drive
, values
.ssd
, 'ssd', 'on');
92 PVE
.Utils
.propertyStringSet(me
.drive
, values
.iothread
, 'iothread', 'on');
93 PVE
.Utils
.propertyStringSet(me
.drive
, values
.cache
, 'cache');
95 var names
= ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
96 Ext
.Array
.each(names
, function(name
) {
97 var burst_name
= name
+ '_max';
98 PVE
.Utils
.propertyStringSet(me
.drive
, values
[name
], name
);
99 PVE
.Utils
.propertyStringSet(me
.drive
, values
[burst_name
], burst_name
);
103 params
[confid
] = PVE
.Parser
.printQemuDrive(me
.drive
);
108 updateVMConfig: function(vmconfig
) {
110 me
.vmconfig
= vmconfig
;
111 me
.bussel
?.updateVMConfig(vmconfig
);
114 setVMConfig: function(vmconfig
) {
117 me
.vmconfig
= vmconfig
;
120 me
.bussel
.setVMConfig(vmconfig
);
121 me
.scsiController
.setValue(vmconfig
.scsihw
);
123 if (me
.unusedDisks
) {
125 Ext
.Object
.each(vmconfig
, function(key
, value
) {
126 if (key
.match(/^unused\d+$/)) {
127 disklist
.push([key
, value
]);
130 me
.unusedDisks
.store
.loadData(disklist
);
131 me
.unusedDisks
.setValue(me
.confid
);
135 setDrive: function(drive
) {
141 var match
= drive
.file
.match(/^([^:]+):/);
143 values
.hdstorage
= match
[1];
146 values
.hdimage
= drive
.file
;
147 values
.backup
= PVE
.Parser
.parseBoolean(drive
.backup
, 1);
148 values
.noreplicate
= !PVE
.Parser
.parseBoolean(drive
.replicate
, 1);
149 values
.diskformat
= drive
.format
|| 'raw';
150 values
.cache
= drive
.cache
|| '__default__';
151 values
.discard
= drive
.discard
=== 'on';
152 values
.ssd
= PVE
.Parser
.parseBoolean(drive
.ssd
);
153 values
.iothread
= PVE
.Parser
.parseBoolean(drive
.iothread
);
155 values
.mbps_rd
= drive
.mbps_rd
;
156 values
.mbps_wr
= drive
.mbps_wr
;
157 values
.iops_rd
= drive
.iops_rd
;
158 values
.iops_wr
= drive
.iops_wr
;
159 values
.mbps_rd_max
= drive
.mbps_rd_max
;
160 values
.mbps_wr_max
= drive
.mbps_wr_max
;
161 values
.iops_rd_max
= drive
.iops_rd_max
;
162 values
.iops_wr_max
= drive
.iops_wr_max
;
164 me
.setValues(values
);
167 setNodename: function(nodename
) {
169 me
.down('#hdstorage').setNodename(nodename
);
170 me
.down('#hdimage').setStorage(undefined, nodename
);
175 initComponent: function() {
178 var labelWidth
= 140;
185 let advancedColumn1
= [];
186 let advancedColumn2
= [];
188 if (!me
.confid
|| me
.unused
) {
189 me
.bussel
= Ext
.create('PVE.form.ControllerSelector', {
190 vmconfig
: me
.vmconfig
,
193 column1
.push(me
.bussel
);
195 me
.scsiController
= Ext
.create('Ext.form.field.Display', {
196 fieldLabel
: gettext('SCSI Controller'),
197 reference
: 'scsiController',
198 bind
: me
.insideWizard
? {
199 value
: '{current.scsihw}',
204 renderer
: PVE
.Utils
.render_scsihw
,
208 column1
.push(me
.scsiController
);
212 me
.unusedDisks
= Ext
.create('Proxmox.form.KVComboBox', {
214 fieldLabel
: gettext('Disk image'),
215 matchFieldWidth
: false,
222 column1
.push(me
.unusedDisks
);
223 } else if (me
.isCreate
) {
225 xtype
: 'pveDiskStorageSelector',
226 storageContent
: 'images',
228 nodename
: me
.nodename
,
229 autoSelect
: me
.insideWizard
,
236 fieldLabel
: gettext('Disk image'),
243 xtype
: 'CacheTypeSelector',
245 value
: '__default__',
246 fieldLabel
: gettext('Cache'),
249 xtype
: 'proxmoxcheckbox',
250 fieldLabel
: gettext('Discard'),
251 reference
: 'discard',
256 advancedColumn1
.push(
258 xtype
: 'proxmoxcheckbox',
259 fieldLabel
: gettext('SSD emulation'),
260 labelWidth
: labelWidth
,
262 clearOnDisable
: true,
264 disabled
: '{!isVirtIO}',
268 xtype
: 'proxmoxcheckbox',
270 fieldLabel
: 'IO thread',
271 labelWidth
: labelWidth
,
272 clearOnDisable
: true,
274 disabled
: '{!isVirtIO && !isSCSI}',
279 advancedColumn2
.push(
281 xtype
: 'proxmoxcheckbox',
282 fieldLabel
: gettext('Backup'),
285 'data-qtip': gettext('Include volume in backup job'),
287 labelWidth
: labelWidth
,
290 value
: '{isIncludedInBackup}',
294 xtype
: 'proxmoxcheckbox',
295 fieldLabel
: gettext('Skip replication'),
296 labelWidth
: labelWidth
,
303 xtype
: 'numberfield',
307 fieldLabel
: gettext('Read limit') + ' (MB/s)',
308 labelWidth
: labelWidth
,
309 emptyText
: gettext('unlimited'),
312 xtype
: 'numberfield',
316 fieldLabel
: gettext('Write limit') + ' (MB/s)',
317 labelWidth
: labelWidth
,
318 emptyText
: gettext('unlimited'),
321 xtype
: 'proxmoxintegerfield',
325 fieldLabel
: gettext('Read limit') + ' (ops/s)',
326 labelWidth
: labelWidth
,
327 emptyText
: gettext('unlimited'),
330 xtype
: 'proxmoxintegerfield',
334 fieldLabel
: gettext('Write limit') + ' (ops/s)',
335 labelWidth
: labelWidth
,
336 emptyText
: gettext('unlimited'),
342 xtype
: 'numberfield',
346 fieldLabel
: gettext('Read max burst') + ' (MB)',
347 labelWidth
: labelWidth
,
348 emptyText
: gettext('default'),
351 xtype
: 'numberfield',
355 fieldLabel
: gettext('Write max burst') + ' (MB)',
356 labelWidth
: labelWidth
,
357 emptyText
: gettext('default'),
360 xtype
: 'proxmoxintegerfield',
364 fieldLabel
: gettext('Read max burst') + ' (ops)',
365 labelWidth
: labelWidth
,
366 emptyText
: gettext('default'),
369 xtype
: 'proxmoxintegerfield',
373 fieldLabel
: gettext('Write max burst') + ' (ops)',
374 labelWidth
: labelWidth
,
375 emptyText
: gettext('default'),
387 title
: gettext('Disk'),
389 reference
: 'diskpanel',
394 showAdvanced
: me
.showAdvanced
,
395 getValues
: () => ({}),
398 title
: gettext('Bandwidth'),
400 reference
: 'bwpanel',
403 showAdvanced
: me
.showAdvanced
,
404 getValues
: () => ({}),
413 setAdvancedVisible: function(visible
) {
414 this.lookup('diskpanel').setAdvancedVisible(visible
);
415 this.lookup('bwpanel').setAdvancedVisible(visible
);
419 Ext
.define('PVE.qemu.HDEdit', {
420 extend
: 'Proxmox.window.Edit',
429 initComponent: function() {
432 var nodename
= me
.pveSelNode
.data
.node
;
434 throw "no node name specified";
437 var unused
= me
.confid
&& me
.confid
.match(/^unused\d+$/);
439 me
.isCreate
= me
.confid
? unused
: true;
441 var ipanel
= Ext
.create('PVE.qemu.HDInputPanel', {
445 isCreate
: me
.isCreate
,
449 me
.subject
= gettext('Unused Disk');
450 } else if (me
.isCreate
) {
451 me
.subject
= gettext('Hard Disk');
453 me
.subject
= gettext('Hard Disk') + ' (' + me
.confid
+ ')';
459 /* 'data' is assigned an empty array in same file, and here we
460 * use it like an object
463 success: function(response
, options
) {
464 ipanel
.setVMConfig(response
.result
.data
);
466 var value
= response
.result
.data
[me
.confid
];
467 var drive
= PVE
.Parser
.parseQemuDrive(me
.confid
, value
);
469 Ext
.Msg
.alert(gettext('Error'), 'Unable to parse drive options');
473 ipanel
.setDrive(drive
);
474 me
.isValid(); // trigger validation