2 use std
::path
::PathBuf
;
4 use proxmox_backup
::backup
::*;
9 options
: &PruneOptions
,
12 let mut prune_info
= compute_prune_info(list
, options
).unwrap();
18 .filter_map(|(info
, keep
)| {
19 if *keep
!= return_kept
{
22 Some(info
.backup_dir
.relative_path())
33 let backup_dir
: BackupDir
= snapshot
.parse().unwrap();
35 let mut files
= Vec
::new();
38 files
.push(String
::from(MANIFEST_BLOB_NAME
));
41 BackupInfo { backup_dir, files }
45 fn test_prune_hourly() -> Result
<(), Error
> {
47 let mut orig_list
= Vec
::new();
49 orig_list
.push(create_info("host/elsa/2019-11-15T09:39:15Z", false));
50 orig_list
.push(create_info("host/elsa/2019-11-15T10:49:15Z", false));
51 orig_list
.push(create_info("host/elsa/2019-11-15T10:59:15Z", false));
52 orig_list
.push(create_info("host/elsa/2019-11-15T11:39:15Z", false));
53 orig_list
.push(create_info("host/elsa/2019-11-15T11:49:15Z", false));
54 orig_list
.push(create_info("host/elsa/2019-11-15T11:59:15Z", false));
56 let list
= orig_list
.clone();
57 let options
= PruneOptions
::new().keep_hourly(Some(3));
58 let remove_list
= get_prune_list(list
, false, &options
);
59 let expect
: Vec
<PathBuf
> = vec
![
60 PathBuf
::from("host/elsa/2019-11-15T10:49:15Z"),
61 PathBuf
::from("host/elsa/2019-11-15T11:39:15Z"),
62 PathBuf
::from("host/elsa/2019-11-15T11:49:15Z"),
64 assert_eq
!(remove_list
, expect
);
66 let list
= orig_list
.clone();
67 let options
= PruneOptions
::new().keep_hourly(Some(2));
68 let remove_list
= get_prune_list(list
, true, &options
);
69 let expect
: Vec
<PathBuf
> = vec
![
70 PathBuf
::from("host/elsa/2019-11-15T10:59:15Z"),
71 PathBuf
::from("host/elsa/2019-11-15T11:59:15Z"),
73 assert_eq
!(remove_list
, expect
);
79 fn test_prune_simple2() -> Result
<(), Error
> {
81 let mut orig_list
= Vec
::new();
83 orig_list
.push(create_info("host/elsa/2018-11-15T11:59:15Z", false));
84 orig_list
.push(create_info("host/elsa/2019-11-15T11:59:15Z", false));
85 orig_list
.push(create_info("host/elsa/2019-11-21T11:59:15Z", false));
86 orig_list
.push(create_info("host/elsa/2019-11-22T11:59:15Z", false));
87 orig_list
.push(create_info("host/elsa/2019-11-29T11:59:15Z", false));
88 orig_list
.push(create_info("host/elsa/2019-12-01T11:59:15Z", false));
89 orig_list
.push(create_info("host/elsa/2019-12-02T11:59:15Z", false));
90 orig_list
.push(create_info("host/elsa/2019-12-03T11:59:15Z", false));
91 orig_list
.push(create_info("host/elsa/2019-12-04T11:59:15Z", false));
93 let list
= orig_list
.clone();
94 let options
= PruneOptions
::new().keep_daily(Some(1));
95 let remove_list
= get_prune_list(list
, true, &options
);
96 let expect
: Vec
<PathBuf
> = vec
![
97 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
99 assert_eq
!(remove_list
, expect
);
101 let list
= orig_list
.clone();
102 let options
= PruneOptions
::new().keep_last(Some(1)).keep_daily(Some(1));
103 let remove_list
= get_prune_list(list
, true, &options
);
104 let expect
: Vec
<PathBuf
> = vec
![
105 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
106 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
108 assert_eq
!(remove_list
, expect
);
110 let list
= orig_list
.clone();
111 let options
= PruneOptions
::new().keep_daily(Some(1)).keep_weekly(Some(1));
112 let remove_list
= get_prune_list(list
, true, &options
);
113 let expect
: Vec
<PathBuf
> = vec
![
114 PathBuf
::from("host/elsa/2019-12-01T11:59:15Z"),
115 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
117 assert_eq
!(remove_list
, expect
);
119 let list
= orig_list
.clone();
120 let options
= PruneOptions
::new().keep_daily(Some(1)).keep_weekly(Some(1)).keep_monthly(Some(1));
121 let remove_list
= get_prune_list(list
, true, &options
);
122 let expect
: Vec
<PathBuf
> = vec
![
123 PathBuf
::from("host/elsa/2019-11-22T11:59:15Z"),
124 PathBuf
::from("host/elsa/2019-12-01T11:59:15Z"),
125 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
127 assert_eq
!(remove_list
, expect
);
129 let list
= orig_list
.clone();
130 let options
= PruneOptions
::new().keep_monthly(Some(1)).keep_yearly(Some(1));
131 let remove_list
= get_prune_list(list
, true, &options
);
132 let expect
: Vec
<PathBuf
> = vec
![
133 PathBuf
::from("host/elsa/2018-11-15T11:59:15Z"),
134 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
136 assert_eq
!(remove_list
, expect
);
142 fn test_prune_simple() -> Result
<(), Error
> {
144 let mut orig_list
= Vec
::new();
146 orig_list
.push(create_info("host/elsa/2019-12-02T11:59:15Z", false));
147 orig_list
.push(create_info("host/elsa/2019-12-03T11:59:15Z", false));
148 orig_list
.push(create_info("host/elsa/2019-12-04T11:59:15Z", false));
149 orig_list
.push(create_info("host/elsa/2019-12-04T12:59:15Z", false));
153 let list
= orig_list
.clone();
154 let options
= PruneOptions
::new().keep_last(Some(4));
155 let remove_list
= get_prune_list(list
, false, &options
);
156 let expect
: Vec
<PathBuf
> = Vec
::new();
157 assert_eq
!(remove_list
, expect
);
159 let list
= orig_list
.clone();
160 let options
= PruneOptions
::new().keep_last(Some(3));
161 let remove_list
= get_prune_list(list
, false, &options
);
162 let expect
: Vec
<PathBuf
> = vec
![
163 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
165 assert_eq
!(remove_list
, expect
);
167 let list
= orig_list
.clone();
168 let options
= PruneOptions
::new().keep_last(Some(2));
169 let remove_list
= get_prune_list(list
, false, &options
);
170 let expect
: Vec
<PathBuf
> = vec
![
171 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
172 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
174 assert_eq
!(remove_list
, expect
);
176 let list
= orig_list
.clone();
177 let options
= PruneOptions
::new().keep_last(Some(1));
178 let remove_list
= get_prune_list(list
, false, &options
);
179 let expect
: Vec
<PathBuf
> = vec
![
180 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
181 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
182 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
184 assert_eq
!(remove_list
, expect
);
186 let list
= orig_list
.clone();
187 let options
= PruneOptions
::new().keep_last(Some(0));
188 let remove_list
= get_prune_list(list
, false, &options
);
189 let expect
: Vec
<PathBuf
> = vec
![
190 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
191 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
192 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
193 PathBuf
::from("host/elsa/2019-12-04T12:59:15Z"),
195 assert_eq
!(remove_list
, expect
);
197 // keep-last, keep-daily mixed
198 let list
= orig_list
.clone();
199 let options
= PruneOptions
::new().keep_last(Some(2)).keep_daily(Some(2));
200 let remove_list
= get_prune_list(list
, false, &options
);
201 let expect
: Vec
<PathBuf
> = vec
![];
202 assert_eq
!(remove_list
, expect
);
205 let list
= orig_list
.clone();
206 let options
= PruneOptions
::new().keep_daily(Some(3));
207 let remove_list
= get_prune_list(list
, false, &options
);
208 let expect
: Vec
<PathBuf
> = vec
![PathBuf
::from("host/elsa/2019-12-04T11:59:15Z")];
209 assert_eq
!(remove_list
, expect
);
212 let list
= orig_list
.clone();
213 let options
= PruneOptions
::new().keep_daily(Some(2));
214 let remove_list
= get_prune_list(list
, false, &options
);
215 let expect
: Vec
<PathBuf
> = vec
![
216 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
217 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
219 assert_eq
!(remove_list
, expect
);
222 let list
= orig_list
.clone();
223 let options
= PruneOptions
::new().keep_weekly(Some(5));
224 let remove_list
= get_prune_list(list
, false, &options
);
225 // all backup are within the same week, so we only keep a single file
226 let expect
: Vec
<PathBuf
> = vec
![
227 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
228 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
229 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
231 assert_eq
!(remove_list
, expect
);
233 // keep-daily + keep-weekly
234 let list
= orig_list
.clone();
235 let options
= PruneOptions
::new().keep_daily(Some(1)).keep_weekly(Some(5));
236 let remove_list
= get_prune_list(list
, false, &options
);
237 let expect
: Vec
<PathBuf
> = vec
![
238 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
239 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
240 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
242 assert_eq
!(remove_list
, expect
);
245 let list
= orig_list
.clone();
246 let options
= PruneOptions
::new().keep_monthly(Some(6));
247 let remove_list
= get_prune_list(list
, false, &options
);
248 // all backup are within the same month, so we only keep a single file
249 let expect
: Vec
<PathBuf
> = vec
![
250 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
251 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
252 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
254 assert_eq
!(remove_list
, expect
);
257 let list
= orig_list
.clone();
258 let options
= PruneOptions
::new().keep_yearly(Some(7));
259 let remove_list
= get_prune_list(list
, false, &options
);
260 // all backup are within the same year, so we only keep a single file
261 let expect
: Vec
<PathBuf
> = vec
![
262 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
263 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
264 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
266 assert_eq
!(remove_list
, expect
);
268 // keep-weekly + keep-monthly + keep-yearly
269 let list
= orig_list
.clone();
270 let options
= PruneOptions
::new().keep_weekly(Some(5)).keep_monthly(Some(6)).keep_yearly(Some(7));
271 let remove_list
= get_prune_list(list
, false, &options
);
272 // all backup are within one week, so we only keep a single file
273 let expect
: Vec
<PathBuf
> = vec
![
274 PathBuf
::from("host/elsa/2019-12-02T11:59:15Z"),
275 PathBuf
::from("host/elsa/2019-12-03T11:59:15Z"),
276 PathBuf
::from("host/elsa/2019-12-04T11:59:15Z"),
278 assert_eq
!(remove_list
, expect
);