]>
git.proxmox.com Git - pve-storage.git/blob - 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_19_21.tar.zst",
34 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
38 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
39 'ctime' => $basetime - 60*60,
43 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
48 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
53 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
59 push @{$mocked_backups_lists->{year1970
}}, (
61 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
66 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
67 'ctime' => 60*60*24 * (365*100 + 25) + 60,
71 push @{$mocked_backups_lists->{novmid
}}, (
73 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
78 my $mock_plugin = Test
::MockModule-
>new('PVE::Storage::Plugin');
79 $mock_plugin->redefine(list_volumes
=> sub {
80 my ($class, $storeid, $scfg, $vmid, $content_types) = @_;
82 my $list = $mocked_backups_lists->{$current_list};
84 return $list if !defined($vmid);
86 return [ grep { $_->{vmid
} eq $vmid } @{$list} ];
89 sub generate_expected
{
90 my ($vmids, $type, $marks) = @_;
93 foreach my $vmid (@{$vmids}) {
96 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2018_05_26-11_18_21.tar.zst",
98 'ctime' => $basetime - 585*24*60*60 - 60*60,
99 'mark' => $marks->[0],
103 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_21.tar.zst",
105 'ctime' => $basetime - 24*60*60 - 60*60,
106 'mark' => $marks->[1],
110 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_19_21.tar.zst",
112 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
113 'mark' => $marks->[2],
117 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
119 'ctime' => $basetime - 60*60,
120 'mark' => $marks->[3],
124 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
126 'ctime' => $basetime,
127 'mark' => $marks->[4],
130 ) if !defined($type) || $type eq 'qemu';
133 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
135 'ctime' => $basetime,
136 'mark' => $marks->[5],
139 ) if !defined($type) || $type eq 'lxc';
142 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
145 'mark' => 'protected',
148 ) if !defined($type);
150 return [ sort { $a->{volid
} cmp $b->{volid
} } @expected ];
153 # an array of test cases, each test is comprised of the following keys:
154 # description => to identify a single test
155 # vmid => VMID or undef for all
156 # type => 'qemu' or 'lxc' or undef for all
157 # keep => options describing what to keep
158 # list => backups list to use. defaults to 'default'
159 # expected => what prune_backups should return
161 # most of them are created further below
164 description
=> 'last=3, multiple IDs',
168 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'keep', 'keep', 'keep']),
171 description
=> 'weekly=2, one ID',
176 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
179 description
=> 'daily=weekly=monthly=1, multiple IDs',
186 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
189 description
=> 'hourly=4, one ID',
195 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
198 description
=> 'yearly=2, multiple IDs',
206 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
209 description
=> 'last=2,hourly=2 one ID',
215 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
218 description
=> 'last=1,monthly=2, multiple IDs',
223 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
226 description
=> 'monthly=3, one ID',
231 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
234 description
=> 'last=daily=weekly=1, multiple IDs',
240 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
243 description
=> 'daily=2, one ID',
248 expected
=> generate_expected
([$vmids[0]], undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
251 description
=> 'weekly=monthly=1, multiple IDs',
256 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
259 description
=> 'weekly=yearly=1, one ID',
265 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
268 description
=> 'weekly=yearly=1, one ID, type qemu',
275 expected
=> generate_expected
([$vmids[0]], 'qemu', ['keep', 'remove', 'remove', 'remove', 'keep', '']),
278 description
=> 'week=yearly=1, one ID, type lxc',
284 expected
=> generate_expected
([$vmids[0]], 'lxc', ['', '', '', '', '', 'keep']),
287 description
=> 'yearly=1, year before 2000',
294 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
301 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
302 'ctime' => 60*60*24 * (365*100 + 25) + 60,
310 description
=> 'last=1, ne ID, year before 2000',
317 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
319 'mark' => 'protected',
326 plan tests
=> scalar @$tests;
328 for my $tt (@$tests) {
331 $current_list = $tt->{list
} // 'default';
332 my $res = PVE
::Storage
::Plugin-
>prune_backups($tt->{scfg
}, $storeid, $tt->{keep
}, $tt->{vmid
}, $tt->{type
}, 1);
333 return [ sort { $a->{volid
} cmp $b->{volid
} } @{$res} ];
337 is_deeply
($got, $tt->{expected
}, $tt->{description
}) || diag
(explain
($got));