]> git.proxmox.com Git - proxmox-backup.git/blob - src/tape/test/compute_media_state.rs
6dbfaf4f6470af0b8ce2fb8bb265fd5ddca2c12e
[proxmox-backup.git] / src / tape / test / compute_media_state.rs
1 // Tape Media Pool tests - test compute_media_state() function
2 //
3 // # cargo test --release tape::test::compute_media_state
4
5 use std::path::PathBuf;
6 use anyhow::Error;
7
8 use proxmox::tools::{
9 Uuid,
10 };
11
12 use pbs_api_types::{MediaStatus, MediaSetPolicy, RetentionPolicy};
13
14 use crate::tape::{
15 Inventory,
16 MediaPool,
17 file_formats::{
18 MediaSetLabel,
19 },
20 };
21
22 fn create_testdir(name: &str) -> Result<PathBuf, Error> {
23 let mut testdir: PathBuf = String::from("./target/testout").into();
24 testdir.push(std::module_path!());
25 testdir.push(name);
26
27 let _ = std::fs::remove_dir_all(&testdir);
28 let _ = std::fs::create_dir_all(&testdir);
29
30 Ok(testdir)
31 }
32
33 #[test]
34 fn test_compute_media_state() -> Result<(), Error> {
35
36 let testdir = create_testdir("test_compute_media_state")?;
37
38 let ctime = 0;
39
40 let mut inventory = Inventory::load(&testdir)?;
41
42 // tape1: free, assigned to pool
43 let tape1_uuid = inventory.generate_assigned_tape("tape1", "p1", ctime);
44
45 // tape2: single tape media set
46 let sl2 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 10, None);
47 let tape2_uuid = inventory.generate_used_tape("tape2", sl2, 0);
48
49 // tape3: inclomplete two tape media set
50 let sl3 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 20, None);
51 let tape3_uuid = inventory.generate_used_tape("tape3", sl3, 0);
52
53 // tape4,tape5: current_set: complete two tape media set
54 let sl4 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 30, None);
55 let sl5 = MediaSetLabel::with_data("p1", sl4.uuid.clone(), 1, ctime + 35, None);
56
57 let tape4_uuid = inventory.generate_used_tape("tape4", sl4, 0);
58 let tape5_uuid = inventory.generate_used_tape("tape5", sl5, 0);
59
60 let pool = MediaPool::new(
61 "p1",
62 &testdir ,
63 MediaSetPolicy::AlwaysCreate,
64 RetentionPolicy::KeepForever,
65 None,
66 None,
67 false,
68 )?;
69
70 // tape1 is free
71 assert_eq!(pool.lookup_media(&tape1_uuid)?.status(), &MediaStatus::Writable);
72
73 // intermediate tapes should be Full
74 assert_eq!(pool.lookup_media(&tape2_uuid)?.status(), &MediaStatus::Full);
75 assert_eq!(pool.lookup_media(&tape3_uuid)?.status(), &MediaStatus::Full);
76 assert_eq!(pool.lookup_media(&tape4_uuid)?.status(), &MediaStatus::Full);
77
78 // last tape is writable
79 assert_eq!(pool.lookup_media(&tape5_uuid)?.status(), &MediaStatus::Writable);
80
81 Ok(())
82 }
83
84 #[test]
85 fn test_media_expire_time() -> Result<(), Error> {
86
87 let testdir = create_testdir("test_media_expire_time")?;
88
89 let ctime = 0;
90
91 let mut inventory = Inventory::load(&testdir)?;
92
93 // tape0: single tape media set
94 let sl0 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None);
95 let tape0_uuid = inventory.generate_used_tape("tape0", sl0, 0);
96
97 // tape1: single tape media set
98 let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 60, None);
99 let tape1_uuid = inventory.generate_used_tape("tape1", sl1, 0);
100
101 // tape2: single tape media set
102 let sl2= MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime + 120, None);
103 let tape2_uuid = inventory.generate_used_tape("tape2", sl2, 0);
104
105 let event = proxmox_systemd::time::parse_calendar_event("*:0/2")?;
106 let span = proxmox_systemd::time::parse_time_span("120 seconds")?;
107
108 let pool = MediaPool::new(
109 "p1",
110 &testdir ,
111 MediaSetPolicy::CreateAt(event),
112 RetentionPolicy::ProtectFor(span),
113 None,
114 None,
115 false,
116 )?;
117
118 assert_eq!(pool.lookup_media(&tape0_uuid)?.status(), &MediaStatus::Full);
119 assert_eq!(pool.lookup_media(&tape1_uuid)?.status(), &MediaStatus::Full);
120 assert_eq!(pool.lookup_media(&tape2_uuid)?.status(), &MediaStatus::Writable);
121
122 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape0_uuid)?, 0), false);
123 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape0_uuid)?, 60), false);
124 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape0_uuid)?, 120), false);
125 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape0_uuid)?, 180), true);
126
127 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 0), false);
128 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 60), false);
129 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 120), false);
130 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 180), false);
131 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 190), false);
132 assert_eq!(pool.media_is_expired(&pool.lookup_media(&tape1_uuid)?, 240), true);
133
134 Ok(())
135 }