tape: split MediaSet into extra file

This commit is contained in:
Dietmar Maurer 2021-01-09 08:54:58 +01:00
parent 44ce25e7ac
commit c7926d8e8c
3 changed files with 80 additions and 73 deletions

View File

@ -32,6 +32,7 @@ use crate::{
tape::{
TAPE_STATUS_DIR,
OnlineStatusMap,
MediaSet,
file_formats::{
MediaLabel,
MediaSetLabel,
@ -49,79 +50,6 @@ pub struct MediaId {
pub media_set_label: Option<MediaSetLabel>,
}
/// Media Set
///
/// A List of backup media
#[derive(Debug, Serialize, Deserialize)]
pub struct MediaSet {
/// Unique media set ID
uuid: Uuid,
/// List of BackupMedia
media_list: Vec<Option<Uuid>>,
}
impl MediaSet {
pub const MEDIA_SET_MAX_SEQ_NR: u64 = 100;
pub fn new() -> Self {
let uuid = Uuid::generate();
Self {
uuid,
media_list: Vec::new(),
}
}
pub fn with_data(uuid: Uuid, media_list: Vec<Option<Uuid>>) -> Self {
Self { uuid, media_list }
}
pub fn uuid(&self) -> &Uuid {
&self.uuid
}
pub fn media_list(&self) -> &[Option<Uuid>] {
&self.media_list
}
pub fn add_media(&mut self, uuid: Uuid) {
self.media_list.push(Some(uuid));
}
pub fn insert_media(&mut self, uuid: Uuid, seq_nr: u64) -> Result<(), Error> {
if seq_nr > Self::MEDIA_SET_MAX_SEQ_NR {
bail!("media set sequence number to large in media set {} ({} > {})",
self.uuid.to_string(), seq_nr, Self::MEDIA_SET_MAX_SEQ_NR);
}
let seq_nr = seq_nr as usize;
if self.media_list.len() > seq_nr {
if self.media_list[seq_nr].is_some() {
bail!("found duplicate squence number in media set '{}/{}'",
self.uuid.to_string(), seq_nr);
}
} else {
self.media_list.resize(seq_nr + 1, None);
}
self.media_list[seq_nr] = Some(uuid);
Ok(())
}
pub fn last_media_uuid(&self) -> Option<&Uuid> {
match self.media_list.last() {
None => None,
Some(None) => None,
Some(Some(ref last_uuid)) => Some(last_uuid),
}
}
pub fn is_last_media(&self, uuid: &Uuid) -> bool {
match self.media_list.last() {
None => false,
Some(None) => false,
Some(Some(last_uuid)) => uuid == last_uuid,
}
}
}
#[derive(Serialize,Deserialize)]
struct MediaStateEntry {

76
src/tape/media_set.rs Normal file
View File

@ -0,0 +1,76 @@
use anyhow::{bail, Error};
use serde::{Serialize, Deserialize};
use proxmox::tools::Uuid;
/// MediaSet - Ordered group of media
#[derive(Debug, Serialize, Deserialize)]
pub struct MediaSet {
/// Unique media set ID
uuid: Uuid,
/// List of member media IDs
media_list: Vec<Option<Uuid>>,
}
impl MediaSet {
pub const MEDIA_SET_MAX_SEQ_NR: u64 = 100;
pub fn new() -> Self {
let uuid = Uuid::generate();
Self {
uuid,
media_list: Vec::new(),
}
}
pub fn with_data(uuid: Uuid, media_list: Vec<Option<Uuid>>) -> Self {
Self { uuid, media_list }
}
pub fn uuid(&self) -> &Uuid {
&self.uuid
}
pub fn media_list(&self) -> &[Option<Uuid>] {
&self.media_list
}
pub fn add_media(&mut self, uuid: Uuid) {
self.media_list.push(Some(uuid));
}
pub fn insert_media(&mut self, uuid: Uuid, seq_nr: u64) -> Result<(), Error> {
if seq_nr > Self::MEDIA_SET_MAX_SEQ_NR {
bail!("media set sequence number to large in media set {} ({} > {})",
self.uuid.to_string(), seq_nr, Self::MEDIA_SET_MAX_SEQ_NR);
}
let seq_nr = seq_nr as usize;
if self.media_list.len() > seq_nr {
if self.media_list[seq_nr].is_some() {
bail!("found duplicate squence number in media set '{}/{}'",
self.uuid.to_string(), seq_nr);
}
} else {
self.media_list.resize(seq_nr + 1, None);
}
self.media_list[seq_nr] = Some(uuid);
Ok(())
}
pub fn last_media_uuid(&self) -> Option<&Uuid> {
match self.media_list.last() {
None => None,
Some(None) => None,
Some(Some(ref last_uuid)) => Some(last_uuid),
}
}
pub fn is_last_media(&self, uuid: &Uuid) -> bool {
match self.media_list.last() {
None => false,
Some(None) => false,
Some(Some(last_uuid)) => uuid == last_uuid,
}
}
}

View File

@ -20,6 +20,9 @@ pub use tape_read::*;
mod helpers;
pub use helpers::*;
mod media_set;
pub use media_set::*;
mod inventory;
pub use inventory::*;