[pve-devel] [PATCH pve-manager 5/8] Implement VMSummaryBase class

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Sep 23 17:54:43 CEST 2015


As the lxc and qemu summary pages share almost all the code we
implement a base class which provides the shared functionality.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 www/mobile/Makefile         |   1 +
 www/mobile/VMSummaryBase.js | 221 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 222 insertions(+)
 create mode 100644 www/mobile/VMSummaryBase.js

diff --git a/www/mobile/Makefile b/www/mobile/Makefile
index 065d2ac..8dcc920 100644
--- a/www/mobile/Makefile
+++ b/www/mobile/Makefile
@@ -18,6 +18,7 @@ JSSRC= 				                 	\
 	Datacenter.js					\
 	NodeSummary.js					\
 	Migrate.js					\
+	VMSummaryBase.js				\
 	QemuSummary.js					\
 	LXCSummary.js				\
 	app.js
diff --git a/www/mobile/VMSummaryBase.js b/www/mobile/VMSummaryBase.js
new file mode 100644
index 0000000..68c1626
--- /dev/null
+++ b/www/mobile/VMSummaryBase.js
@@ -0,0 +1,221 @@
+Ext.define('PVE.VMSummaryBase', {
+    extend: 'PVE.Page',
+
+    nodename: undefined,
+    vmid: undefined,
+    vmtype: undefined, // qemu or lxc
+
+    // defines the key/value config keys do display
+    config_keys: undefined,
+
+    vm_command: function(cmd, params) {
+	var me = this;
+
+	PVE.Utils.API2Request({
+	    params: params,
+	    url: '/nodes/' + me.nodename + '/' + me.vmtype + '/' + me.vmid +
+		 '/status/' + cmd,
+	    method: 'POST',
+	    success: function(response, opts) {
+		var upid = response.result.data;
+		var page = 'nodes/' + me.nodename + '/tasks/' + upid;
+		PVE.Workspace.gotoPage(page);
+	    },
+	    failure: function(response, opts) {
+		Ext.Msg.alert('Error', response.htmlStatus);
+	    }
+	});
+    },
+
+    config: {
+	items: [
+	    {
+		xtype: 'pveTitleBar'
+	    },
+	    {
+		xtype: 'component',
+		itemId: 'vmstatus',
+		styleHtmlContent: true,
+		style: 'background-color:white;',
+		tpl: [
+		    '<table style="margin-bottom:0px;">',
+		    '<tr><td>Status:</td><td>{[this.status(values)]}</td></tr>',
+		    '<tr><td>Memory:</td><td>{[this.meminfo(values)]}</td></tr>',
+		    '<tr><td>CPU:</td><td>{[this.cpuinfo(values)]}</td></tr>',
+		    '<tr><td>Uptime:</td><td>{[PVE.Utils.format_duration_long' +
+			'(values.uptime)]}</td></tr>',
+		    '</table>',
+		    {
+			meminfo: function(values) {
+			    if (!Ext.isDefined(values.mem)) {
+				return '-';
+			    }
+			    return PVE.Utils.format_size(values.mem || 0) + " of " +
+				PVE.Utils.format_size(values.maxmem);
+			},
+			cpuinfo: function(values) {
+			    if (!Ext.isDefined(values.cpu)) {
+				return '-';
+			    }
+			    var per = values.cpu * 100;
+			    return per.toFixed(2) + "% (" + values.cpus + " CPUs)";
+			},
+			status: function(values) {
+			    return values.qmpstatus ? values.qmpstatus :
+				values.status;
+			}
+		    }
+		]
+	    },
+	    {
+		xtype: 'component',
+		cls: 'dark',
+		padding: 5,
+		html: gettext('Configuration')
+	    },
+	    {
+		xtype: 'container',
+		scrollable: 'both',
+		flex: 1,
+		styleHtmlContent: true,
+		itemId: 'vmconfig',
+		style: 'background-color:white;white-space:pre',
+		tpl: [
+		    '<table style="margin-bottom:0px;">',
+		    '<tpl for=".">',
+		    '<tr><td>{key}</td><td>{value}</td></tr>',
+		    '</tpl>',
+		    '</table>'
+		]
+	    }
+	]
+    },
+
+    reload: function() {
+	var me = this;
+
+	var vm_stat = me.down('#vmstatus');
+
+	var error_handler = function(response) {
+	    me.setMasked({ xtype: 'loadmask', message: response.htmlStatus });
+	};
+
+	PVE.Utils.API2Request({
+	    url: '/nodes/' + me.nodename + '/' + me.vmtype + '/' + me.vmid +
+		 '/status/current',
+	    method: 'GET',
+	    success: function(response) {
+		var d = response.result.data;
+
+		me.render_menu(d);
+
+		vm_stat.setData(d);
+	    },
+	    failure: error_handler
+	});
+
+	var vm_cfg = me.down('#vmconfig');
+
+	PVE.Utils.API2Request({
+	    url: '/nodes/' + me.nodename + '/' + me.vmtype + '/' + me.vmid +
+		 '/config',
+	    method: 'GET',
+	    success: function(response) {
+		var d = response.result.data;
+		var kv = PVE.Workspace.obj_to_kv(d, me.config_keys);
+		vm_cfg.setData(kv);
+	    },
+	    failure: error_handler
+	});
+    },
+
+    render_menu: function(data) {
+	var me = this;
+
+	// use two item arrays for format reasons.
+	// display start, stop and migrate by default
+	var top_items = [
+	    {
+		text: gettext('Start'),
+		handler: function() {
+		    me.vm_command("start", {});
+		}
+	    },
+	    {
+		text: gettext('Stop'),
+		handler: function() {
+		    me.vm_command("stop", {});
+		}
+	    }
+	];
+
+	var bottom_items = [{
+	    text: gettext('Migrate'),
+	    handler: function() {
+		PVE.Workspace.gotoPage('nodes/' + me.nodename + '/' + me.vmtype +
+				       '/' + me.vmid +'/migrate');
+	    }
+	}];
+
+	// use qmpstatus with qemu, as it's exacter
+	var vm_status = (me.vmtype === 'qemu') ? data.qmpstatus : data.status;
+
+	if(vm_status === 'running') {
+
+	    top_items.push(
+		{
+		    text: gettext('Shutdown'),
+		    handler: function() {
+			me.vm_command("shutdown", {});
+		    }
+		},
+		{
+		    text: gettext('Suspend'),
+		    handler: function() {
+			me.vm_command("suspend", {});
+		    }
+		}
+	    );
+
+	    bottom_items.push({
+		text: gettext('Console'),
+		handler: function() {
+		    var vmtype = me.vmtype === 'qemu' ? 'kvm' : me.vmtype;
+		    PVE.Utils.openConsoleWindow('html5', vmtype, me.vmid,
+						me.nodename);
+		}
+	    });
+
+	    if(data.spice || me.vmtype==='lxc') {
+		bottom_items.push({
+		    text: gettext('Spice'),
+		    handler: function() {
+			var vmtype = me.vmtype === 'qemu' ? 'kvm' : me.vmtype;
+			PVE.Utils.openConsoleWindow('vv', vmtype, me.vmid,
+						    me.nodename);
+		    }
+		});
+	    }
+
+	} else if(vm_status === 'paused') {
+	    top_items.push({
+		text: gettext('Resume'),
+		handler: function() {
+		    me.vm_command("resume", {});
+		}
+	    });
+	}
+
+	// concat our item arrays and add them to the menu
+	me.down('pveMenuButton').setMenuItems(top_items.concat(bottom_items));
+
+    },
+
+    initialize: function() {
+	var me = this;
+
+	me.reload();
+
+	this.callParent();
+    }
+});
-- 
2.1.4




More information about the pve-devel mailing list