//fixme : enable/disable splitbutton Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- www/manager/Makefile | 1 + www/manager/qemu/HDEdit.js | 107 ------------------- www/manager/qemu/HDThrottle.js | 211 ++++++++++++++++++++++++++++++++++++++ www/manager/qemu/HardwareView.js | 46 ++++++++- 4 files changed, 254 insertions(+), 111 deletions(-) create mode 100644 www/manager/qemu/HDThrottle.js
diff --git a/www/manager/Makefile b/www/manager/Makefile index 46c8a32..bd6c338 100644 --- a/www/manager/Makefile +++ b/www/manager/Makefile @@ -99,6 +99,7 @@ JSSRC= \ qemu/HDEdit.js \ qemu/HDResize.js \ qemu/HDMove.js \ + qemu/HDThrottle.js \ qemu/DisplayEdit.js \ qemu/KeyboardEdit.js \ qemu/HardwareView.js \ diff --git a/www/manager/qemu/HDEdit.js b/www/manager/qemu/HDEdit.js index eb75e4e..a09ec66 100644 --- a/www/manager/qemu/HDEdit.js +++ b/www/manager/qemu/HDEdit.js @@ -39,21 +39,6 @@ Ext.define('PVE.qemu.HDInputPanel', { delete me.drive.cache; } - 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); @@ -96,14 +81,6 @@ Ext.define('PVE.qemu.HDInputPanel', { values.nobackup = (drive.backup === 'no'); values.diskformat = drive.format || 'raw'; values.cache = drive.cache || ''; - 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); }, @@ -120,7 +97,6 @@ Ext.define('PVE.qemu.HDInputPanel', { me.drive = {}; me.column1 = []; - me.column2 = []; if (!me.confid || me.unused) { me.bussel = Ext.createWidget('PVE.form.ControllerSelector', { @@ -238,89 +214,6 @@ Ext.define('PVE.qemu.HDInputPanel', { }); } - 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.column2.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.column2.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.column2.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.column2.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(); } }); diff --git a/www/manager/qemu/HDThrottle.js b/www/manager/qemu/HDThrottle.js new file mode 100644 index 0000000..8e7026c --- /dev/null +++ b/www/manager/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 + } + } + }); + } +}); diff --git a/www/manager/qemu/HardwareView.js b/www/manager/qemu/HardwareView.js index b3dea91..c1c6d1d 100644 --- a/www/manager/qemu/HardwareView.js +++ b/www/manager/qemu/HardwareView.js @@ -212,6 +212,28 @@ Ext.define('PVE.qemu.HardwareView', { win.on('destroy', reload); }; + var run_diskthrottle = function() { + var rec = sm.getSelection()[0]; + if (!rec) { + return; + } + + var rowdef = rows[rec.data.key]; + if (!rowdef.editor) { + return; + } + + var editor = rowdef.editor; + var win = Ext.create('PVE.qemu.HDThrottle', { + pveSelNode: me.pveSelNode, + confid: rec.data.key, + url: '/api2/extjs/' + baseurl + }); + + win.show(); + win.on('destroy', reload); + }; + var run_resize = function() { var rec = sm.getSelection()[0]; if (!rec) { @@ -256,10 +278,15 @@ Ext.define('PVE.qemu.HardwareView', { win.on('destroy', reload); }; - var edit_btn = new PVE.button.Button({ + var diskthrottleMenu = Ext.create('Ext.menu.Item', { + text: 'Disk Throttle', + handler: run_diskthrottle + }); + + var edit_btn = Ext.create('Ext.button.Split', { text: gettext('Edit'), selModel: sm, - disabled: true, +// disabled: true, enableFn: function(rec) { if (!rec) { return false; @@ -267,8 +294,19 @@ Ext.define('PVE.qemu.HardwareView', { var rowdef = rows[rec.data.key]; return !!rowdef.editor; }, - handler: run_editor - }); + handler: run_editor, + + menu: new Ext.menu.Menu({ + items: [ + { + text: gettext('Edit'), + + handler: run_editor, + }, + diskthrottleMenu + ] + }) + }); var resize_btn = new PVE.button.Button({ text: gettext('Resize disk'), -- 1.7.10.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel