From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup v2 14/15] tape/changer: refactor marking of import/export slots from config
Date: Thu, 28 Jan 2021 12:59:54 +0100 [thread overview]
Message-ID: <20210128115955.23136-15-d.csapak@proxmox.com> (raw)
In-Reply-To: <20210128115955.23136-1-d.csapak@proxmox.com>
we did this for 'mtx', but missed it for the sg_pt_changer code
refactor it into the MtxStatus strut, and call it from both
code paths
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
src/tape/changer/mod.rs | 32 ++++++++++++++++++++--
src/tape/changer/mtx/mtx_wrapper.rs | 41 ++++-------------------------
src/tape/changer/sg_pt_changer.rs | 16 +++++++++++
3 files changed, 51 insertions(+), 38 deletions(-)
diff --git a/src/tape/changer/mod.rs b/src/tape/changer/mod.rs
index 0d378587..f9f9da98 100644
--- a/src/tape/changer/mod.rs
+++ b/src/tape/changer/mod.rs
@@ -10,10 +10,16 @@ pub mod mtx;
mod online_status_map;
pub use online_status_map::*;
+use std::collections::HashSet;
+
use anyhow::{bail, Error};
use serde::{Serialize, Deserialize};
+use serde_json::Value;
+
+use proxmox::api::schema::parse_property_string;
use crate::api2::types::{
+ SLOT_ARRAY_SCHEMA,
ScsiTapeChanger,
LinuxTapeDrive,
};
@@ -124,6 +130,29 @@ impl MtxStatus {
}
free_slot
}
+
+ pub fn mark_import_export_slots(&mut self, config: &ScsiTapeChanger) -> Result<(), Error>{
+ let mut export_slots: HashSet<u64> = HashSet::new();
+
+ if let Some(slots) = &config.export_slots {
+ let slots: Value = parse_property_string(&slots, &SLOT_ARRAY_SCHEMA)?;
+ export_slots = slots
+ .as_array()
+ .unwrap()
+ .iter()
+ .filter_map(|v| v.as_u64())
+ .collect();
+ }
+
+ for (i, entry) in self.slots.iter_mut().enumerate() {
+ let slot = i as u64 + 1;
+ if export_slots.contains(&slot) {
+ entry.import_export = true; // mark as IMPORT/EXPORT
+ }
+ }
+
+ Ok(())
+ }
}
/// Interface to SCSI changer devices
@@ -373,8 +402,7 @@ impl ScsiMediaChange for ScsiTapeChanger {
if USE_MTX {
mtx::mtx_status(&self)
} else {
- let mut file = sg_pt_changer::open(&self.path)?;
- sg_pt_changer::read_element_status(&mut file)
+ sg_pt_changer::status(&self)
}
}
diff --git a/src/tape/changer/mtx/mtx_wrapper.rs b/src/tape/changer/mtx/mtx_wrapper.rs
index 116382f1..44d03251 100644
--- a/src/tape/changer/mtx/mtx_wrapper.rs
+++ b/src/tape/changer/mtx/mtx_wrapper.rs
@@ -1,45 +1,19 @@
-use std::collections::HashSet;
-
use anyhow::Error;
use serde_json::Value;
-use proxmox::{
- api::schema::parse_property_string,
-};
-
use crate::{
tools::run_command,
- api2::types::{
- SLOT_ARRAY_SCHEMA,
- ScsiTapeChanger,
- },
- tape::{
- changer::{
- MtxStatus,
- mtx::{
- parse_mtx_status,
- },
- },
+ api2::types::ScsiTapeChanger,
+ tape::changer::{
+ MtxStatus,
+ mtx::parse_mtx_status,
},
};
/// Run 'mtx status' and return parsed result.
pub fn mtx_status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
-
let path = &config.path;
- let mut export_slots: HashSet<u64> = HashSet::new();
-
- if let Some(slots) = &config.export_slots {
- let slots: Value = parse_property_string(&slots, &SLOT_ARRAY_SCHEMA)?;
- export_slots = slots
- .as_array()
- .unwrap()
- .iter()
- .filter_map(|v| v.as_u64())
- .collect();
- }
-
let mut command = std::process::Command::new("mtx");
command.args(&["-f", path, "status"]);
@@ -47,12 +21,7 @@ pub fn mtx_status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
let mut status = parse_mtx_status(&output)?;
- for (i, entry) in status.slots.iter_mut().enumerate() {
- let slot = i as u64 + 1;
- if export_slots.contains(&slot) {
- entry.import_export = true; // mark as IMPORT/EXPORT
- }
- }
+ status.mark_import_export_slots(&config)?;
Ok(status)
}
diff --git a/src/tape/changer/sg_pt_changer.rs b/src/tape/changer/sg_pt_changer.rs
index b6c64381..b2be9548 100644
--- a/src/tape/changer/sg_pt_changer.rs
+++ b/src/tape/changer/sg_pt_changer.rs
@@ -31,6 +31,7 @@ use crate::{
scsi_ascii_to_string,
scsi_inquiry,
},
+ api2::types::ScsiTapeChanger,
};
const SCSI_CHANGER_DEFAULT_TIMEOUT: usize = 60*5; // 5 minutes
@@ -397,6 +398,21 @@ pub fn read_element_status<F: AsRawFd>(file: &mut F) -> Result<MtxStatus, Error>
Ok(status)
}
+/// Read status and map import-export slots from config
+pub fn status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
+ let path = &config.path;
+
+ let mut file = open(path)
+ .map_err(|err| format_err!("error opening '{}': {}", path, err))?;
+ let mut status = read_element_status(&mut file)
+ .map_err(|err| format_err!("error reading element status: {}", err))?;
+
+ status.mark_import_export_slots(&config)?;
+
+ Ok(status)
+}
+
+
#[repr(C, packed)]
#[derive(Endian)]
struct ElementStatusHeader {
--
2.20.1
next prev parent reply other threads:[~2021-01-28 12:00 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-28 11:59 [pbs-devel] [PATCH proxmox-backup v2 00/15] implement first version of tape gui Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 01/15] api2/tape/changer: add changer filter to list_drives api call Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 02/15] api2/tape/drive: add load_media as " Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 03/15] api2/tape/drive: change methods of some api calls from put to get Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 04/15] api2/config/{drive, changer}: prevent adding same device multiple times Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 05/15] ui: tape: add form fields Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 06/15] ui: tape: add Edit Windows Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 07/15] ui: tape: add BackupOverview Panel Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 08/15] ui: tape: add ChangerStatus panel Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 09/15] ui: tape: add DriveConfig panel Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 10/15] ui: tape: add PoolConfig Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 11/15] ui: tape: move TapeManagement.js to tape dir Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 12/15] ui: tape: use panels in tape interface Dominik Csapak
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 13/15] tape/changer: add vendor/model to DriveStatus Dominik Csapak
2021-01-28 11:59 ` Dominik Csapak [this message]
2021-01-28 11:59 ` [pbs-devel] [PATCH proxmox-backup v2 15/15] tape: change changer-drive-id to changer-drivenum Dominik Csapak
2021-01-28 14:13 ` [pbs-devel] [PATCH proxmox-backup v2 00/15] implement first version of tape gui 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=20210128115955.23136-15-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