all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH manager] ui: node summary: show repository configuration status
@ 2021-06-23 16:11 Fabian Ebner
  2021-07-05  6:52 ` [pve-devel] applied: " Thomas Lamprecht
  0 siblings, 1 reply; 2+ messages in thread
From: Fabian Ebner @ 2021-06-23 16:11 UTC (permalink / raw)
  To: pve-devel

I tried to use itemid and lookupreference for the nodeStatus item, but couldn't
get it to work, so I factored it out.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Depends on the APT repositories API/UI series.
https://lists.proxmox.com/pipermail/pve-devel/2021-June/048963.html

 www/manager6/node/StatusView.js | 102 ++++++++++++++++++++++++++++++++
 www/manager6/node/Summary.js    |  49 +++++++++++++--
 2 files changed, 145 insertions(+), 6 deletions(-)

diff --git a/www/manager6/node/StatusView.js b/www/manager6/node/StatusView.js
index 564658c4..f4a55d14 100644
--- a/www/manager6/node/StatusView.js
+++ b/www/manager6/node/StatusView.js
@@ -2,6 +2,69 @@ Ext.define('PVE.node.StatusView', {
     extend: 'Proxmox.panel.StatusView',
     alias: 'widget.pveNodeStatus',
 
+    viewModel: {
+	data: {
+	    subscriptionActive: '',
+	    noSubscriptionRepo: '',
+	    enterpriseRepo: '',
+	    testRepo: '',
+	},
+	formulas: {
+	    repoStatus: function(get) {
+		if (get('subscriptionActive') === '' ||
+		    get('enterpriseRepo') === '') {
+		    return '';
+		}
+
+		if (!get('subscriptionActive') && get('enterpriseRepo')) {
+		    return 'no-sub';
+		}
+
+		if (get('noSubscriptionRepo') || get('testRepo')) {
+		    return 'non-production';
+		}
+
+		if (!get('enterpriseRepo') || !get('noSubscriptionRepo') || !get('testRepo')) {
+		    return 'no-repo';
+		}
+
+		return 'ok';
+	    },
+	    repoStatusMessage: function(get) {
+		const status = get('repoStatus');
+
+		if (status === 'ok') {
+		    return gettext('Enterprise repository and subscription active');
+		} else if (status === 'no-sub') {
+		    return gettext('Enterprise repository enabled, but no active subscription');
+		} else if (status === 'non-production') {
+		    return gettext('No-subscription or test repository in use');
+		} else if (status === 'no-repo') {
+		    return gettext('No PVE repository is enabled!');
+		}
+
+		return Proxmox.Utils.unknownText;
+	    },
+	    repoStatusIconCls: function(get) {
+		const status = get('repoStatus');
+
+		let iconCls = (cls) => `fa fa-fw ${cls}`;
+
+		if (status === 'ok') {
+		    return iconCls('fa-check good');
+		} else if (status === 'no-sub') {
+		    return iconCls('fa-exclamation-triangle critical');
+		} else if (status === 'non-production') {
+		    return iconCls('fa-exclamation-triangle warning');
+		} else if (status === 'no-repo') {
+		    return iconCls('fa-exclamation-triangle critical');
+		}
+
+		return iconCls('fa-question-circle-o');
+	    },
+	},
+    },
+
     height: 300,
     bodyPadding: '20 15 20 15',
 
@@ -113,6 +176,21 @@ Ext.define('PVE.node.StatusView', {
 	    textField: 'pveversion',
 	    value: '',
 	},
+	{
+	    itemId: 'repositoryStatus',
+	    colspan: 2,
+	    printBar: false,
+	    title: gettext('Repository Configuration Status'),
+	    // for bind
+	    setValue: function(value) {
+		let me = this;
+		me.updateValue(value);
+	    },
+	    bind: {
+		iconCls: '{repoStatusIconCls}',
+		value: '{repoStatusMessage}',
+	    },
+	},
     ],
 
     updateTitle: function() {
@@ -121,4 +199,28 @@ Ext.define('PVE.node.StatusView', {
 	me.setTitle(me.pveSelNode.data.node + ' (' + gettext('Uptime') + ': ' + uptime + ')');
     },
 
+    setRepositoryInfo: function(standardRepos) {
+	let me = this;
+	let vm = me.getViewModel();
+
+	for (const standardRepo of standardRepos) {
+	    const handle = standardRepo.handle;
+	    const status = standardRepo.status;
+
+	    if (handle === "enterprise") {
+		vm.set('enterpriseRepo', status);
+	    } else if (handle === "no-subscription") {
+		vm.set('noSubscriptionRepo', status);
+	    } else if (handle === "test") {
+		vm.set('testRepo', status);
+	    }
+	}
+    },
+
+    setSubscriptionStatus: function(status) {
+	let me = this;
+	let vm = me.getViewModel();
+
+	vm.set('subscriptionActive', status);
+    },
 });
diff --git a/www/manager6/node/Summary.js b/www/manager6/node/Summary.js
index 1c93ef04..f3709dfc 100644
--- a/www/manager6/node/Summary.js
+++ b/www/manager6/node/Summary.js
@@ -83,6 +83,38 @@ Ext.define('PVE.node.Summary', {
 	});
     },
 
+    updateRepositoryStatus: function() {
+	let me = this;
+	let nodeStatus = me.nodeStatus;
+
+	let nodename = me.pveSelNode.data.node;
+
+	Proxmox.Utils.API2Request({
+	    url: `/nodes/${nodename}/apt/repositories`,
+	    method: 'GET',
+	    failure: function(response, opts) {
+		Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+	    },
+	    success: function(response, opts) {
+		nodeStatus.setRepositoryInfo(response.result.data['standard-repos']);
+	    },
+	});
+
+	Proxmox.Utils.API2Request({
+	    url: `/nodes/${nodename}/subscription`,
+	    method: 'GET',
+	    failure: function(response, opts) {
+		Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+	    },
+	    success: function(response, opts) {
+		const res = response.result;
+		const subscription = !(res === null || res === undefined ||
+		    !res || res.data.status.toLowerCase() !== 'active');
+		nodeStatus.setSubscriptionStatus(subscription);
+	    },
+	});
+    },
+
     initComponent: function() {
         var me = this;
 
@@ -109,8 +141,16 @@ Ext.define('PVE.node.Summary', {
 	    model: 'pve-rrd-node',
 	});
 
+	let nodeStatus = Ext.create('PVE.node.StatusView', {
+	    xtype: 'pveNodeStatus',
+	    rstore: rstore,
+	    width: 770,
+	    pveSelNode: me.pveSelNode,
+	});
+
 	Ext.apply(me, {
 	    tbar: [version_btn, '->', { xtype: 'proxmoxRRDTypeSelector' }],
+	    nodeStatus: nodeStatus,
 	    items: [
 		{
 		    xtype: 'container',
@@ -123,12 +163,7 @@ Ext.define('PVE.node.Summary', {
 			columnWidth: 1,
 		    },
 		    items: [
-			{
-			    xtype: 'pveNodeStatus',
-			    rstore: rstore,
-			    width: 770,
-			    pveSelNode: me.pveSelNode,
-			},
+			nodeStatus,
 			{
 			    xtype: 'proxmoxRRDChart',
 			    title: gettext('CPU usage'),
@@ -179,6 +214,8 @@ Ext.define('PVE.node.Summary', {
 	    },
 	});
 
+	me.updateRepositoryStatus();
+
 	me.callParent();
 
 	let sp = Ext.state.Manager.getProvider();
-- 
2.30.2





^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pve-devel] applied: [PATCH manager] ui: node summary: show repository configuration status
  2021-06-23 16:11 [pve-devel] [PATCH manager] ui: node summary: show repository configuration status Fabian Ebner
@ 2021-07-05  6:52 ` Thomas Lamprecht
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2021-07-05  6:52 UTC (permalink / raw)
  To: Proxmox VE development discussion, Fabian Ebner

On 23.06.21 18:11, Fabian Ebner wrote:
> I tried to use itemid and lookupreference for the nodeStatus item, but couldn't
> get it to work, so I factored it out.
> 
> Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
> ---
> 
> Depends on the APT repositories API/UI series.
> https://lists.proxmox.com/pipermail/pve-devel/2021-June/048963.html
> 
>  www/manager6/node/StatusView.js | 102 ++++++++++++++++++++++++++++++++
>  www/manager6/node/Summary.js    |  49 +++++++++++++--
>  2 files changed, 145 insertions(+), 6 deletions(-)
> 
>

applied, with some followups for style/wording, thanks!




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-07-05  6:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-23 16:11 [pve-devel] [PATCH manager] ui: node summary: show repository configuration status Fabian Ebner
2021-07-05  6:52 ` [pve-devel] applied: " Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal