public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
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





  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
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal