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 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<Vec<MtxStatusEntry>, Error> {
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();
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<Vec<MtxStatusEntry>, 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<Vec<MtxStatusEntry>, Error> {
ElementStatus::VolumeTag(tag) => Some(tag.to_string()),
},
loaded_slot: None,
state: None,
};
list.push(entry);
}

View File

@ -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<u64>,
/// The current state of the drive
#[serde(skip_serializing_if="Option::is_none")]
pub state: Option<String>,
}