From 8be48ddfc76e0e32af5ff94e4fb6596e78444af3 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Thu, 18 Feb 2021 15:40:27 +0100 Subject: [PATCH] api2/tape/changer: add drive state to changer status output if we can find the drive in the config and it has a state Signed-off-by: Dominik Csapak --- src/api2/tape/changer.rs | 22 ++++++++++++++++++++++ src/api2/types/tape/changer.rs | 3 +++ 2 files changed, 25 insertions(+) diff --git a/src/api2/tape/changer.rs b/src/api2/tape/changer.rs index dc98d85b..212ca8eb 100644 --- a/src/api2/tape/changer.rs +++ b/src/api2/tape/changer.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::path::Path; use anyhow::Error; @@ -11,6 +12,7 @@ use crate::{ api2::types::{ CHANGER_NAME_SCHEMA, ChangerListEntry, + LinuxTapeDrive, MtxEntryKind, MtxStatusEntry, ScsiTapeChanger, @@ -25,6 +27,7 @@ use crate::{ ScsiMediaChange, mtx_status_to_online_set, }, + drive::get_tape_device_state, lookup_device_identification, }, }; @@ -66,9 +69,26 @@ pub async fn get_status(name: String) -> Result, Error> { inventory.update_online_status(&map)?; + let drive_list: Vec = config.convert_to_typed_array("linux")?; + let mut drive_map: HashMap = HashMap::new(); + + for drive in drive_list { + if let Some(changer) = drive.changer { + if changer != name { + continue; + } + let num = drive.changer_drivenum.unwrap_or(0); + drive_map.insert(num, drive.name.clone()); + } + } + let mut list = Vec::new(); for (id, drive_status) in status.drives.iter().enumerate() { + let mut state = None; + if let Some(drive) = drive_map.get(&(id as u64)) { + state = get_tape_device_state(&config, &drive)?; + } let entry = MtxStatusEntry { entry_kind: MtxEntryKind::Drive, entry_id: id as u64, @@ -78,6 +98,7 @@ pub async fn get_status(name: String) -> Result, Error> { ElementStatus::VolumeTag(tag) => Some(tag.to_string()), }, loaded_slot: drive_status.loaded_slot, + state, }; list.push(entry); } @@ -96,6 +117,7 @@ pub async fn get_status(name: String) -> Result, Error> { ElementStatus::VolumeTag(tag) => Some(tag.to_string()), }, loaded_slot: None, + state: None, }; list.push(entry); } diff --git a/src/api2/types/tape/changer.rs b/src/api2/types/tape/changer.rs index f9d30acd..780bf669 100644 --- a/src/api2/types/tape/changer.rs +++ b/src/api2/types/tape/changer.rs @@ -129,4 +129,7 @@ pub struct MtxStatusEntry { /// The slot the drive was loaded from #[serde(skip_serializing_if="Option::is_none")] pub loaded_slot: Option, + /// The current state of the drive + #[serde(skip_serializing_if="Option::is_none")] + pub state: Option, }