1 // Tape inventory tests
3 // # cargo test --release tape::test::inventory
5 use std
::path
::PathBuf
;
6 use anyhow
::{bail, Error}
;
8 use proxmox_uuid
::Uuid
;
10 use pbs_api_types
::{MediaLocation, MediaStatus}
;
21 fn create_testdir(name
: &str) -> Result
<PathBuf
, Error
> {
22 let mut testdir
: PathBuf
= String
::from("./target/testout").into();
23 testdir
.push(std
::module_path
!());
26 let _
= std
::fs
::remove_dir_all(&testdir
);
27 let _
= std
::fs
::create_dir_all(&testdir
);
33 fn test_media_state_db() -> Result
<(), Error
> {
35 let testdir
= create_testdir("test_media_state_db")?
;
37 let mut inventory
= Inventory
::load(&testdir
)?
;
39 let uuid1
: Uuid
= inventory
.generate_free_tape("tape1", 0);
41 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Unknown
, MediaLocation
::Offline
));
43 inventory
.set_media_status_full(&uuid1
)?
;
45 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Full
, MediaLocation
::Offline
));
47 inventory
.set_media_location_vault(&uuid1
, "Office2")?
;
48 assert_eq
!(inventory
.status_and_location(&uuid1
),
49 (MediaStatus
::Full
, MediaLocation
::Vault(String
::from("Office2"))));
51 inventory
.set_media_location_offline(&uuid1
)?
;
52 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Full
, MediaLocation
::Offline
));
54 inventory
.set_media_status_damaged(&uuid1
)?
;
55 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Damaged
, MediaLocation
::Offline
));
57 inventory
.clear_media_status(&uuid1
)?
;
58 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Unknown
, MediaLocation
::Offline
));
64 fn test_list_pool_media() -> Result
<(), Error
> {
66 let testdir
= create_testdir("test_list_pool_media")?
;
67 let mut inventory
= Inventory
::load(&testdir
)?
;
71 let _tape1_uuid
= inventory
.generate_free_tape("tape1", ctime
);
72 let tape2_uuid
= inventory
.generate_assigned_tape("tape2", "p1", ctime
);
74 let set1
= MediaSetLabel
::with_data("p1", Uuid
::generate(), 0, ctime
, None
);
76 let tape3_uuid
= inventory
.generate_used_tape("tape3", set1
.clone(), ctime
);
78 let list
= inventory
.list_pool_media("nonexistent_pool");
79 assert_eq
!(list
.len(), 0);
81 let list
= inventory
.list_pool_media("p1");
82 assert_eq
!(list
.len(), 2);
84 let tape2
= list
.iter().find(|media_id
| &media_id
.label
.uuid
== &tape2_uuid
).unwrap();
85 assert
!(tape2
.media_set_label
.is_none());
87 let tape3
= list
.iter().find(|media_id
| &media_id
.label
.uuid
== &tape3_uuid
).unwrap();
88 match tape3
.media_set_label
{
89 None
=> bail
!("missing media set label"),
91 assert_eq
!(set
.seq_nr
, 0);
92 assert_eq
!(set
.uuid
, set1
.uuid
);
99 fn test_media_set_simple() -> Result
<(), Error
> {
101 let testdir
= create_testdir("test_media_set_simple")?
;
102 let mut inventory
= Inventory
::load(&testdir
)?
;
106 let sl1
= MediaSetLabel
::with_data("p1", Uuid
::generate(), 0, ctime
+ 10, None
);
107 let sl2
= MediaSetLabel
::with_data("p1", sl1
.uuid
.clone(), 1, ctime
+ 20, None
);
108 let sl3
= MediaSetLabel
::with_data("p1", sl1
.uuid
.clone(), 2, ctime
+ 30, None
);
111 let tape1_uuid
= inventory
.generate_used_tape("tape1", sl1
.clone(), 0);
112 let tape2_uuid
= inventory
.generate_used_tape("tape2", sl2
.clone(), 0);
113 let tape3_uuid
= inventory
.generate_used_tape("tape3", sl3
.clone(), 0);
115 // generate incomplete media set in pool p2
116 let sl4
= MediaSetLabel
::with_data("p2", Uuid
::generate(), 1, ctime
+ 40, None
);
117 let tape4_uuid
= inventory
.generate_used_tape("tape4", sl4
.clone(), 0);
119 let media_list
= inventory
.list_pool_media("p1");
120 assert_eq
!(media_list
.len(), 3);
122 let media_list
= inventory
.list_pool_media("p2");
123 assert_eq
!(media_list
.len(), 1);
125 // reload, the do more tests
127 let inventory
= Inventory
::load(&testdir
)?
;
131 let media_set
= inventory
.compute_media_set_members(&sl1
.uuid
)?
;
132 assert_eq
!(media_set
.uuid(), &sl1
.uuid
);
134 let media_list
= media_set
.media_list();
135 assert_eq
!(media_list
.len(), 3);
137 assert_eq
!(media_list
[0], Some(tape1_uuid
.clone()));
138 assert_eq
!(media_list
[1], Some(tape2_uuid
.clone()));
139 assert_eq
!(media_list
[2], Some(tape3_uuid
.clone()));
141 // test media set start time
142 assert_eq
!(inventory
.media_set_start_time(&sl1
.uuid
), Some(ctime
+ 10));
146 let media_set
= inventory
.compute_media_set_members(&sl4
.uuid
)?
;
147 assert_eq
!(media_set
.uuid(), &sl4
.uuid
);
149 let media_list
= media_set
.media_list();
150 assert_eq
!(media_list
.len(), 2);
152 assert_eq
!(media_list
[0], None
);
153 assert_eq
!(media_list
[1], Some(tape4_uuid
.clone()));
155 // start time for incomplete set must be None
156 assert_eq
!(inventory
.media_set_start_time(&sl4
.uuid
), None
);
163 fn test_latest_media_set() -> Result
<(), Error
> {
165 let testdir
= create_testdir("test_latest_media_set")?
;
167 let insert_tape
= |inventory
: &mut Inventory
, pool
, label
, seq_nr
, ctime
| -> Uuid
{
168 let sl
= MediaSetLabel
::with_data(pool
, Uuid
::generate(), seq_nr
, ctime
, None
);
169 let uuid
= sl
.uuid
.clone();
170 inventory
.generate_used_tape(label
, sl
, 0);
174 let check_latest
= |inventory
: &Inventory
, pool
: &str, label
: &str| {
175 let latest_set
= inventory
.latest_media_set(pool
).unwrap();
176 let set
= inventory
.compute_media_set_members(&latest_set
).unwrap();
177 let media_list
= set
.media_list();
178 assert_eq
!(media_list
.iter().filter(|s
| s
.is_some()).count(), 1);
179 let media_uuid
= media_list
.iter().find(|s
| s
.is_some()).unwrap().clone().unwrap();
180 let media
= inventory
.lookup_media(&media_uuid
).unwrap();
181 assert_eq
!(media
.label
.label_text
, label
);
184 let mut inventory
= Inventory
::load(&testdir
)?
;
188 // test 3 sets with different start times
190 insert_tape(&mut inventory
, "p1", "p1tape1", 0, ctime
+ 10);
191 insert_tape(&mut inventory
, "p1", "p1tape2", 0, ctime
+ 20);
192 insert_tape(&mut inventory
, "p1", "p1tape3", 0, ctime
+ 30);
194 check_latest(&inventory
, "p1", "p1tape3");
196 // test 2 sets with same start times, should fail
198 insert_tape(&mut inventory
, "p2", "p2tape1", 0, ctime
+ 10);
199 insert_tape(&mut inventory
, "p2", "p2tape2", 0, ctime
+ 10);
201 assert_eq
!(inventory
.latest_media_set("p2"), None
);
203 // test with incomplete sets
205 insert_tape(&mut inventory
, "p3", "p3tape1", 5, ctime
+ 50);
206 insert_tape(&mut inventory
, "p3", "p3tape2", 1, ctime
+ 10);
207 insert_tape(&mut inventory
, "p3", "p3tape3", 0, ctime
+ 20);
209 check_latest(&inventory
, "p3", "p3tape1");