This allows the setting of node priorities in HA groups.

Use a grid panel like in the dc.BackupEdit window with an widget
column which adds a number field per row to set and edit the nodes
priority.

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.lampre...@proxmox.com>
---

This is loosely based on the VMID selection of 'PVE.dc.BackupEdit'
idea/code.

I used initially an nodefield.on('change') event callback to call
the update_node_selection() function, but as it only one call is
needed when editing a existing group, I call it just once in the
overwritten setValue method.

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

diff --git a/www/manager6/ha/GroupEdit.js b/www/manager6/ha/GroupEdit.js
index 0d9c3c5..b9f9d61 100644
--- a/www/manager6/ha/GroupEdit.js
+++ b/www/manager6/ha/GroupEdit.js
@@ -13,9 +13,159 @@ Ext.define('PVE.ha.GroupInputPanel', {
        return values;
     },
 
+    setValues: function(values) {
+       var me = this;
+
+       me.callParent([values]);
+
+       if (values.nodes) {
+           me.update_node_selection(values.nodes)
+       }
+    },
+
     initComponent : function() {
        var me = this;
 
+       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', 'prio' ],
+           data: data,
+           proxy: {
+               type: 'memory',
+               reader: {type: 'json'}
+           },
+           sorters: [
+               {
+                   property : 'node',
+                   direction: 'ASC'
+               }
+           ]
+       });
+
+       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: 'prio',
+                   sortable: true,
+                   stopSelection: true,
+                   widget: {
+                       xtype: 'numberfield',
+                       minValue: 0,
+                       listeners: {
+                           change: function(numberfield, value, old_value) {
+                               if (value === old_value) {
+                                       return;
+                               }
+                               var rowIndex = 
numberfield.up('gridview').indexOf(numberfield.el.up('table'));
+                               var record = 
numberfield.up('gridview').getStore().getAt(rowIndex);
+                               if (record) {
+                                   record.set('prio', value);
+
+                                   update_nodefield(sm.getSelection());
+                               }
+                           }
+                       }
+                   }
+               }
+           ]
+       });
+
+       var nodefield = Ext.create('Ext.form.field.Hidden', {
+           name: 'nodes',
+           value: '',
+           isValid: function () {
+               var value = nodefield.getValue();
+               return (value && 0 !== value.length);
+           }
+       });
+
+       var insideUpdate = false;
+
+       // only call once when editing a group
+       me.update_node_selection = function(string) {
+           if (insideUpdate) { // just to be sure
+               return;
+           }
+           insideUpdate = true;
+
+           sm.deselectAll(true);
+
+           string.split(',').forEach(function (e, idx, array) {
+               res = e.split(':');
+
+               store.each(function(record) {
+                   node = record.get('node');
+
+                   if (node == res[0]) {
+                       sm.select(record, true);
+                          record.set('prio', res[1]);
+                          record.commit();
+                   }
+               });
+           });
+           nodegrid.reconfigure(store);
+
+           insideUpdate = false;
+       };
+
+       var update_nodefield = function(selected) {
+           if (!insideUpdate) { // avoid endless loop
+               var sel = '';
+               first_iter = true;
+               Ext.Array.each(selected, function(record) {
+                   if (!first_iter) {
+                       sel += ',';
+                   }
+                   first_iter = false;
+
+                   sel += record.data.node;
+                   if (record.data.prio) {
+                       sel += ':' + record.data.prio;
+                   }
+               });
+
+               insideUpdate = true;
+               nodefield.setValue(sel);
+               insideUpdate = false;
+           }
+       }
+
        me.column1 = [
            {
                xtype: me.create ? 'textfield' : 'displayfield',
@@ -25,14 +175,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 +198,8 @@ Ext.define('PVE.ha.GroupInputPanel', {
                xtype: 'textfield',
                name: 'comment',
                fieldLabel: gettext('Comment')
-           }
+           },
+           nodegrid
        ];
        
        me.callParent();
@@ -97,10 +241,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


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to