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 <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-02-18 15:40:27 +01:00 committed by Dietmar Maurer
parent 41e66bfaf6
commit 8be48ddfc7
2 changed files with 25 additions and 0 deletions

View File

@ -1,3 +1,4 @@
use std::collections::HashMap;
use std::path::Path; use std::path::Path;
use anyhow::Error; use anyhow::Error;
@ -11,6 +12,7 @@ use crate::{
api2::types::{ api2::types::{
CHANGER_NAME_SCHEMA, CHANGER_NAME_SCHEMA,
ChangerListEntry, ChangerListEntry,
LinuxTapeDrive,
MtxEntryKind, MtxEntryKind,
MtxStatusEntry, MtxStatusEntry,
ScsiTapeChanger, ScsiTapeChanger,
@ -25,6 +27,7 @@ use crate::{
ScsiMediaChange, ScsiMediaChange,
mtx_status_to_online_set, mtx_status_to_online_set,
}, },
drive::get_tape_device_state,
lookup_device_identification, lookup_device_identification,
}, },
}; };
@ -66,9 +69,26 @@ pub async fn get_status(name: String) -> Result<Vec<MtxStatusEntry>, Error> {
inventory.update_online_status(&map)?; inventory.update_online_status(&map)?;
let drive_list: Vec<LinuxTapeDrive> = config.convert_to_typed_array("linux")?;
let mut drive_map: HashMap<u64, String> = 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(); let mut list = Vec::new();
for (id, drive_status) in status.drives.iter().enumerate() { 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 { let entry = MtxStatusEntry {
entry_kind: MtxEntryKind::Drive, entry_kind: MtxEntryKind::Drive,
entry_id: id as u64, entry_id: id as u64,
@ -78,6 +98,7 @@ pub async fn get_status(name: String) -> Result<Vec<MtxStatusEntry>, Error> {
ElementStatus::VolumeTag(tag) => Some(tag.to_string()), ElementStatus::VolumeTag(tag) => Some(tag.to_string()),
}, },
loaded_slot: drive_status.loaded_slot, loaded_slot: drive_status.loaded_slot,
state,
}; };
list.push(entry); list.push(entry);
} }
@ -96,6 +117,7 @@ pub async fn get_status(name: String) -> Result<Vec<MtxStatusEntry>, Error> {
ElementStatus::VolumeTag(tag) => Some(tag.to_string()), ElementStatus::VolumeTag(tag) => Some(tag.to_string()),
}, },
loaded_slot: None, loaded_slot: None,
state: None,
}; };
list.push(entry); list.push(entry);
} }

View File

@ -129,4 +129,7 @@ pub struct MtxStatusEntry {
/// The slot the drive was loaded from /// The slot the drive was loaded from
#[serde(skip_serializing_if="Option::is_none")] #[serde(skip_serializing_if="Option::is_none")]
pub loaded_slot: Option<u64>, pub loaded_slot: Option<u64>,
/// The current state of the drive
#[serde(skip_serializing_if="Option::is_none")]
pub state: Option<String>,
} }