ha/groups: allow editing node priorities through UI

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@proxmox.com>
Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2016-10-06 11:52:52 +02:00 committed by Dietmar Maurer
parent d9e0293926
commit 1a4667e6b9

View File

@ -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);
}
});