tape: split api type definitions for changers into extra file

This commit is contained in:
Dietmar Maurer 2020-12-13 09:31:02 +01:00
parent 7e1d4712b8
commit 065df12872
3 changed files with 87 additions and 72 deletions

View File

@ -0,0 +1,80 @@
//! Types for tape changer API
use serde::{Deserialize, Serialize};
use proxmox::api::{
api,
schema::{Schema, StringSchema},
};
use crate::api2::types::PROXMOX_SAFE_ID_FORMAT;
pub const CHANGER_NAME_SCHEMA: Schema = StringSchema::new("Tape Changer Identifier.")
.format(&PROXMOX_SAFE_ID_FORMAT)
.min_length(3)
.max_length(32)
.schema();
pub const SCSI_CHANGER_PATH_SCHEMA: Schema = StringSchema::new(
"Path to Linux generic SCSI device (i.e. '/dev/sg4')")
.schema();
pub const MEDIA_LABEL_SCHEMA: Schema = StringSchema::new("Media Label/Barcode.")
.format(&PROXMOX_SAFE_ID_FORMAT)
.min_length(3)
.max_length(32)
.schema();
#[api(
properties: {
name: {
schema: CHANGER_NAME_SCHEMA,
},
path: {
schema: SCSI_CHANGER_PATH_SCHEMA,
},
}
)]
#[derive(Serialize,Deserialize)]
/// SCSI tape changer
pub struct ScsiTapeChanger {
pub name: String,
pub path: String,
}
#[api()]
#[derive(Serialize,Deserialize)]
#[serde(rename_all = "lowercase")]
/// Mtx Entry Kind
pub enum MtxEntryKind {
/// Drive
Drive,
/// Slot
Slot,
}
#[api(
properties: {
"entry-kind": {
type: MtxEntryKind,
},
"changer-id": {
schema: MEDIA_LABEL_SCHEMA,
optional: true,
},
},
)]
#[derive(Serialize,Deserialize)]
#[serde(rename_all = "kebab-case")]
/// Mtx Status Entry
pub struct MtxStatusEntry {
pub entry_kind: MtxEntryKind,
/// The ID of the slot or drive
pub entry_id: u64,
/// The media label (volume tag) if the slot/drive is full
#[serde(skip_serializing_if="Option::is_none")]
pub changer_id: Option<String>,
/// The slot the drive was loaded from
#[serde(skip_serializing_if="Option::is_none")]
pub loaded_slot: Option<u64>,
}

View File

@ -7,7 +7,10 @@ use proxmox::api::{
schema::{Schema, IntegerSchema, StringSchema}, schema::{Schema, IntegerSchema, StringSchema},
}; };
use crate::api2::types::PROXMOX_SAFE_ID_FORMAT; use crate::api2::types::{
PROXMOX_SAFE_ID_FORMAT,
CHANGER_NAME_SCHEMA,
};
pub const DRIVE_NAME_SCHEMA: Schema = StringSchema::new("Drive Identifier.") pub const DRIVE_NAME_SCHEMA: Schema = StringSchema::new("Drive Identifier.")
.format(&PROXMOX_SAFE_ID_FORMAT) .format(&PROXMOX_SAFE_ID_FORMAT)
@ -15,26 +18,10 @@ pub const DRIVE_NAME_SCHEMA: Schema = StringSchema::new("Drive Identifier.")
.max_length(32) .max_length(32)
.schema(); .schema();
pub const CHANGER_NAME_SCHEMA: Schema = StringSchema::new("Tape Changer Identifier.")
.format(&PROXMOX_SAFE_ID_FORMAT)
.min_length(3)
.max_length(32)
.schema();
pub const LINUX_DRIVE_PATH_SCHEMA: Schema = StringSchema::new( pub const LINUX_DRIVE_PATH_SCHEMA: Schema = StringSchema::new(
"The path to a LINUX non-rewinding SCSI tape device (i.e. '/dev/nst0')") "The path to a LINUX non-rewinding SCSI tape device (i.e. '/dev/nst0')")
.schema(); .schema();
pub const SCSI_CHANGER_PATH_SCHEMA: Schema = StringSchema::new(
"Path to Linux generic SCSI device (i.e. '/dev/sg4')")
.schema();
pub const MEDIA_LABEL_SCHEMA: Schema = StringSchema::new("Media Label/Barcode.")
.format(&PROXMOX_SAFE_ID_FORMAT)
.min_length(3)
.max_length(32)
.schema();
pub const CHANGER_DRIVE_ID_SCHEMA: Schema = IntegerSchema::new( pub const CHANGER_DRIVE_ID_SCHEMA: Schema = IntegerSchema::new(
"Associated changer drive number (requires option changer)") "Associated changer drive number (requires option changer)")
.minimum(0) .minimum(0)
@ -91,24 +78,6 @@ pub struct LinuxTapeDrive {
pub changer_drive_id: Option<u64>, pub changer_drive_id: Option<u64>,
} }
#[api(
properties: {
name: {
schema: CHANGER_NAME_SCHEMA,
},
path: {
schema: SCSI_CHANGER_PATH_SCHEMA,
},
}
)]
#[derive(Serialize,Deserialize)]
/// SCSI tape changer
pub struct ScsiTapeChanger {
pub name: String,
pub path: String,
}
#[api()] #[api()]
#[derive(Serialize,Deserialize)] #[derive(Serialize,Deserialize)]
/// Drive list entry /// Drive list entry
@ -130,40 +99,3 @@ pub struct DriveListEntry {
#[serde(skip_serializing_if="Option::is_none")] #[serde(skip_serializing_if="Option::is_none")]
pub serial: Option<String>, pub serial: Option<String>,
} }
#[api()]
#[derive(Serialize,Deserialize)]
#[serde(rename_all = "lowercase")]
/// Mtx Entry Kind
pub enum MtxEntryKind {
/// Drive
Drive,
/// Slot
Slot,
}
#[api(
properties: {
"entry-kind": {
type: MtxEntryKind,
},
"changer-id": {
schema: MEDIA_LABEL_SCHEMA,
optional: true,
},
},
)]
#[derive(Serialize,Deserialize)]
#[serde(rename_all = "kebab-case")]
/// Mtx Status Entry
pub struct MtxStatusEntry {
pub entry_kind: MtxEntryKind,
/// The ID of the slot or drive
pub entry_id: u64,
/// The media label (volume tag) if the slot/drive is full
#[serde(skip_serializing_if="Option::is_none")]
pub changer_id: Option<String>,
/// The slot the drive was loaded from
#[serde(skip_serializing_if="Option::is_none")]
pub loaded_slot: Option<u64>,
}

View File

@ -3,6 +3,9 @@
mod device; mod device;
pub use device::*; pub use device::*;
mod changer;
pub use changer::*;
mod drive; mod drive;
pub use drive::*; pub use drive::*;