diff --git a/www/manager6/qemu/HDThrottle.js b/www/manager6/qemu/HDThrottle.js new file mode 100644 index 00000000..1fcedd91 --- /dev/null +++ b/www/manager6/qemu/HDThrottle.js @@ -0,0 +1,211 @@ +// fixme: howto avoid jslint type confusion? +/*jslint confusion: true */ +Ext.define('PVE.qemu.HDThrottleInputPanel', { + extend: 'PVE.panel.InputPanel', + alias: 'widget.PVE.qemu.HDThrottleInputPanel', + + insideWizard: false, + + unused: false, // ADD usused disk imaged + + vmconfig: {}, // used to select usused disks + + onGetValues: function(values) { + var me = this; + + var confid = me.confid; + + var names = ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr']; + Ext.Array.each(names, function(name) { + if (values[name]) { + me.drive[name] = values[name]; + } else { + delete me.drive[name]; + } + var burst_name = name + '_max'; + if (values[burst_name] && values[name]) { + me.drive[burst_name] = values[burst_name]; + } else { + delete me.drive[burst_name]; + } + }); + + var params = {}; + + params[confid] = PVE.Parser.printQemuDrive(me.drive); + + return params; + }, + + setDrive: function(drive) { + var me = this; + + me.drive = drive; + + var values = {}; + + values.mbps_rd = drive.mbps_rd; + values.mbps_wr = drive.mbps_wr; + values.iops_rd = drive.iops_rd; + values.iops_wr = drive.iops_wr; + values.mbps_rd_max = drive.mbps_rd_max; + values.mbps_wr_max = drive.mbps_wr_max; + values.iops_rd_max = drive.iops_rd_max; + values.iops_wr_max = drive.iops_wr_max; + + me.setValues(values); + }, + + initComponent : function() { + var me = this; + + me.drive = {}; + + me.column1 = []; + me.column2 = []; + + var width2 = 140; + + me.mbps_rd = Ext.widget('numberfield', { + name: 'mbps_rd', + minValue: 1, + step: 1, + fieldLabel: gettext('Read limit') + ' (MB/s)', + labelWidth: width2, + emptyText: gettext('unlimited') + }); + + me.column1.push(me.mbps_rd); + + me.mbps_rd_max = Ext.widget('numberfield', { + name: 'mbps_rd_max', + minValue: 1, + step: 1, + fieldLabel: gettext('Read max burst') + ' (MB)', + labelWidth: width2, + emptyText: gettext('default') + }); + + me.column2.push(me.mbps_rd_max); + + + me.mbps_wr = Ext.widget('numberfield', { + name: 'mbps_wr', + minValue: 1, + step: 1, + fieldLabel: gettext('Write limit') + ' (MB/s)', + labelWidth: width2, + emptyText: gettext('unlimited') + }); + + me.column1.push(me.mbps_wr); + + me.mbps_wr_max = Ext.widget('numberfield', { + name: 'mbps_wr_max', + minValue: 1, + step: 1, + fieldLabel: gettext('Write max burst') + ' (MB)', + labelWidth: width2, + emptyText: gettext('default') + }); + + me.column2.push(me.mbps_wr_max); + + me.iops_rd = Ext.widget('numberfield', { + name: 'iops_rd', + minValue: 10, + step: 10, + fieldLabel: gettext('Read limit') + ' (ops/s)', + labelWidth: width2, + emptyText: gettext('unlimited') + }); + + me.column1.push(me.iops_rd); + + me.iops_rd_max = Ext.widget('numberfield', { + name: 'iops_rd_max', + minValue: 10, + step: 10, + fieldLabel: gettext('Read max burst') + ' (ops)', + labelWidth: width2, + emptyText: gettext('default') + }); + + me.column2.push(me.iops_rd_max); + + me.iops_wr = Ext.widget('numberfield', { + name: 'iops_wr', + minValue: 10, + step: 10, + fieldLabel: gettext('Write limit') + ' (ops/s)', + labelWidth: width2, + emptyText: gettext('unlimited') + }); + + me.column1.push(me.iops_wr); + + me.iops_wr_max = Ext.widget('numberfield', { + name: 'iops_wr_max', + minValue: 10, + step: 10, + fieldLabel: gettext('Write max burst') + ' (ops)', + labelWidth: width2, + emptyText: gettext('default') + }); + + me.column2.push(me.iops_wr_max); + + me.callParent(); + } +}); + +Ext.define('PVE.qemu.HDThrottle', { + extend: 'PVE.window.Edit', + + isAdd: true, + + initComponent : function() { + var me = this; + + var nodename = me.pveSelNode.data.node; + if (!nodename) { + throw "no node name specified"; + } + + var unused = me.confid && me.confid.match(/^unused\d+$/); + + me.create = me.confid ? unused : true; + + var ipanel = Ext.create('PVE.qemu.HDThrottleInputPanel', { + confid: me.confid, + nodename: nodename + }); + + var subject; + if (unused) { + me.subject = gettext('Unused Disk'); + } else { + me.subject = gettext('Hard Disk') + ' (' + me.confid + ')'; + } + + me.items = [ ipanel ]; + + me.callParent(); + + me.load({ + success: function(response, options) { + if (me.confid) { + var value = response.result.data[me.confid]; + var drive = PVE.Parser.parseQemuDrive(me.confid, value); + if (!drive) { + Ext.Msg.alert(gettext('Error'), gettext('Unable to parse drive options')); + me.close(); + return; + } + ipanel.setDrive(drive); + me.isValid(); // trigger validation + } + } + }); + } +});