[pve-devel] [PATCH manager v3 2/2] ha/groups: allow editing node priorities through UI

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Oct 6 11:52:52 CEST 2016


This allows the setting and editing node priorities in HA groups.

Also fixes the bug where the priorities of an existing group (e.g.
set through the CLI) where deleted when editing said group through
the GUI.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
Reviewed-by: Dominik Csapak <d.csapak at proxmox.com>
---

changes since v2:
* addressed jslint errors (missing ';', use of undefined and global
  variable)

 www/manager6/ha/GroupEdit.js | 148 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 135 insertions(+), 13 deletions(-)

diff --git a/www/manager6/ha/GroupEdit.js b/www/manager6/ha/GroupEdit.js
index 0d9c3c5..bea596c 100644
--- a/www/manager6/ha/GroupEdit.js
+++ b/www/manager6/ha/GroupEdit.js
@@ -16,6 +16,138 @@ Ext.define('PVE.ha.GroupInputPanel', {
     initComponent : function() {
 	var me = this;
 
+	var update_nodefield, update_node_selection;
+
+	var sm = Ext.create('Ext.selection.CheckboxModel', {
+	    mode: 'SIMPLE',
+	    listeners: {
+		selectionchange: function(model, selected) {
+		    update_nodefield(selected);
+		}
+	    }
+	});
+
+	// use already cached data to avoid an API call
+	var data = PVE.data.ResourceStore.getNodes();
+
+	var store = Ext.create('Ext.data.Store', {
+	    fields: [ 'node', 'mem', 'cpu', 'priority' ],
+	    data: data,
+	    proxy: {
+		type: 'memory',
+		reader: {type: 'json'}
+	    },
+	    sorters: [
+		{
+		    property : 'node',
+		    direction: 'ASC'
+		}
+	    ]
+	});
+
+	var nodegrid = Ext.createWidget('grid', {
+	    store: store,
+	    border: true,
+	    height: 300,
+	    selModel: sm,
+	    columns: [
+		{
+		    header: gettext('Node'),
+		    flex: 1,
+		    dataIndex: 'node'
+		},
+		{
+		    header: gettext('Memory usage') + " %",
+		    renderer: PVE.Utils.render_mem_usage_percent,
+		    sortable: true,
+		    width: 150,
+		    dataIndex: 'mem'
+		},
+		{
+		    header: gettext('CPU usage'),
+		    renderer: PVE.Utils.render_cpu,
+		    sortable: true,
+		    width: 150,
+		    dataIndex: 'cpu'
+		},
+		{
+		    header: 'Priority',
+		    xtype: 'widgetcolumn',
+		    dataIndex: 'priority',
+		    sortable: true,
+		    stopSelection: true,
+		    widget: {
+			xtype: 'numberfield',
+			minValue: 0,
+			maxValue: 1000,
+			listeners: {
+			    change: function(numberfield, value, old_value) {
+				var record = numberfield.getWidgetRecord();
+				record.set('priority', value);
+				update_nodefield(sm.getSelection());
+			    }
+			}
+		    }
+		}
+	    ]
+	});
+
+	var nodefield = Ext.create('Ext.form.field.Hidden', {
+	    name: 'nodes',
+	    value: '',
+	    listeners: {
+		change: function (nodefield, value) {
+		    update_node_selection(value);
+		}
+	    },
+	    isValid: function () {
+		var value = nodefield.getValue();
+		return (value && 0 !== value.length);
+	    }
+	});
+
+	update_node_selection = function(string) {
+	    sm.deselectAll(true);
+
+	    string.split(',').forEach(function (e, idx, array) {
+		var res = e.split(':');
+
+		store.each(function(record) {
+		    var node = record.get('node');
+
+		    if (node == res[0]) {
+			sm.select(record, true);
+			record.set('priority', res[1]);
+			record.commit();
+		    }
+		});
+	    });
+	    nodegrid.reconfigure(store);
+
+	};
+
+	update_nodefield = function(selected) {
+	    var nodes = '';
+	    var first_iteration = true;
+	    Ext.Array.each(selected, function(record) {
+		if (!first_iteration) {
+		    nodes += ',';
+		}
+		first_iteration = false;
+
+		nodes += record.data.node;
+		if (record.data.priority) {
+		    nodes += ':' + record.data.priority;
+		}
+	    });
+
+	    // nodefield change listener calls us again, which results in a
+	    // endless recursion, suspend the event temporary to avoid this
+	    nodefield.suspendEvent('change');
+	    nodefield.setValue(nodes);
+	    nodefield.resumeEvent('change');
+	};
+
 	me.column1 = [
 	    {
 		xtype: me.create ? 'textfield' : 'displayfield',
@@ -25,14 +157,7 @@ Ext.define('PVE.ha.GroupInputPanel', {
 		vtype: 'StorageId',
 		allowBlank: false
 	    },
-	    {
-		xtype: 'pveNodeSelector',
-		name: 'nodes',
-		fieldLabel: gettext('Nodes'),
-		allowBlank: false,
-		multiSelect: true,
-		autoSelect: false
-	    }
+	    nodefield
 	];
 
 	me.column2 = [
@@ -55,7 +180,8 @@ Ext.define('PVE.ha.GroupInputPanel', {
 		xtype: 'textfield',
 		name: 'comment',
 		fieldLabel: gettext('Comment')
-	    }
+	    },
+	    nodegrid
 	];
 	
 	me.callParent();
@@ -97,10 +223,6 @@ Ext.define('PVE.ha.GroupEdit', {
 		success:  function(response, options) {
 		    var values = response.result.data;
 
-		    if (values.nodes) {
-			values.nodes = values.nodes.split(',');
-		    }
-
 		    ipanel.setValues(values);
 		}
 	    });
-- 
2.1.4





More information about the pve-devel mailing list