182 lines
5.5 KiB
Rust
182 lines
5.5 KiB
Rust
|
// Tape inventory tests
|
||
|
//
|
||
|
// # cargo test --release --test tape-inventory
|
||
|
|
||
|
use std::path::PathBuf;
|
||
|
use anyhow::{bail, Error};
|
||
|
|
||
|
use proxmox::tools::{
|
||
|
Uuid,
|
||
|
};
|
||
|
|
||
|
use proxmox_backup::{
|
||
|
tape::{
|
||
|
Inventory,
|
||
|
file_formats::{
|
||
|
MediaSetLabel,
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
|
||
|
fn create_testdir(name: &str) -> Result<PathBuf, Error> {
|
||
|
let mut testdir: PathBuf = String::from("./target/testout").into();
|
||
|
testdir.push(std::module_path!());
|
||
|
testdir.push(name);
|
||
|
|
||
|
let _ = std::fs::remove_dir_all(&testdir);
|
||
|
let _ = std::fs::create_dir_all(&testdir);
|
||
|
|
||
|
Ok(testdir)
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn test_list_pool_media() -> Result<(), Error> {
|
||
|
|
||
|
let testdir = create_testdir("test_list_pool_media")?;
|
||
|
let mut inventory = Inventory::load(&testdir)?;
|
||
|
|
||
|
let ctime = 0;
|
||
|
|
||
|
let _tape1_uuid = inventory.generate_free_tape("tape1", ctime);
|
||
|
let tape2_uuid = inventory.generate_assigned_tape("tape2", "p1", ctime);
|
||
|
|
||
|
let set1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None);
|
||
|
|
||
|
let tape3_uuid = inventory.generate_used_tape("tape3", set1.clone(), ctime);
|
||
|
|
||
|
let list = inventory.list_pool_media("nonexistent_pool");
|
||
|
assert_eq!(list.len(), 0);
|
||
|
|
||
|
let list = inventory.list_pool_media("p1");
|
||
|
assert_eq!(list.len(), 2);
|
||
|
|
||
|
let tape2 = list.iter().find(|media_id| &media_id.label.uuid == &tape2_uuid).unwrap();
|
||
|
assert!(tape2.media_set_label.is_none());
|
||
|
|
||
|
let tape3 = list.iter().find(|media_id| &media_id.label.uuid == &tape3_uuid).unwrap();
|
||
|
match tape3.media_set_label {
|
||
|
None => bail!("missing media set label"),
|
||
|
Some(ref set) => {
|
||
|
assert_eq!(set.seq_nr, 0);
|
||
|
assert_eq!(set.uuid, set1.uuid);
|
||
|
}
|
||
|
}
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn test_media_set_simple() -> Result<(), Error> {
|
||
|
|
||
|
let testdir = create_testdir("test_media_set_simple")?;
|
||
|
let mut inventory = Inventory::load(&testdir)?;
|
||
|
|
||
|
let ctime = 0;
|
||
|
|
||
|
let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 10, None);
|
||
|
let sl2 = MediaSetLabel::with_data("p1", sl1.uuid.clone(), 1, ctime+ 20, None);
|
||
|
let sl3 = MediaSetLabel::with_data("p1", sl1.uuid.clone(), 2, ctime + 30, None);
|
||
|
|
||
|
|
||
|
let tape1_uuid = inventory.generate_used_tape("tape1", sl1.clone(), 0);
|
||
|
let tape2_uuid = inventory.generate_used_tape("tape2", sl2.clone(), 0);
|
||
|
let tape3_uuid = inventory.generate_used_tape("tape3", sl3.clone(), 0);
|
||
|
|
||
|
// generate incomplete media set in pool p2
|
||
|
let sl4 = MediaSetLabel::with_data("p2", Uuid::generate(), 1, ctime + 40, None);
|
||
|
let tape4_uuid = inventory.generate_used_tape("tape4", sl4.clone(), 0);
|
||
|
|
||
|
let media_list = inventory.list_pool_media("p1");
|
||
|
assert_eq!(media_list.len(), 3);
|
||
|
|
||
|
let media_list = inventory.list_pool_media("p2");
|
||
|
assert_eq!(media_list.len(), 1);
|
||
|
|
||
|
// reload, the do more tests
|
||
|
|
||
|
let inventory = Inventory::load(&testdir)?;
|
||
|
|
||
|
// test pool p1
|
||
|
|
||
|
let media_set = inventory.compute_media_set_members(&sl1.uuid)?;
|
||
|
assert_eq!(media_set.uuid(), &sl1.uuid);
|
||
|
|
||
|
let media_list = media_set.media_list();
|
||
|
assert_eq!(media_list.len(), 3);
|
||
|
|
||
|
assert_eq!(media_list[0], Some(tape1_uuid.clone()));
|
||
|
assert_eq!(media_list[1], Some(tape2_uuid.clone()));
|
||
|
assert_eq!(media_list[2], Some(tape3_uuid.clone()));
|
||
|
|
||
|
// test media set start time
|
||
|
assert_eq!(inventory.media_set_start_time(&sl1.uuid), Some(ctime + 10));
|
||
|
|
||
|
|
||
|
// test pool p2
|
||
|
let media_set = inventory.compute_media_set_members(&sl4.uuid)?;
|
||
|
assert_eq!(media_set.uuid(), &sl4.uuid);
|
||
|
|
||
|
let media_list = media_set.media_list();
|
||
|
assert_eq!(media_list.len(), 2);
|
||
|
|
||
|
assert_eq!(media_list[0], None);
|
||
|
assert_eq!(media_list[1], Some(tape4_uuid.clone()));
|
||
|
|
||
|
// start time for incomplete set must be None
|
||
|
assert_eq!(inventory.media_set_start_time(&sl4.uuid), None);
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
|
||
|
#[test]
|
||
|
fn test_latest_media_set() -> Result<(), Error> {
|
||
|
|
||
|
let testdir = create_testdir("test_latest_media_set")?;
|
||
|
|
||
|
let insert_tape = |inventory: &mut Inventory, pool, label, seq_nr, ctime| -> Uuid {
|
||
|
let sl = MediaSetLabel::with_data(pool, Uuid::generate(), seq_nr, ctime, None);
|
||
|
let uuid = sl.uuid.clone();
|
||
|
inventory.generate_used_tape(label, sl, 0);
|
||
|
uuid
|
||
|
};
|
||
|
|
||
|
let check_latest = |inventory: &Inventory, pool: &str, label: &str| {
|
||
|
let latest_set = inventory.latest_media_set(pool).unwrap();
|
||
|
let set = inventory.compute_media_set_members(&latest_set).unwrap();
|
||
|
let media_list = set.media_list();
|
||
|
assert_eq!(media_list.iter().filter(|s| s.is_some()).count(), 1);
|
||
|
let media_uuid = media_list.iter().find(|s| s.is_some()).unwrap().clone().unwrap();
|
||
|
let media = inventory.lookup_media(&media_uuid).unwrap();
|
||
|
assert_eq!(media.label.label_text, label);
|
||
|
};
|
||
|
|
||
|
let mut inventory = Inventory::load(&testdir)?;
|
||
|
|
||
|
let ctime = 0;
|
||
|
|
||
|
// test 3 sets with different start times
|
||
|
|
||
|
insert_tape(&mut inventory, "p1", "p1tape1", 0, ctime + 10);
|
||
|
insert_tape(&mut inventory, "p1", "p1tape2", 0, ctime + 20);
|
||
|
insert_tape(&mut inventory, "p1", "p1tape3", 0, ctime + 30);
|
||
|
|
||
|
check_latest(&inventory, "p1", "p1tape3");
|
||
|
|
||
|
// test 2 sets with same start times, should fail
|
||
|
|
||
|
insert_tape(&mut inventory, "p2", "p2tape1", 0, ctime + 10);
|
||
|
insert_tape(&mut inventory, "p2", "p2tape2", 0, ctime + 10);
|
||
|
|
||
|
assert_eq!(inventory.latest_media_set("p2"), None);
|
||
|
|
||
|
// test with incomplete sets
|
||
|
|
||
|
insert_tape(&mut inventory, "p3", "p3tape1", 5, ctime + 50);
|
||
|
insert_tape(&mut inventory, "p3", "p3tape2", 1, ctime + 10);
|
||
|
insert_tape(&mut inventory, "p3", "p3tape3", 0, ctime + 20);
|
||
|
|
||
|
check_latest(&inventory, "p3", "p3tape1");
|
||
|
|
||
|
Ok(())
|
||
|
}
|