]>
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",
77 push @{$mocked_backups_lists->{threeway
}}, (
79 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_25-12_18_21.tar.zst",
80 'ctime' => $basetime - 7*24*60*60,
84 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_31-12_18_21.tar.zst",
85 'ctime' => $basetime - 24*60*60,
89 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_01_01-12_18_21.tar.zst",
95 my $mock_plugin = Test
::MockModule-
>new('PVE::Storage::Plugin');
96 $mock_plugin->redefine(list_volumes
=> sub {
97 my ($class, $storeid, $scfg, $vmid, $content_types) = @_;
99 my $list = $mocked_backups_lists->{$current_list};
101 return $list if !defined($vmid);
103 return [ grep { $_->{vmid
} eq $vmid } @{$list} ];
106 sub generate_expected
{
107 my ($vmids, $type, $marks) = @_;
110 foreach my $vmid (@{$vmids}) {
113 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2018_05_26-11_18_21.tar.zst",
115 'ctime' => $basetime - 585*24*60*60 - 60*60,
116 'mark' => $marks->[0],
120 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_21.tar.zst",
122 'ctime' => $basetime - 24*60*60 - 60*60,
123 'mark' => $marks->[1],
127 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_19_21.tar.zst",
129 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
130 'mark' => $marks->[2],
134 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
136 'ctime' => $basetime - 60*60,
137 'mark' => $marks->[3],
141 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
143 'ctime' => $basetime,
144 'mark' => $marks->[4],
147 ) if !defined($type) || $type eq 'qemu';
150 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
152 'ctime' => $basetime,
153 'mark' => $marks->[5],
156 ) if !defined($type) || $type eq 'lxc';
159 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
162 'mark' => 'protected',
165 ) if !defined($type);
167 return [ sort { $a->{volid
} cmp $b->{volid
} } @expected ];
170 # an array of test cases, each test is comprised of the following keys:
171 # description => to identify a single test
172 # vmid => VMID or undef for all
173 # type => 'qemu' or 'lxc' or undef for all
174 # keep => options describing what to keep
175 # list => backups list to use. defaults to 'default'
176 # expected => what prune_backups should return
178 # most of them are created further below
181 description
=> 'last=3, multiple IDs',
185 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'keep', 'keep', 'keep']),
188 description
=> 'weekly=2, one ID',
193 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
196 description
=> 'daily=weekly=monthly=1, multiple IDs',
203 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
206 description
=> 'hourly=4, one ID',
212 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
215 description
=> 'yearly=2, multiple IDs',
223 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
226 description
=> 'last=2,hourly=2 one ID',
232 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
235 description
=> 'last=1,monthly=2, multiple IDs',
240 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
243 description
=> 'monthly=3, one ID',
248 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
251 description
=> 'last=daily=weekly=1, multiple IDs',
257 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
260 description
=> 'last=daily=weekly=1, others zero, multiple IDs',
269 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
272 description
=> 'daily=2, one ID',
277 expected
=> generate_expected
([$vmids[0]], undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
280 description
=> 'weekly=monthly=1, multiple IDs',
285 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
288 description
=> 'weekly=yearly=1, one ID',
294 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
297 description
=> 'weekly=yearly=1, one ID, type qemu',
304 expected
=> generate_expected
([$vmids[0]], 'qemu', ['keep', 'remove', 'remove', 'remove', 'keep', '']),
307 description
=> 'week=yearly=1, one ID, type lxc',
313 expected
=> generate_expected
([$vmids[0]], 'lxc', ['', '', '', '', '', 'keep']),
316 description
=> 'yearly=1, year before 2000',
323 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
330 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
331 'ctime' => 60*60*24 * (365*100 + 25) + 60,
339 description
=> 'last=1, ne ID, year before 2000',
346 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
348 'mark' => 'protected',
354 description
=> 'all missing, multiple IDs',
356 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
359 description
=> 'all zero, multiple IDs',
368 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
371 description
=> 'some zero, some missing, multiple IDs',
379 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
382 description
=> 'daily=weekly=monthly=1',
391 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_25-12_18_21.tar.zst",
392 'ctime' => $basetime - 7*24*60*60,
398 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_31-12_18_21.tar.zst",
399 'ctime' => $basetime - 24*60*60,
402 'mark' => 'remove', # month is already covered by the backup kept by keep-weekly!
405 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_01_01-12_18_21.tar.zst",
406 'ctime' => $basetime,
415 plan tests
=> scalar @$tests;
417 for my $tt (@$tests) {
420 $current_list = $tt->{list
} // 'default';
421 my $res = PVE
::Storage
::Plugin-
>prune_backups($tt->{scfg
}, $storeid, $tt->{keep
}, $tt->{vmid
}, $tt->{type
}, 1);
422 return [ sort { $a->{volid
} cmp $b->{volid
} } @{$res} ];
426 is_deeply
($got, $tt->{expected
}, $tt->{description
}) || diag
(explain
($got));