* [PATCH proxmox-backup] fix #7562: api/ui: make tape formatting in changer more consistent
@ 2026-05-08 9:32 Dominik Csapak
0 siblings, 0 replies; only message in thread
From: Dominik Csapak @ 2026-05-08 9:32 UTC (permalink / raw)
To: pbs-devel
the 'format-media' api call takes a 'label-text' which is used for two
things simultaneously:
1. load a tape from a slot into the drive (where it's barcode is the
given label-text)
2. check if the label on the tape is the one given
The web ui uses the fact nr. 1 as a feature to load + format in one
step, to reduce the necessary user actions, but this has a drawback:
if the user wants to load+format a tape this way that is either empty
or has unrelated data on it, we refuse to format it due to fact nr. 2.
To improve this, introduce a separate parameter for loading a tape with
a given barcode, and using the label-text separately for checking the on
tape label.
This can be used in the ui to handle all use cases:
* load + format a labeled tape
* load + format an empty tape
* load + format a tape with unrelated data
* check label + format without loading from a slot
* force format without any checking
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
I guess this could be seen as a breaking change, as we now require a new
parameter for loading the tape into the drive, but I currently don't see
a good way to keep this behavior while also fixing the bug properly.
(Without having a flag that uses the new behavior, that would still be
broken for the old one...)
src/api2/tape/drive.rs | 11 ++++++++---
www/tape/ChangerStatus.js | 12 ++++++++++--
www/tape/TapeInventory.js | 5 +++--
www/tape/window/Erase.js | 14 ++++++++++++--
4 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs
index 1a45ae406..c981fbb94 100644
--- a/src/api2/tape/drive.rs
+++ b/src/api2/tape/drive.rs
@@ -269,6 +269,10 @@ pub fn unload(
optional: true,
default: true,
},
+ "load-barcode": {
+ schema: MEDIA_LABEL_SCHEMA,
+ optional: true,
+ },
"label-text": {
schema: MEDIA_LABEL_SCHEMA,
optional: true,
@@ -286,6 +290,7 @@ pub fn unload(
pub fn format_media(
drive: String,
fast: Option<bool>,
+ load_barcode: Option<String>,
label_text: Option<String>,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> {
@@ -295,10 +300,10 @@ pub fn format_media(
"format-media",
Some(drive.clone()),
move |_worker, config| {
- if let Some(ref label) = label_text {
- info!("try to load media '{label}'");
+ if let Some(barcode) = load_barcode {
+ info!("try to load media '{barcode}'");
if let Some((mut changer, _)) = media_changer(&config, &drive)? {
- changer.load_media(label)?;
+ changer.load_media(&barcode)?;
}
}
diff --git a/www/tape/ChangerStatus.js b/www/tape/ChangerStatus.js
index e5d6d5d76..c979024a1 100644
--- a/www/tape/ChangerStatus.js
+++ b/www/tape/ChangerStatus.js
@@ -164,10 +164,17 @@ Ext.define('PBS.TapeManagement.ChangerStatus', {
'format-inserted': function (button, event, record) {
let me = this;
+ let params = {};
+ if (record.data['is-labeled']) {
+ params = {
+ 'label-text': record.data['label-text'],
+ };
+ }
let view = me.getView();
PBS.Utils.driveCommand(record.data.name, 'format-media', {
waitMsgTarget: view,
method: 'POST',
+ params,
success: function (response) {
Ext.create('Proxmox.window.TaskProgress', {
upid: response.result.data,
@@ -182,12 +189,13 @@ Ext.define('PBS.TapeManagement.ChangerStatus', {
format: function (v, rI, cI, button, el, record) {
let me = this;
let view = me.getView();
- let label = record.data['label-text'];
+ let barcode = record.data['label-text'];
let changer = encodeURIComponent(view.changer);
let singleDrive = me.drives.length === 1 ? me.drives[0] : undefined;
Ext.create('PBS.TapeManagement.EraseWindow', {
- label,
+ barcode,
+ isLabeled: record.data['is-labeled'],
changer,
singleDrive,
listeners: {
diff --git a/www/tape/TapeInventory.js b/www/tape/TapeInventory.js
index 85e9fdea8..1e12a78e7 100644
--- a/www/tape/TapeInventory.js
+++ b/www/tape/TapeInventory.js
@@ -44,14 +44,15 @@ Ext.define('PBS.TapeManagement.TapeInventory', {
if (!selection || selection.length < 1) {
return;
}
- let label = selection[0].data['label-text'];
+ let barcode = selection[0].data['label-text'];
let inChanger = selection[0].data.location.startsWith('online-');
let changer;
if (inChanger) {
changer = selection[0].data.location.slice('online-'.length);
}
Ext.create('PBS.TapeManagement.EraseWindow', {
- label,
+ barcode,
+ isLabeled: true,
changer,
listeners: {
destroy: function () {
diff --git a/www/tape/window/Erase.js b/www/tape/window/Erase.js
index 41df1a38f..e815f8e65 100644
--- a/www/tape/window/Erase.js
+++ b/www/tape/window/Erase.js
@@ -3,16 +3,18 @@ Ext.define('PBS.TapeManagement.EraseWindow', {
mixins: ['Proxmox.Mixin.CBind'],
changer: undefined,
- label: undefined,
+ barcode: undefined,
+ isLabeled: false,
cbindData: function (config) {
let me = this;
return {
+ label: me.isLabeled ? me.barcode : undefined,
singleDrive: me.singleDrive,
hasSingleDrive: !!me.singleDrive,
warning: Ext.String.format(
gettext("Are you sure you want to format tape '{0}' ?"),
- me.label,
+ me.barcode,
),
};
},
@@ -66,10 +68,18 @@ Ext.define('PBS.TapeManagement.EraseWindow', {
hidden: '{changer}',
},
},
+ {
+ xtype: 'hidden',
+ name: 'load-barcode',
+ cbind: {
+ value: '{barcode}',
+ },
+ },
{
xtype: 'hidden',
name: 'label-text',
cbind: {
+ submitValue: '{isLabeled}',
value: '{label}',
},
},
--
2.47.3
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-05-08 9:34 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-08 9:32 [PATCH proxmox-backup] fix #7562: api/ui: make tape formatting in changer more consistent Dominik Csapak
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.