From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 4/4] tape: include drive activity in status
Date: Mon, 13 May 2024 12:49:26 +0200 [thread overview]
Message-ID: <20240513104926.3113394-5-d.csapak@proxmox.com> (raw)
In-Reply-To: <20240513104926.3113394-1-d.csapak@proxmox.com>
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@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(<o_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
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2024-05-13 10:49 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-13 10:49 [pbs-devel] [PATCH proxmox-backup 0/4] tape: improve UX by showing device activity Dominik Csapak
2024-05-13 10:49 ` [pbs-devel] [PATCH proxmox-backup 1/4] tape: add functions to parse drive " Dominik Csapak
2024-05-13 10:49 ` [pbs-devel] [PATCH proxmox-backup 2/4] tape: add drive activity to drive status api Dominik Csapak
2024-05-13 10:49 ` [pbs-devel] [PATCH proxmox-backup 3/4] tape: drive status: make some depend on the activity Dominik Csapak
2024-05-13 10:49 ` Dominik Csapak [this message]
2024-05-14 8:32 ` [pbs-devel] applied: [PATCH proxmox-backup 0/4] tape: improve UX by showing device activity Dietmar Maurer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240513104926.3113394-5-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox