public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve
@ 2021-04-19 11:02 Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status Dominik Csapak
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

depends on a bumped widget-toolkit after the patches from
https://lists.proxmox.com/pipermail/pve-devel/2021-April/047694.html
are applied

Dominik Csapak (6):
  api2/types: add necessary types for node status
  api2/nodes/status: use NodeStatus struct
  api2/node/status: extend node status
  ui: factor out NodeInfoPanel
  ui: panel/NodeInfo: make it like in pve
  ui: window/Settings: add summarycolumns settings

 src/api2/node/status.rs  | 112 ++++++++++++------------
 src/api2/types/mod.rs    |  98 ++++++++++++++++++++-
 www/Dashboard.js         | 139 ++++--------------------------
 www/Makefile             |   1 +
 www/ServerStatus.js      |  13 +++
 www/datastore/Summary.js |  11 +++
 www/panel/NodeInfo.js    | 180 +++++++++++++++++++++++++++++++++++++++
 www/window/Settings.js   |  26 ++++++
 8 files changed, 398 insertions(+), 182 deletions(-)
 create mode 100644 www/panel/NodeInfo.js

-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct Dominik Csapak
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

we want to use concrete types instead of value

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/api2/types/mod.rs | 49 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs
index 19186ea2..ac4957ac 100644
--- a/src/api2/types/mod.rs
+++ b/src/api2/types/mod.rs
@@ -751,9 +751,8 @@ impl Default for GarbageCollectionStatus {
     }
 }
 
-
 #[api()]
-#[derive(Serialize, Deserialize)]
+#[derive(Default, Serialize, Deserialize)]
 /// Storage space usage information.
 pub struct StorageStatus {
     /// Total space (bytes).
@@ -1504,3 +1503,49 @@ pub struct JobScheduleStatus {
     #[serde(skip_serializing_if="Option::is_none")]
     pub last_run_endtime: Option<i64>,
 }
+
+#[api]
+#[derive(Serialize, Deserialize, Default)]
+#[serde(rename_all = "kebab-case")]
+/// Node memory usage counters
+pub struct NodeMemoryCounters {
+    /// Total memory
+    pub total: u64,
+    /// Used memory
+    pub used: u64,
+    /// Free memory
+    pub free: u64,
+}
+
+#[api]
+#[derive(Serialize,Deserialize,Default)]
+#[serde(rename_all = "kebab-case")]
+/// Contains general node information such as the fingerprint`
+pub struct NodeInformation {
+    /// The SSL Fingerprint
+    pub fingerprint: String,
+}
+
+#[api(
+    properties: {
+        memory: {
+            type: NodeMemoryCounters,
+        },
+        root: {
+            type: StorageStatus,
+        },
+        info: {
+            type: NodeInformation,
+        }
+    },
+)]
+#[derive(Serialize, Deserialize, Default)]
+#[serde(rename_all = "kebab-case")]
+/// The Node status
+pub struct NodeStatus {
+    pub memory: NodeMemoryCounters,
+    pub root: StorageStatus,
+    /// Total CPU usage since last query.
+    pub cpu: f64,
+    pub info: NodeInformation,
+}
-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 3/6] api2/node/status: extend node status Dominik Csapak
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/api2/node/status.rs | 77 +++++++++--------------------------------
 1 file changed, 17 insertions(+), 60 deletions(-)

diff --git a/src/api2/node/status.rs b/src/api2/node/status.rs
index 14d4b587..d5df05ff 100644
--- a/src/api2/node/status.rs
+++ b/src/api2/node/status.rs
@@ -2,7 +2,7 @@ use std::process::Command;
 use std::path::Path;
 
 use anyhow::{Error, format_err, bail};
-use serde_json::{json, Value};
+use serde_json::Value;
 
 use proxmox::sys::linux::procfs;
 
@@ -21,43 +21,7 @@ use crate::tools::cert::CertInfo;
         },
     },
     returns: {
-        type: Object,
-        description: "Returns node memory, CPU and (root) disk usage",
-        properties: {
-            memory: {
-                type: Object,
-                description: "node memory usage counters",
-                properties: {
-                    total: {
-                        description: "total memory",
-                        type: Integer,
-                    },
-                    used: {
-                        description: "total memory",
-                        type: Integer,
-                    },
-                    free: {
-                        description: "free memory",
-                        type: Integer,
-                    },
-                },
-            },
-            cpu: {
-                type: Number,
-                description: "Total CPU usage since last query.",
-                optional: true,
-            },
-            info: {
-                type: Object,
-                description: "contains node information",
-                properties: {
-                    fingerprint: {
-                        description: "The SSL Fingerprint",
-                        type: String,
-                    },
-                },
-            },
-        },
+        type: NodeStatus,
     },
     access: {
         permission: &Permission::Privilege(&["system", "status"], PRIV_SYS_AUDIT, false),
@@ -68,32 +32,25 @@ fn get_status(
     _param: Value,
     _info: &ApiMethod,
     _rpcenv: &mut dyn RpcEnvironment,
-) -> Result<Value, Error> {
-
+) -> Result<NodeStatus, Error> {
     let meminfo: procfs::ProcFsMemInfo = procfs::read_meminfo()?;
-    let kstat: procfs::ProcFsStat = procfs::read_proc_stat()?;
-    let disk_usage = crate::tools::disks::disk_usage(Path::new("/"))?;
+    let memory = NodeMemoryCounters {
+        total: meminfo.memtotal,
+        used: meminfo.memused,
+        free: meminfo.memfree,
+    };
 
-    // get fingerprint
-    let cert = CertInfo::new()?;
-    let fp = cert.fingerprint()?;
+    let kstat: procfs::ProcFsStat = procfs::read_proc_stat()?;
+    let cpu = kstat.cpu;
 
-    Ok(json!({
-        "memory": {
-            "total": meminfo.memtotal,
-            "used": meminfo.memused,
-            "free": meminfo.memfree,
-        },
-        "cpu": kstat.cpu,
-        "root": {
-            "total": disk_usage.total,
-            "used": disk_usage.used,
-            "free": disk_usage.avail,
-        },
-        "info": {
-            "fingerprint": fp,
+    Ok(NodeStatus {
+        memory,
+        root: crate::tools::disks::disk_usage(Path::new("/"))?,
+        cpu,
+        info: NodeInformation {
+            fingerprint: CertInfo::new()?.fingerprint()?,
         },
-    }))
+    })
 }
 
 #[api(
-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 3/6] api2/node/status: extend node status
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 4/6] ui: factor out NodeInfoPanel Dominik Csapak
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

to be more on par with pve

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/api2/node/status.rs | 37 +++++++++++++++++++++++++++++++
 src/api2/types/mod.rs   | 49 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)

diff --git a/src/api2/node/status.rs b/src/api2/node/status.rs
index d5df05ff..a82c0c8a 100644
--- a/src/api2/node/status.rs
+++ b/src/api2/node/status.rs
@@ -12,6 +12,16 @@ use crate::api2::types::*;
 use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_POWER_MANAGEMENT};
 use crate::tools::cert::CertInfo;
 
+impl std::convert::From<procfs::ProcFsCPUInfo> for NodeCpuInformation {
+    fn from(info: procfs::ProcFsCPUInfo) -> Self {
+        Self {
+            model: info.model,
+            sockets: info.sockets,
+            cpus: info.cpus,
+        }
+    }
+}
+
 #[api(
     input: {
         properties: {
@@ -40,13 +50,40 @@ fn get_status(
         free: meminfo.memfree,
     };
 
+    let swap = NodeSwapCounters {
+        total: meminfo.swaptotal,
+        used: meminfo.swapused,
+        free: meminfo.swapfree,
+    };
+
     let kstat: procfs::ProcFsStat = procfs::read_proc_stat()?;
     let cpu = kstat.cpu;
+    let wait = kstat.iowait_percent;
+
+    let loadavg = procfs::Loadavg::read()?;
+    let loadavg = [loadavg.one(), loadavg.five(), loadavg.fifteen()];
+
+    let cpuinfo = procfs::read_cpuinfo()?;
+    let cpuinfo = cpuinfo.into();
+
+    let uname = nix::sys::utsname::uname();
+    let kversion = format!(
+        "{} {} {}",
+        uname.sysname(),
+        uname.release(),
+        uname.version()
+    );
 
     Ok(NodeStatus {
         memory,
+        swap,
         root: crate::tools::disks::disk_usage(Path::new("/"))?,
+        uptime: procfs::read_proc_uptime()?.0 as u64,
+        loadavg,
+        kversion,
+        cpuinfo,
         cpu,
+        wait,
         info: NodeInformation {
             fingerprint: CertInfo::new()?.fingerprint()?,
         },
diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs
index ac4957ac..aa161fee 100644
--- a/src/api2/types/mod.rs
+++ b/src/api2/types/mod.rs
@@ -1517,6 +1517,19 @@ pub struct NodeMemoryCounters {
     pub free: u64,
 }
 
+#[api]
+#[derive(Serialize, Deserialize, Default)]
+#[serde(rename_all = "kebab-case")]
+/// Node swap usage counters
+pub struct NodeSwapCounters {
+    /// Total swap
+    pub total: u64,
+    /// Used swap
+    pub used: u64,
+    /// Free swap
+    pub free: u64,
+}
+
 #[api]
 #[derive(Serialize,Deserialize,Default)]
 #[serde(rename_all = "kebab-case")]
@@ -1526,6 +1539,19 @@ pub struct NodeInformation {
     pub fingerprint: String,
 }
 
+#[api]
+#[derive(Serialize, Deserialize, Default)]
+#[serde(rename_all = "kebab-case")]
+/// Information about the CPU
+pub struct NodeCpuInformation {
+    /// The CPU model
+    pub model: String,
+    /// The number of CPU sockets
+    pub sockets: usize,
+    /// The number of CPU cores (incl. threads)
+    pub cpus: usize,
+}
+
 #[api(
     properties: {
         memory: {
@@ -1534,6 +1560,19 @@ pub struct NodeInformation {
         root: {
             type: StorageStatus,
         },
+        swap: {
+            type: NodeSwapCounters,
+        },
+        loadavg: {
+            type: Array,
+            items: {
+                type: Number,
+                description: "the load",
+            }
+        },
+        cpuinfo: {
+            type: NodeCpuInformation,
+        },
         info: {
             type: NodeInformation,
         }
@@ -1545,7 +1584,17 @@ pub struct NodeInformation {
 pub struct NodeStatus {
     pub memory: NodeMemoryCounters,
     pub root: StorageStatus,
+    pub swap: NodeSwapCounters,
+    /// The current uptime of the server.
+    pub uptime: u64,
+    /// Load for 1, 5 and 15 minutes.
+    pub loadavg: [f64; 3],
+    /// The current kernel version.
+    pub kversion: String,
     /// Total CPU usage since last query.
     pub cpu: f64,
+    /// Total IO wait since last query.
+    pub wait: f64,
+    pub cpuinfo: NodeCpuInformation,
     pub info: NodeInformation,
 }
-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 4/6] ui: factor out NodeInfoPanel
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
                   ` (2 preceding siblings ...)
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 3/6] api2/node/status: extend node status Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 5/6] ui: panel/NodeInfo: make it like in pve Dominik Csapak
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

so that Dashboard.js will be less cluttered when we add more information
there.

No functional change, but reworked the fingerprint button disabling to
use a property of the view instead of a viewmodel

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/Dashboard.js      | 123 ++--------------------------------
 www/Makefile          |   1 +
 www/panel/NodeInfo.js | 151 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 156 insertions(+), 119 deletions(-)
 create mode 100644 www/panel/NodeInfo.js

diff --git a/www/Dashboard.js b/www/Dashboard.js
index 52107a8e..88f3cd5d 100644
--- a/www/Dashboard.js
+++ b/www/Dashboard.js
@@ -69,72 +69,6 @@ Ext.define('PBS.Dashboard', {
 	    me.lookup('subscription').setSubStatus(subStatus);
 	},
 
-	updateUsageStats: function(store, records, success) {
-	    if (!success) {
-		return;
-	    }
-	    if (records === undefined || records.length < 1) {
-		return;
-	    }
-	    let me = this;
-	    let viewmodel = me.getViewModel();
-
-	    let res = records[0].data;
-	    viewmodel.set('fingerprint', res.info.fingerprint || Proxmox.Utils.unknownText);
-
-	    let cpu = res.cpu,
-	        mem = res.memory,
-	        root = res.root;
-
-	    var cpuPanel = me.lookup('cpu');
-	    cpuPanel.updateValue(cpu);
-
-	    var memPanel = me.lookup('mem');
-	    memPanel.updateValue(mem.used / mem.total);
-
-	    var hdPanel = me.lookup('root');
-	    hdPanel.updateValue(root.used / root.total);
-	},
-
-	showFingerPrint: function() {
-	    let me = this;
-	    let vm = me.getViewModel();
-	    let fingerprint = vm.get('fingerprint');
-	    Ext.create('Ext.window.Window', {
-		modal: true,
-		width: 600,
-		title: gettext('Fingerprint'),
-		layout: 'form',
-		bodyPadding: '10 0',
-		items: [
-		    {
-			xtype: 'textfield',
-			inputId: 'fingerprintField',
-			value: fingerprint,
-			editable: false,
-		    },
-		],
-		buttons: [
-		    {
-			xtype: 'button',
-			iconCls: 'fa fa-clipboard',
-			handler: function(b) {
-			    var el = document.getElementById('fingerprintField');
-			    el.select();
-			    document.execCommand("copy");
-			},
-			text: gettext('Copy'),
-		    },
-		    {
-			text: gettext('Ok'),
-			handler: function() {
-			    this.up('window').close();
-			},
-		    },
-		],
-	    }).show();
-	},
-
 	updateTasks: function(store, records, success) {
 	    if (!success) return;
 	    let me = this;
@@ -182,31 +116,14 @@ Ext.define('PBS.Dashboard', {
 
     viewModel: {
 	data: {
-	    fingerprint: "",
 	    days: 30,
 	},
 
 	formulas: {
-	    disableFPButton: (get) => get('fingerprint') === "",
 	    sinceEpoch: (get) => (Date.now()/1000 - get('days') * 24*3600).toFixed(0),
 	},
 
 	stores: {
-	    usage: {
-		storeid: 'dash-usage',
-		type: 'update',
-		interval: 3000,
-		autoStart: true,
-		autoLoad: true,
-		autoDestroy: true,
-		proxy: {
-		    type: 'proxmox',
-		    url: '/api2/json/nodes/localhost/status',
-		},
-		listeners: {
-		    load: 'updateUsageStats',
-		},
-	    },
 	    subscription: {
 		storeid: 'dash-subscription',
 		type: 'update',
@@ -271,43 +188,11 @@ Ext.define('PBS.Dashboard', {
 
     items: [
 	{
-	    height: 250,
-	    iconCls: 'fa fa-tasks',
-	    title: gettext('Server Resources'),
-	    bodyPadding: '0 20 0 20',
-	    tools: [
-		{
-		    xtype: 'button',
-		    text: gettext('Show Fingerprint'),
-		    handler: 'showFingerPrint',
-		    bind: {
-			disabled: '{disableFPButton}',
-		    },
-		},
-	    ],
-	    layout: {
-		type: 'hbox',
-		align: 'center',
-	    },
-	    defaults: {
-		xtype: 'proxmoxGauge',
-		spriteFontSize: '20px',
-		flex: 1,
+	    xtype: 'pbsNodeInfoPanel',
+	    bind: {
+		store: '{stores.usage}',
 	    },
-	    items: [
-		{
-		    title: gettext('CPU'),
-		    reference: 'cpu',
-		},
-		{
-		    title: gettext('Memory'),
-		    reference: 'mem',
-		},
-		{
-		    title: gettext('Root Disk'),
-		    reference: 'root',
-		},
-	    ],
+	    height: 250,
 	},
 	{
 	    xtype: 'pbsDatastoresStatistics',
diff --git a/www/Makefile b/www/Makefile
index 2b847e74..e01b8ddf 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -81,6 +81,7 @@ JSSRC=							\
 	panel/AccessControl.js				\
 	panel/StorageAndDisks.js			\
 	panel/UsageChart.js				\
+	panel/NodeInfo.js				\
 	ZFSList.js					\
 	DirectoryList.js				\
 	LoginView.js					\
diff --git a/www/panel/NodeInfo.js b/www/panel/NodeInfo.js
new file mode 100644
index 00000000..ca9ebb21
--- /dev/null
+++ b/www/panel/NodeInfo.js
@@ -0,0 +1,151 @@
+Ext.define('PBS.NodeInfoPanel', {
+    extend: 'Ext.panel.Panel',
+    alias: 'widget.pbsNodeInfoPanel',
+
+    iconCls: 'fa fa-tasks',
+    title: gettext('Server Resources'),
+
+    controller: {
+	xclass: 'Ext.app.ViewController',
+
+	showFingerPrint: function() {
+	    let me = this;
+	    let view = me.getView();
+	    let fingerprint = view.fingerprint;
+	    Ext.create('Ext.window.Window', {
+		modal: true,
+		width: 600,
+		title: gettext('Fingerprint'),
+		layout: 'form',
+		bodyPadding: '10 0',
+		items: [
+		    {
+			xtype: 'textfield',
+			inputId: 'fingerprintField',
+			value: fingerprint,
+			editable: false,
+		    },
+		],
+		buttons: [
+		    {
+			xtype: 'button',
+			iconCls: 'fa fa-clipboard',
+			handler: function(b) {
+			    var el = document.getElementById('fingerprintField');
+			    el.select();
+			    document.execCommand("copy");
+			},
+			text: gettext('Copy'),
+		    },
+		    {
+			text: gettext('Ok'),
+			handler: function() {
+			    this.up('window').close();
+			},
+		    },
+		],
+	    }).show();
+	},
+
+	updateUsageStats: function(store, records, success) {
+	    if (!success) {
+		return;
+	    }
+	    if (records === undefined || records.length < 1) {
+		return;
+	    }
+	    let me = this;
+	    let view = me.getView();
+
+	    let res = records[0].data;
+	    view.fingerprint = res.info.fingerprint;
+
+	    me.lookup('fpButton').setDisabled(!view.fingerprint);
+
+	    let cpu = res.cpu,
+		mem = res.memory,
+		root = res.root;
+
+	    var cpuPanel = me.lookup('cpu');
+	    cpuPanel.updateValue(cpu);
+
+	    var memPanel = me.lookup('mem');
+	    memPanel.updateValue(mem.used / mem.total);
+
+	    var hdPanel = me.lookup('root');
+	    hdPanel.updateValue(root.used / root.total);
+	},
+
+	init: function(view) {
+	    let me = this;
+
+	    view.store = Ext.create('Proxmox.data.UpdateStore', {
+		interval: 3000,
+		proxy: {
+		    type: 'proxmox',
+		    url: '/api2/json/nodes/localhost/status',
+		},
+	    });
+
+	    me.mon(view.store, 'load', me.updateUsageStats, me);
+
+	    view.store.startUpdate();
+	},
+
+	startStore: function() {
+	    let me = this;
+	    let view = me.getView();
+	    view.store.startUpdate();
+	},
+
+	stopStore: function() {
+	    let me = this;
+	    let view = me.getView();
+	    view.store.stopUpdate();
+	},
+    },
+
+    listeners: {
+	activate: 'startStore',
+	deactivate: 'stopStore',
+	destroy: 'stopStore',
+    },
+
+    bodyPadding: '0 20 0 20',
+
+    tools: [
+	{
+	    xtype: 'button',
+	    reference: 'fpButton',
+	    text: gettext('Show Fingerprint'),
+	    handler: 'showFingerPrint',
+	    disabled: true,
+	},
+    ],
+
+    layout: {
+	type: 'hbox',
+	align: 'center',
+    },
+
+    defaults: {
+	xtype: 'proxmoxGauge',
+	spriteFontSize: '20px',
+	flex: 1,
+    },
+
+    items: [
+	{
+	    title: gettext('CPU'),
+	    reference: 'cpu',
+	},
+	{
+	    title: gettext('Memory'),
+	    reference: 'mem',
+	},
+	{
+	    title: gettext('Root Disk'),
+	    reference: 'root',
+	},
+    ],
+});
-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 5/6] ui: panel/NodeInfo: make it like in pve
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
                   ` (3 preceding siblings ...)
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 4/6] ui: factor out NodeInfoPanel Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 6/6] ui: window/Settings: add summarycolumns settings Dominik Csapak
  2021-04-23  9:39 ` [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Thomas Lamprecht
  6 siblings, 0 replies; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

this changes the node info panel to a similar layout as in pve,
with the ksm sharing and version field removed

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/Dashboard.js      |   7 +-
 www/panel/NodeInfo.js | 199 ++++++++++++++++++++++++------------------
 2 files changed, 116 insertions(+), 90 deletions(-)

diff --git a/www/Dashboard.js b/www/Dashboard.js
index 88f3cd5d..c4d2dfa9 100644
--- a/www/Dashboard.js
+++ b/www/Dashboard.js
@@ -189,14 +189,11 @@ Ext.define('PBS.Dashboard', {
     items: [
 	{
 	    xtype: 'pbsNodeInfoPanel',
-	    bind: {
-		store: '{stores.usage}',
-	    },
-	    height: 250,
+	    height: 280,
 	},
 	{
 	    xtype: 'pbsDatastoresStatistics',
-	    height: 250,
+	    height: 280,
 	},
 	{
 	    xtype: 'pbsLongestTasks',
diff --git a/www/panel/NodeInfo.js b/www/panel/NodeInfo.js
index ca9ebb21..17bf3812 100644
--- a/www/panel/NodeInfo.js
+++ b/www/panel/NodeInfo.js
@@ -1,9 +1,24 @@
 Ext.define('PBS.NodeInfoPanel', {
-    extend: 'Ext.panel.Panel',
+    extend: 'Proxmox.panel.StatusView',
     alias: 'widget.pbsNodeInfoPanel',
 
-    iconCls: 'fa fa-tasks',
-    title: gettext('Server Resources'),
+    height: 300,
+    bodyPadding: '20 15 20 15',
+
+    layout: {
+	type: 'table',
+	columns: 2,
+	tableAttrs: {
+	    style: {
+		width: '100%',
+	    },
+	},
+    },
+
+    defaults: {
+	xtype: 'pmxInfoWidget',
+	padding: '0 15 5 15',
+    },
 
     controller: {
 	xclass: 'Ext.app.ViewController',
@@ -46,73 +61,8 @@ Ext.define('PBS.NodeInfoPanel', {
 		],
 	    }).show();
 	},
-
-	updateUsageStats: function(store, records, success) {
-	    if (!success) {
-		return;
-	    }
-	    if (records === undefined || records.length < 1) {
-		return;
-	    }
-	    let me = this;
-	    let view = me.getView();
-
-	    let res = records[0].data;
-	    view.fingerprint = res.info.fingerprint;
-
-	    me.lookup('fpButton').setDisabled(!view.fingerprint);
-
-	    let cpu = res.cpu,
-		mem = res.memory,
-		root = res.root;
-
-	    var cpuPanel = me.lookup('cpu');
-	    cpuPanel.updateValue(cpu);
-
-	    var memPanel = me.lookup('mem');
-	    memPanel.updateValue(mem.used / mem.total);
-
-	    var hdPanel = me.lookup('root');
-	    hdPanel.updateValue(root.used / root.total);
-	},
-
-	init: function(view) {
-	    let me = this;
-
-	    view.store = Ext.create('Proxmox.data.UpdateStore', {
-		interval: 3000,
-		proxy: {
-		    type: 'proxmox',
-		    url: '/api2/json/nodes/localhost/status',
-		},
-	    });
-
-	    me.mon(view.store, 'load', me.updateUsageStats, me);
-
-	    view.store.startUpdate();
-	},
-
-	startStore: function() {
-	    let me = this;
-	    let view = me.getView();
-	    view.store.startUpdate();
-	},
-
-	stopStore: function() {
-	    let me = this;
-	    let view = me.getView();
-	    view.store.stopUpdate();
-	},
-    },
-
-    listeners: {
-	activate: 'startStore',
-	deactivate: 'stopStore',
-	destroy: 'stopStore',
     },
 
-    bodyPadding: '0 20 0 20',
-
     tools: [
 	{
 	    xtype: 'button',
@@ -123,29 +73,108 @@ Ext.define('PBS.NodeInfoPanel', {
 	},
     ],
 
-    layout: {
-	type: 'hbox',
-	align: 'center',
-    },
-
-    defaults: {
-	xtype: 'proxmoxGauge',
-	spriteFontSize: '20px',
-	flex: 1,
-    },
-
     items: [
 	{
-	    title: gettext('CPU'),
-	    reference: 'cpu',
+	    itemId: 'cpu',
+	    iconCls: 'fa fa-fw pmx-itype-icon-processor pmx-icon',
+	    title: gettext('CPU usage'),
+	    valueField: 'cpu',
+	    maxField: 'cpuinfo',
+	    renderer: Proxmox.Utils.render_node_cpu_usage,
+	},
+	{
+	    itemId: 'wait',
+	    iconCls: 'fa fa-fw fa-clock-o',
+	    title: gettext('IO delay'),
+	    valueField: 'wait',
+	},
+	{
+	    xtype: 'box',
+	    colspan: 2,
+	    padding: '0 0 20 0',
+	},
+	{
+	    iconCls: 'fa fa-fw pmx-itype-icon-memory pmx-icon',
+	    itemId: 'memory',
+	    title: gettext('RAM usage'),
+	    valueField: 'memory',
+	    maxField: 'memory',
+	    renderer: Proxmox.Utils.render_node_size_usage,
+	},
+	{
+	    itemId: 'load',
+	    iconCls: 'fa fa-fw fa-tasks',
+	    title: gettext('Load average'),
+	    printBar: false,
+	    textField: 'loadavg',
 	},
 	{
-	    title: gettext('Memory'),
-	    reference: 'mem',
+	    iconCls: 'fa fa-fw fa-hdd-o',
+	    itemId: 'rootfs',
+	    title: gettext('HD space') + '(root)',
+	    valueField: 'root',
+	    maxField: 'root',
+	    renderer: Proxmox.Utils.render_node_size_usage,
 	},
 	{
-	    title: gettext('Root Disk'),
-	    reference: 'root',
+	    iconCls: 'fa fa-fw fa-refresh',
+	    itemId: 'swap',
+	    printSize: true,
+	    title: gettext('SWAP usage'),
+	    valueField: 'swap',
+	    maxField: 'swap',
+	    renderer: Proxmox.Utils.render_node_size_usage,
+	},
+	{
+	    xtype: 'box',
+	    colspan: 2,
+	    padding: '0 0 20 0',
+	},
+	{
+	    itemId: 'cpus',
+	    colspan: 2,
+	    printBar: false,
+	    title: gettext('CPU(s)'),
+	    textField: 'cpuinfo',
+	    renderer: Proxmox.Utils.render_cpu_model,
+	    value: '',
+	},
+	{
+	    itemId: 'kversion',
+	    colspan: 2,
+	    title: gettext('Kernel Version'),
+	    printBar: false,
+	    textField: 'kversion',
+	    value: '',
 	},
     ],
+
+    updateTitle: function() {
+	var me = this;
+	var uptime = Proxmox.Utils.render_uptime(me.getRecordValue('uptime'));
+	me.setTitle(Proxmox.NodeName + ' (' + gettext('Uptime') + ': ' + uptime + ')');
+    },
+
+    initComponent: function() {
+	let me = this;
+
+	me.rstore = Ext.create('Proxmox.data.ObjectStore', {
+	    interval: 3000,
+	    url: '/api2/json/nodes/localhost/status',
+	    autoStart: true,
+	});
+
+	me.callParent();
+
+	me.mon(me.rstore, 'load', function(store, records, success) {
+	    if (!success) {
+		return;
+	    }
+
+	    let info = me.getRecordValue('info');
+	    me.fingerprint = info.fingerprint;
+	    me.lookup('fpButton').setDisabled(!me.fingerprint);
+	});
+	me.on('destroy', function() { me.rstore.stopUpdate(); });
+    },
 });
-- 
2.20.1





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

* [pbs-devel] [PATCH proxmox-backup 6/6] ui: window/Settings: add summarycolumns settings
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
                   ` (4 preceding siblings ...)
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 5/6] ui: panel/NodeInfo: make it like in pve Dominik Csapak
@ 2021-04-19 11:02 ` Dominik Csapak
  2021-04-23  9:39 ` [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Thomas Lamprecht
  6 siblings, 0 replies; 11+ messages in thread
From: Dominik Csapak @ 2021-04-19 11:02 UTC (permalink / raw)
  To: pbs-devel

like in pve

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/Dashboard.js         | 15 +++++++++++++++
 www/ServerStatus.js      | 13 +++++++++++++
 www/datastore/Summary.js | 11 +++++++++++
 www/window/Settings.js   | 26 ++++++++++++++++++++++++++
 4 files changed, 65 insertions(+)

diff --git a/www/Dashboard.js b/www/Dashboard.js
index c4d2dfa9..18f174fe 100644
--- a/www/Dashboard.js
+++ b/www/Dashboard.js
@@ -111,6 +111,13 @@ Ext.define('PBS.Dashboard', {
 	    var sp = Ext.state.Manager.getProvider();
 	    var days = sp.get('dashboard-days') || 30;
 	    me.setDays(days, false);
+
+	    view.mon(sp, 'statechange', function(provider, key, value) {
+		if (key !== 'summarycolumns') {
+		    return;
+		}
+		Proxmox.Utils.updateColumns(view);
+	    });
 	},
     },
 
@@ -162,6 +169,12 @@ Ext.define('PBS.Dashboard', {
 	},
     },
 
+    listeners: {
+	resize: function(panel) {
+	    Proxmox.Utils.updateColumns(panel);
+	},
+    },
+
     title: gettext('Dashboard'),
 
     layout: {
@@ -170,6 +183,8 @@ Ext.define('PBS.Dashboard', {
 
     bodyPadding: '20 0 0 20',
 
+    minWidth: 700,
+
     defaults: {
 	columnWidth: 0.49,
 	xtype: 'panel',
diff --git a/www/ServerStatus.js b/www/ServerStatus.js
index 8cb9f221..d74253d5 100644
--- a/www/ServerStatus.js
+++ b/www/ServerStatus.js
@@ -186,6 +186,11 @@ Ext.define('PBS.ServerStatus', {
 	    itemId: 'itemcontainer',
 	    layout: 'column',
 	    minWidth: 700,
+	    listeners: {
+		resize: function(panel) {
+		    Proxmox.Utils.updateColumns(panel);
+		},
+	    },
 	    defaults: {
 		minHeight: 320,
 		padding: 5,
@@ -267,6 +272,14 @@ Ext.define('PBS.ServerStatus', {
 	};
 
 	me.callParent();
+
+	let sp = Ext.state.Manager.getProvider();
+	me.mon(sp, 'statechange', function(provider, key, value) {
+	    if (key !== 'summarycolumns') {
+		return;
+	    }
+	    Proxmox.Utils.updateColumns(me.getComponent('itemcontainer'));
+	});
     },
 
 });
diff --git a/www/datastore/Summary.js b/www/datastore/Summary.js
index 25a7b6e5..80f82409 100644
--- a/www/datastore/Summary.js
+++ b/www/datastore/Summary.js
@@ -244,6 +244,9 @@ Ext.define('PBS.DataStoreSummary', {
 	activate: function() { this.rrdstore.startUpdate(); },
 	deactivate: function() { this.rrdstore.stopUpdate(); },
 	destroy: function() { this.rrdstore.stopUpdate(); },
+	resize: function(panel) {
+	    Proxmox.Utils.updateColumns(panel);
+	},
     },
 
     initComponent: function() {
@@ -256,6 +259,14 @@ Ext.define('PBS.DataStoreSummary', {
 
 	me.callParent();
 
+	let sp = Ext.state.Manager.getProvider();
+	me.mon(sp, 'statechange', function(provider, key, value) {
+	    if (key !== 'summarycolumns') {
+		return;
+	    }
+	    Proxmox.Utils.updateColumns(me);
+	});
+
 	Proxmox.Utils.API2Request({
 	    url: `/config/datastore/${me.datastore}`,
 	    waitMsgTarget: me.down('pbsDataStoreInfo'),
diff --git a/www/window/Settings.js b/www/window/Settings.js
index ee8464be..763cefab 100644
--- a/www/window/Settings.js
+++ b/www/window/Settings.js
@@ -30,6 +30,9 @@ Ext.define('PBS.window.Settings', {
 	    let username = sp.get('login-username') || Proxmox.Utils.noneText;
 	    me.lookupReference('savedUserName').setValue(Ext.String.htmlEncode(username));
 
+	    let summarycolumns = sp.get('summarycolumns', 'auto');
+	    me.lookup('summarycolumns').setValue(summarycolumns);
+
 	    let settings = ['fontSize', 'fontFamily', 'letterSpacing', 'lineHeight'];
 	    settings.forEach(function(setting) {
 		let val = localStorage.getItem('pve-xterm-' + setting);
@@ -114,6 +117,12 @@ Ext.define('PBS.window.Settings', {
 		    sp.clear('login-username');
 		},
 	    },
+	    'field[reference=summarycolumns]': {
+		change: function(el, newValue) {
+		    var sp = Ext.state.Manager.getProvider();
+		    sp.set('summarycolumns', newValue);
+		},
+	    },
 	},
     },
 
@@ -174,6 +183,23 @@ Ext.define('PBS.window.Settings', {
 		    },
 		],
 	    },
+	    {
+		xtype: 'box',
+		autoEl: { tag: 'hr' },
+	    },
+	    {
+		xtype: 'proxmoxKVComboBox',
+		fieldLabel: gettext('Summary/Dashboard columns') + ':',
+		labelWidth: 150,
+		stateId: 'summarycolumns',
+		reference: 'summarycolumns',
+		comboItems: [
+		    ['auto', 'auto'],
+		    ['1', '1'],
+		    ['2', '2'],
+		    ['3', '3'],
+		],
+	    },
 	],
     },
     {
-- 
2.20.1





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

* [pbs-devel] applied: [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status Dominik Csapak
@ 2021-04-23  9:36   ` Thomas Lamprecht
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Lamprecht @ 2021-04-23  9:36 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

On 19.04.21 13:02, Dominik Csapak wrote:
> we want to use concrete types instead of value
> 
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>  src/api2/types/mod.rs | 49 +++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 47 insertions(+), 2 deletions(-)
> 
>

applied, thanks!




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

* [pbs-devel] applied: [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct Dominik Csapak
@ 2021-04-23  9:36   ` Thomas Lamprecht
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Lamprecht @ 2021-04-23  9:36 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

On 19.04.21 13:02, Dominik Csapak wrote:
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>  src/api2/node/status.rs | 77 +++++++++--------------------------------
>  1 file changed, 17 insertions(+), 60 deletions(-)
> 
>

applied, thanks!




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

* [pbs-devel] applied: [PATCH proxmox-backup 3/6] api2/node/status: extend node status
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 3/6] api2/node/status: extend node status Dominik Csapak
@ 2021-04-23  9:36   ` Thomas Lamprecht
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Lamprecht @ 2021-04-23  9:36 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

On 19.04.21 13:02, Dominik Csapak wrote:
> to be more on par with pve
> 
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>  src/api2/node/status.rs | 37 +++++++++++++++++++++++++++++++
>  src/api2/types/mod.rs   | 49 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 86 insertions(+)
> 
>

applied, thanks!




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

* Re: [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve
  2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
                   ` (5 preceding siblings ...)
  2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 6/6] ui: window/Settings: add summarycolumns settings Dominik Csapak
@ 2021-04-23  9:39 ` Thomas Lamprecht
  6 siblings, 0 replies; 11+ messages in thread
From: Thomas Lamprecht @ 2021-04-23  9:39 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

On 19.04.21 13:02, Dominik Csapak wrote:
>   ui: factor out NodeInfoPanel
>   ui: panel/NodeInfo: make it like in pve
>   ui: window/Settings: add summarycolumns settings

waiting a bit for above ones, as IMO the current state of where graphs/status is
placed is slightly weird, or at least a bit inconsistent.

I'd rather like to think that true in calm than rushing a quite visible UI change
now, only to change/move it later again - the PBS beta time when this was no issue
is sadly over :-)




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

end of thread, other threads:[~2021-04-23  9:39 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-19 11:02 [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Dominik Csapak
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 1/6] api2/types: add necessary types for node status Dominik Csapak
2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 2/6] api2/nodes/status: use NodeStatus struct Dominik Csapak
2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 3/6] api2/node/status: extend node status Dominik Csapak
2021-04-23  9:36   ` [pbs-devel] applied: " Thomas Lamprecht
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 4/6] ui: factor out NodeInfoPanel Dominik Csapak
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 5/6] ui: panel/NodeInfo: make it like in pve Dominik Csapak
2021-04-19 11:02 ` [pbs-devel] [PATCH proxmox-backup 6/6] ui: window/Settings: add summarycolumns settings Dominik Csapak
2021-04-23  9:39 ` [pbs-devel] [PATCH proxmox-backup 0/6] make node info panel similar to pve Thomas Lamprecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal