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:
parent
41e66bfaf6
commit
8be48ddfc7
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue