[pbs-devel] [PATCH proxmox-backup 4/4] tape: include drive activity in status

Dominik Csapak d.csapak at proxmox.com
Mon May 13 12:49:26 CEST 2024


Since we don't query each drives status seperately, but rely on a single
call to the drives listing parameter for that, we now add the option
to query the activity there too. This makes that data avaiable for us
to show in a seperate (by default hidden) column.

Also we show the activity in the 'State' column when the drive is idle
from our perspective. This is useful when e.g. an LTO-9 tape is loaded
the first time and is calibrating, since that happens automatically.

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 pbs-api-types/src/tape/drive.rs |  3 +++
 pbs-tape/src/sg_tape.rs         |  6 ++++++
 src/api2/tape/drive.rs          | 14 ++++++++++++++
 www/Utils.js                    |  5 ++++-
 www/tape/ChangerStatus.js       | 11 +++++++++--
 5 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/pbs-api-types/src/tape/drive.rs b/pbs-api-types/src/tape/drive.rs
index caa6b3b3e..2b788bd67 100644
--- a/pbs-api-types/src/tape/drive.rs
+++ b/pbs-api-types/src/tape/drive.rs
@@ -93,6 +93,9 @@ pub struct DriveListEntry {
     /// the state of the drive if locked
     #[serde(skip_serializing_if = "Option::is_none")]
     pub state: Option<String>,
+    /// Current device activity
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub activity: Option<DeviceActivity>,
 }
 
 #[api()]
diff --git a/pbs-tape/src/sg_tape.rs b/pbs-tape/src/sg_tape.rs
index 5cda91943..f30481b31 100644
--- a/pbs-tape/src/sg_tape.rs
+++ b/pbs-tape/src/sg_tape.rs
@@ -172,6 +172,12 @@ impl SgTape {
         })
     }
 
+    /// Read device activity
+    pub fn device_activity(config: &LtoTapeDrive) -> Result<DeviceActivity, Error> {
+        let mut file = open_lto_tape_device(&config.path)?;
+        read_device_activity(&mut file)
+    }
+
     /// Access to file descriptor - useful for testing
     pub fn file_mut(&mut self) -> &mut File {
         &mut self.file
diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs
index 5a5d39d9e..7a791e09b 100644
--- a/src/api2/tape/drive.rs
+++ b/src/api2/tape/drive.rs
@@ -3,6 +3,7 @@ use std::panic::UnwindSafe;
 use std::sync::Arc;
 
 use anyhow::{bail, format_err, Error};
+use pbs_tape::sg_tape::SgTape;
 use serde_json::Value;
 
 use proxmox_router::{
@@ -1411,6 +1412,12 @@ pub fn catalog_media(
                 schema: CHANGER_NAME_SCHEMA,
                 optional: true,
             },
+            "query-activity": {
+                type: bool,
+                description: "If true, queries and returns the drive activity for each drive.",
+                optional: true,
+                default: false,
+            },
         },
     },
     returns: {
@@ -1428,6 +1435,7 @@ pub fn catalog_media(
 /// List drives
 pub fn list_drives(
     changer: Option<String>,
+    query_activity: bool,
     _param: Value,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Vec<DriveListEntry>, Error> {
@@ -1454,10 +1462,16 @@ pub fn list_drives(
 
         let info = lookup_device_identification(&lto_drives, &drive.path);
         let state = get_tape_device_state(&config, &drive.name)?;
+        let activity = if query_activity {
+            SgTape::device_activity(&drive).ok()
+        } else {
+            None
+        };
         let entry = DriveListEntry {
             config: drive,
             info,
             state,
+            activity,
         };
         list.push(entry);
     }
diff --git a/www/Utils.js b/www/Utils.js
index df03a4c87..4853be36c 100644
--- a/www/Utils.js
+++ b/www/Utils.js
@@ -721,8 +721,11 @@ Ext.define('PBS.Utils', {
 	return PBS.Utils.tapeDriveActivities[value] ?? value;
     },
 
-    renderDriveState: function(value, md) {
+    renderDriveState: function(value, md, rec) {
 	if (!value) {
+	    if (rec?.data?.activity && rec?.data?.activity !== 'no-activity') {
+		return PBS.Utils.renderDriveActivity(rec.data.activity);
+	    }
 	    return gettext('Idle');
 	}
 
diff --git a/www/tape/ChangerStatus.js b/www/tape/ChangerStatus.js
index fdafc459e..e18af90e4 100644
--- a/www/tape/ChangerStatus.js
+++ b/www/tape/ChangerStatus.js
@@ -1,6 +1,6 @@
 Ext.define('pbs-slot-model', {
     extend: 'Ext.data.Model',
-    fields: ['entry-id', 'label-text', 'is-labeled', ' model', 'name', 'vendor', 'serial', 'state', 'status', 'pool',
+    fields: ['entry-id', 'label-text', 'is-labeled', ' model', 'name', 'vendor', 'serial', 'state', 'status', 'pool', 'activity',
 	{
 	    name: 'is-blocked',
 	    calculate: function(data) {
@@ -488,7 +488,7 @@ Ext.define('PBS.TapeManagement.ChangerStatus', {
 		});
 		let drives_fut = Proxmox.Async.api2({
 		    timeout: 5*60*1000,
-		    url: `/api2/extjs/tape/drive?changer=${encodeURIComponent(changer)}`,
+		    url: `/api2/extjs/tape/drive?query-activity=true&changer=${encodeURIComponent(changer)}`,
 		});
 
 		let tapes_fut = Proxmox.Async.api2({
@@ -852,6 +852,13 @@ Ext.define('PBS.TapeManagement.ChangerStatus', {
 				    flex: 1,
 				    renderer: Ext.htmlEncode,
 				},
+				{
+				    text: gettext('Activity'),
+				    dataIndex: 'activity',
+				    renderer: PBS.Utils.renderDriveActivity,
+				    hidden: true,
+				    flex: 1,
+				},
 				{
 				    text: gettext('State'),
 				    dataIndex: 'state',
-- 
2.39.2





More information about the pbs-devel mailing list