]>
git.proxmox.com Git - pve-storage.git/blob - src/test/prune_backups_test.pm
1 package PVE
::Storage
::TestPruneBackups
;
12 my $storeid = 'BackTest123';
13 my @vmids = (1234, 9001);
15 # only includes the information needed for prune_backups
16 my $mocked_backups_lists = {};
18 my $basetime = 1577881101; # 2020_01_01-12_18_21 UTC
20 foreach my $vmid (@vmids) {
21 push @{$mocked_backups_lists->{default}}, (
23 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2018_05_26-11_18_21.tar.zst",
24 'ctime' => $basetime - 585*24*60*60 - 60*60,
28 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_21.tar.zst",
29 'ctime' => $basetime - 24*60*60 - 60*60,
33 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_51.tar.zst",
34 'ctime' => $basetime - 24*60*60 - 60*60 + 30,
39 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_19_21.tar.zst",
40 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
44 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
45 'ctime' => $basetime - 60*60,
49 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
54 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
59 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
65 push @{$mocked_backups_lists->{year1970
}}, (
67 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
72 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
73 'ctime' => 60*60*24 * (365*100 + 25) + 60,
77 push @{$mocked_backups_lists->{novmid
}}, (
79 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
83 push @{$mocked_backups_lists->{threeway
}}, (
85 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_25-12_18_21.tar.zst",
86 'ctime' => $basetime - 7*24*60*60,
90 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_31-12_18_21.tar.zst",
91 'ctime' => $basetime - 24*60*60,
95 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_01_01-12_18_21.tar.zst",
100 push @{$mocked_backups_lists->{weekboundary
}}, (
102 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_03-12_18_21.tar.zst",
103 'ctime' => $basetime + (366-31+2)*24*60*60,
107 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_04-12_18_21.tar.zst",
108 'ctime' => $basetime + (366-31+3)*24*60*60,
112 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_07-12_18_21.tar.zst",
113 'ctime' => $basetime + (366-31+6)*24*60*60,
118 my $mock_plugin = Test
::MockModule-
>new('PVE::Storage::Plugin');
119 $mock_plugin->redefine(list_volumes
=> sub {
120 my ($class, $storeid, $scfg, $vmid, $content_types) = @_;
122 my $list = $mocked_backups_lists->{$current_list};
124 return $list if !defined($vmid);
126 return [ grep { $_->{vmid
} eq $vmid } @{$list} ];
129 sub generate_expected
{
130 my ($vmids, $type, $marks) = @_;
133 foreach my $vmid (@{$vmids}) {
136 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2018_05_26-11_18_21.tar.zst",
138 'ctime' => $basetime - 585*24*60*60 - 60*60,
139 'mark' => $marks->[0],
143 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_21.tar.zst",
145 'ctime' => $basetime - 24*60*60 - 60*60,
146 'mark' => $marks->[1],
150 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_51.tar.zst",
152 'ctime' => $basetime - 24*60*60 - 60*60 + 30,
153 'mark' => 'protected',
157 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_19_21.tar.zst",
159 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
160 'mark' => $marks->[2],
164 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
166 'ctime' => $basetime - 60*60,
167 'mark' => $marks->[3],
171 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
173 'ctime' => $basetime,
174 'mark' => $marks->[4],
177 ) if !defined($type) || $type eq 'qemu';
180 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
182 'ctime' => $basetime,
183 'mark' => $marks->[5],
186 ) if !defined($type) || $type eq 'lxc';
189 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
195 ) if !defined($type);
197 return [ sort { $a->{volid
} cmp $b->{volid
} } @expected ];
200 # an array of test cases, each test is comprised of the following keys:
201 # description => to identify a single test
202 # vmid => VMID or undef for all
203 # type => 'qemu' or 'lxc' or undef for all
204 # keep => options describing what to keep
205 # list => backups list to use. defaults to 'default'
206 # expected => what prune_backups should return
208 # most of them are created further below
211 description
=> 'last=3, multiple IDs',
215 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'keep', 'keep', 'keep']),
218 description
=> 'weekly=2, one ID',
223 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
226 description
=> 'daily=weekly=monthly=1, multiple IDs',
233 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
236 description
=> 'hourly=4, one ID',
242 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
245 description
=> 'yearly=2, multiple IDs',
253 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
256 description
=> 'last=2,hourly=2 one ID',
262 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
265 description
=> 'last=1,monthly=2, multiple IDs',
270 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
273 description
=> 'monthly=3, one ID',
278 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
281 description
=> 'last=daily=weekly=1, multiple IDs',
287 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
290 description
=> 'last=daily=weekly=1, others zero, multiple IDs',
299 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
302 description
=> 'daily=2, one ID',
307 expected
=> generate_expected
([$vmids[0]], undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
310 description
=> 'weekly=monthly=1, multiple IDs',
315 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
318 description
=> 'weekly=yearly=1, one ID',
324 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
327 description
=> 'weekly=yearly=1, one ID, type qemu',
334 expected
=> generate_expected
([$vmids[0]], 'qemu', ['keep', 'remove', 'remove', 'remove', 'keep', '']),
337 description
=> 'week=yearly=1, one ID, type lxc',
343 expected
=> generate_expected
([$vmids[0]], 'lxc', ['', '', '', '', '', 'keep']),
346 description
=> 'yearly=1, year before 2000',
353 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
360 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
361 'ctime' => 60*60*24 * (365*100 + 25) + 60,
369 description
=> 'last=1, ne ID, year before 2000',
376 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
384 description
=> 'all missing, multiple IDs',
386 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
389 description
=> 'all zero, multiple IDs',
398 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
401 description
=> 'some zero, some missing, multiple IDs',
409 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
412 description
=> 'daily=weekly=monthly=1',
421 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_25-12_18_21.tar.zst",
422 'ctime' => $basetime - 7*24*60*60,
428 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_31-12_18_21.tar.zst",
429 'ctime' => $basetime - 24*60*60,
432 'mark' => 'remove', # month is already covered by the backup kept by keep-weekly!
435 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_01_01-12_18_21.tar.zst",
436 'ctime' => $basetime,
444 description
=> 'daily=weekly=1,weekboundary',
449 list
=> 'weekboundary',
452 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_03-12_18_21.tar.zst",
453 'ctime' => $basetime + (366-31+2)*24*60*60,
459 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_04-12_18_21.tar.zst",
460 'ctime' => $basetime + (366-31+3)*24*60*60,
466 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_07-12_18_21.tar.zst",
467 'ctime' => $basetime + (366-31+6)*24*60*60,
476 plan tests
=> scalar @$tests;
478 for my $tt (@$tests) {
481 $current_list = $tt->{list
} // 'default';
482 my $res = PVE
::Storage
::Plugin-
>prune_backups($tt->{scfg
}, $storeid, $tt->{keep
}, $tt->{vmid
}, $tt->{type
}, 1);
483 return [ sort { $a->{volid
} cmp $b->{volid
} } @{$res} ];
487 is_deeply
($got, $tt->{expected
}, $tt->{description
}) || diag
(explain
($got));