api2/tape/drive: reorganize drive api

similar to the changers, create a listing at /tape/drive and put
the specific api calls below that

move the scan api call up one level

remove the status info from the config listing

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-01-27 11:33:49 +01:00 committed by Dietmar Maurer
parent d8792b88ef
commit 5fdaecf6f4
4 changed files with 63 additions and 34 deletions

View File

@ -19,7 +19,6 @@ use crate::{
tape::{ tape::{
linux_tape_device_list, linux_tape_device_list,
check_drive_path, check_drive_path,
lookup_drive,
}, },
}; };
@ -112,37 +111,14 @@ pub fn get_config(
pub fn list_drives( pub fn list_drives(
_param: Value, _param: Value,
mut rpcenv: &mut dyn RpcEnvironment, mut rpcenv: &mut dyn RpcEnvironment,
) -> Result<Vec<DriveListEntry>, Error> { ) -> Result<Vec<LinuxTapeDrive>, Error> {
let (config, digest) = config::drive::config()?; let (config, digest) = config::drive::config()?;
let linux_drives = linux_tape_device_list();
let drive_list: Vec<LinuxTapeDrive> = config.convert_to_typed_array("linux")?; let drive_list: Vec<LinuxTapeDrive> = config.convert_to_typed_array("linux")?;
let mut list = Vec::new();
for drive in drive_list {
let mut entry = DriveListEntry {
name: drive.name,
path: drive.path.clone(),
changer: drive.changer,
changer_drivenum: drive.changer_drive_id,
vendor: None,
model: None,
serial: None,
};
if let Some(info) = lookup_drive(&linux_drives, &drive.path) {
entry.vendor = Some(info.vendor.clone());
entry.model = Some(info.model.clone());
entry.serial = Some(info.serial.clone());
}
list.push(entry);
}
rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into(); rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
Ok(list) Ok(drive_list)
} }
#[api()] #[api()]

View File

@ -31,6 +31,7 @@ use crate::{
MEDIA_LABEL_SCHEMA, MEDIA_LABEL_SCHEMA,
MEDIA_POOL_NAME_SCHEMA, MEDIA_POOL_NAME_SCHEMA,
Authid, Authid,
DriveListEntry,
LinuxTapeDrive, LinuxTapeDrive,
TapeDeviceInfo, TapeDeviceInfo,
MediaIdFlat, MediaIdFlat,
@ -48,6 +49,7 @@ use crate::{
MediaCatalog, MediaCatalog,
MediaId, MediaId,
linux_tape_device_list, linux_tape_device_list,
lookup_drive,
file_formats::{ file_formats::{
MediaLabel, MediaLabel,
MediaSetLabel, MediaSetLabel,
@ -1096,6 +1098,53 @@ pub fn catalog_media(
Ok(upid_str.into()) Ok(upid_str.into())
} }
#[api(
input: {
properties: {},
},
returns: {
description: "The list of configured drives with model information.",
type: Array,
items: {
type: DriveListEntry,
},
},
)]
/// List drives
pub fn list_drives(
_param: Value,
) -> Result<Vec<DriveListEntry>, Error> {
let (config, _) = config::drive::config()?;
let linux_drives = linux_tape_device_list();
let drive_list: Vec<LinuxTapeDrive> = config.convert_to_typed_array("linux")?;
let mut list = Vec::new();
for drive in drive_list {
let mut entry = DriveListEntry {
name: drive.name,
path: drive.path.clone(),
changer: drive.changer,
changer_drivenum: drive.changer_drive_id,
vendor: None,
model: None,
serial: None,
};
if let Some(info) = lookup_drive(&linux_drives, &drive.path) {
entry.vendor = Some(info.vendor.clone());
entry.model = Some(info.model.clone());
entry.serial = Some(info.serial.clone());
}
list.push(entry);
}
Ok(list)
}
#[sortable] #[sortable]
pub const SUBDIRS: SubdirMap = &sorted!([ pub const SUBDIRS: SubdirMap = &sorted!([
( (
@ -1159,11 +1208,6 @@ pub const SUBDIRS: SubdirMap = &sorted!([
&Router::new() &Router::new()
.put(&API_METHOD_REWIND) .put(&API_METHOD_REWIND)
), ),
(
"scan",
&Router::new()
.get(&API_METHOD_SCAN_DRIVES)
),
( (
"status", "status",
&Router::new() &Router::new()
@ -1176,6 +1220,10 @@ pub const SUBDIRS: SubdirMap = &sorted!([
), ),
]); ]);
pub const ROUTER: Router = Router::new() const ITEM_ROUTER: Router = Router::new()
.get(&list_subdirs_api_method!(SUBDIRS)) .get(&list_subdirs_api_method!(SUBDIRS))
.subdirs(SUBDIRS); .subdirs(&SUBDIRS);
pub const ROUTER: Router = Router::new()
.get(&API_METHOD_LIST_DRIVES)
.match_all("drive", &ITEM_ROUTER);

View File

@ -54,6 +54,11 @@ const SUBDIRS: SubdirMap = &[
&Router::new() &Router::new()
.get(&API_METHOD_SCAN_CHANGERS), .get(&API_METHOD_SCAN_CHANGERS),
), ),
(
"scan-drives",
&Router::new()
.get(&drive::API_METHOD_SCAN_DRIVES),
),
]; ];
pub const ROUTER: Router = Router::new() pub const ROUTER: Router = Router::new()

View File

@ -79,7 +79,7 @@ fn list_drives(
) -> Result<(), Error> { ) -> Result<(), Error> {
let output_format = get_output_format(&param); let output_format = get_output_format(&param);
let info = &api2::config::drive::API_METHOD_LIST_DRIVES; let info = &api2::tape::drive::API_METHOD_LIST_DRIVES;
let mut data = match info.handler { let mut data = match info.handler {
ApiHandler::Sync(handler) => (handler)(param, info, rpcenv)?, ApiHandler::Sync(handler) => (handler)(param, info, rpcenv)?,
_ => unreachable!(), _ => unreachable!(),