[pve-devel] [PATCH manager 7/8] adds the dc health, guest, resources to cluster dashboard

Dominik Csapak d.csapak at proxmox.com
Fri Oct 28 13:11:47 CEST 2016


this adds the panels to the cluster dashboard

to get the values, we add a listener to the PVE.data.ResourceStore
and iterate over all elements, collecting the data

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 www/manager6/dc/Summary.js | 136 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 136 insertions(+)

diff --git a/www/manager6/dc/Summary.js b/www/manager6/dc/Summary.js
index 9426ac5..7980c99 100644
--- a/www/manager6/dc/Summary.js
+++ b/www/manager6/dc/Summary.js
@@ -15,6 +15,39 @@ Ext.define('PVE.dc.Summary', {
 
     items: [
 	{
+	    itemId: 'dcHealth',
+	    xtype: 'pveDcHealth'
+	},
+	{
+	    itemId: 'dcGuests',
+	    xtype: 'pveDcGuests'
+	},
+	{
+	    title: gettext('Cluster Resources'),
+	    xtype: 'panel',
+	    height: 250,
+	    bodyPadding: '0 0 10 0',
+	    layout: 'column',
+	    defaults: {
+		xtype: 'pveGauge',
+		columnWidth: 1/3
+	    },
+	    items:[
+		{
+		    title: gettext('CPU'),
+		    itemId: 'cpu'
+		},
+		{
+		    title: gettext('Memory'),
+		    itemId: 'memory'
+		},
+		{
+		    title: gettext('Storage'),
+		    itemId: 'storage'
+		}
+	    ]
+	},
+	{
 	    itemId: 'nodeview',
 	    xtype: 'pveDcNodeView',
 	    height: 250
@@ -50,10 +83,113 @@ Ext.define('PVE.dc.Summary', {
 
 	me.getComponent('nodeview').setStore(gridstore);
 
+	var gueststatus = me.getComponent('dcGuests');
+
+	var cpustat = me.down('#cpu');
+	var memorystat = me.down('#memory');
+	var storagestat = me.down('#storage');
+
+	me.mon(PVE.data.ResourceStore, 'load', function(curstore, results) {
+	    me.suspendLayout = true;
+
+	    var cpu = 0;
+	    var maxcpu = 0;
+
+	    var nodes = 0;
+
+	    var memory = 0;
+	    var maxmem = 0;
+
+	    var countedStorages = {};
+	    var used = 0;
+	    var total = 0;
+
+	    var qemu = {
+		running: 0,
+		paused: 0,
+		stopped: 0,
+		template: 0
+	    };
+	    var lxc = {
+		running: 0,
+		paused: 0,
+		stopped: 0,
+		template: 0
+	    };
+	    var error = 0;
+
+	    var i;
+
+	    for (i = 0; i < results.length; i++) {
+		var item = results[i];
+		switch(item.data.type) {
+		    case 'node':
+			cpu += (item.data.cpu * item.data.maxcpu);
+			maxcpu += item.data.maxcpu || 0;
+			memory += item.data.mem || 0;
+			maxmem += item.data.maxmem || 0;
+			nodes++;
+
+			// update grid also
+			var griditem = gridstore.getById(item.data.id);
+			if (griditem) {
+			    griditem.set('cpuusage', item.data.cpu);
+			    var max = item.data.maxmem || 1;
+			    var val = item.data.mem || 0;
+			    griditem.set('memoryusage', val/max);
+			    griditem.set('uptime', item.data.uptime);
+			    griditem.commit(); //else it marks the fields as dirty
+			}
+			break;
+		    case 'storage':
+			if (!countedStorages[item.data.storage] ||
+			    (item.data.storage === 'local' &&
+			    !countedStorages[item.data.id])) {
+			    used += item.data.disk;
+			    total += item.data.maxdisk;
+
+			    countedStorages[item.data.storage === 'local'?item.data.id:item.data.storage] = true;
+			}
+			break;
+		    case 'qemu':
+			qemu[item.data.template ? 'template' : item.data.status]++;
+			if (item.data.hastate === 'error') {
+			    error++;
+			}
+			break;
+		    case 'lxc':
+			lxc[item.data.template ? 'template' : item.data.status]++;
+			if (item.data.hastate === 'error') {
+			    error++;
+			}
+			break;
+		    default: break;
+		}
+	    }
+
+	    var text = Ext.String.format(gettext('of {0} CPU(s)'), maxcpu);
+	    cpustat.updateValue((cpu/maxcpu), text);
+
+	    text = Ext.String.format(gettext('{0} of {1}'), PVE.Utils.render_size(memory), PVE.Utils.render_size(maxmem));
+	    memorystat.updateValue((memory/maxmem), text);
+
+	    text = Ext.String.format(gettext('{0} of {1}'), PVE.Utils.render_size(used), PVE.Utils.render_size(total));
+	    storagestat.updateValue((used/total), text);
+
+	    gueststatus.updateValues(qemu,lxc,error);
+
+	    me.suspendLayout = false;
+	    me.updateLayout(true);
+	});
+
+	var dcHealth = me.getComponent('dcHealth');
+	me.mon(rstore, 'load', dcHealth.updateStatus, dcHealth);
+
 	me.on('destroy', function(){
 	    rstore.stopUpdate();
 	});
 
 	rstore.startUpdate();
     }
+
 });
-- 
2.1.4





More information about the pve-devel mailing list