]>
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",
94 push @{$mocked_backups_lists->{weekboundary
}}, (
96 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_03-12_18_21.tar.zst",
97 'ctime' => $basetime + (366-31+2)*24*60*60,
101 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_04-12_18_21.tar.zst",
102 'ctime' => $basetime + (366-31+3)*24*60*60,
106 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_07-12_18_21.tar.zst",
107 'ctime' => $basetime + (366-31+6)*24*60*60,
112 my $mock_plugin = Test
::MockModule-
>new('PVE::Storage::Plugin');
113 $mock_plugin->redefine(list_volumes
=> sub {
114 my ($class, $storeid, $scfg, $vmid, $content_types) = @_;
116 my $list = $mocked_backups_lists->{$current_list};
118 return $list if !defined($vmid);
120 return [ grep { $_->{vmid
} eq $vmid } @{$list} ];
123 sub generate_expected
{
124 my ($vmids, $type, $marks) = @_;
127 foreach my $vmid (@{$vmids}) {
130 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2018_05_26-11_18_21.tar.zst",
132 'ctime' => $basetime - 585*24*60*60 - 60*60,
133 'mark' => $marks->[0],
137 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_18_21.tar.zst",
139 'ctime' => $basetime - 24*60*60 - 60*60,
140 'mark' => $marks->[1],
144 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2019_12_31-11_19_21.tar.zst",
146 'ctime' => $basetime - 24*60*60 - 60*60 + 60,
147 'mark' => $marks->[2],
151 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-11_18_21.tar.zst",
153 'ctime' => $basetime - 60*60,
154 'mark' => $marks->[3],
158 'volid' => "$storeid:backup/vzdump-qemu-$vmid-2020_01_01-12_18_21.tar.zst",
160 'ctime' => $basetime,
161 'mark' => $marks->[4],
164 ) if !defined($type) || $type eq 'qemu';
167 'volid' => "$storeid:backup/vzdump-lxc-$vmid-2020_01_01-12_18_21.tar.zst",
169 'ctime' => $basetime,
170 'mark' => $marks->[5],
173 ) if !defined($type) || $type eq 'lxc';
176 'volid' => "$storeid:backup/vzdump-$vmid-renamed.tar.zst",
179 'mark' => 'protected',
182 ) if !defined($type);
184 return [ sort { $a->{volid
} cmp $b->{volid
} } @expected ];
187 # an array of test cases, each test is comprised of the following keys:
188 # description => to identify a single test
189 # vmid => VMID or undef for all
190 # type => 'qemu' or 'lxc' or undef for all
191 # keep => options describing what to keep
192 # list => backups list to use. defaults to 'default'
193 # expected => what prune_backups should return
195 # most of them are created further below
198 description
=> 'last=3, multiple IDs',
202 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'keep', 'keep', 'keep']),
205 description
=> 'weekly=2, one ID',
210 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
213 description
=> 'daily=weekly=monthly=1, multiple IDs',
220 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
223 description
=> 'hourly=4, one ID',
229 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
232 description
=> 'yearly=2, multiple IDs',
240 expected
=> generate_expected
(\
@vmids, undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
243 description
=> 'last=2,hourly=2 one ID',
249 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'keep', 'keep', 'keep']),
252 description
=> 'last=1,monthly=2, multiple IDs',
257 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
260 description
=> 'monthly=3, one ID',
265 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
268 description
=> 'last=daily=weekly=1, multiple IDs',
274 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
277 description
=> 'last=daily=weekly=1, others zero, multiple IDs',
286 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']),
289 description
=> 'daily=2, one ID',
294 expected
=> generate_expected
([$vmids[0]], undef, ['remove', 'remove', 'keep', 'remove', 'keep', 'keep']),
297 description
=> 'weekly=monthly=1, multiple IDs',
302 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
305 description
=> 'weekly=yearly=1, one ID',
311 expected
=> generate_expected
([$vmids[0]], undef, ['keep', 'remove', 'remove', 'remove', 'keep', 'keep']),
314 description
=> 'weekly=yearly=1, one ID, type qemu',
321 expected
=> generate_expected
([$vmids[0]], 'qemu', ['keep', 'remove', 'remove', 'remove', 'keep', '']),
324 description
=> 'week=yearly=1, one ID, type lxc',
330 expected
=> generate_expected
([$vmids[0]], 'lxc', ['', '', '', '', '', 'keep']),
333 description
=> 'yearly=1, year before 2000',
340 'volid' => "$storeid:backup/vzdump-lxc-321-1970_01_01-00_01_23.tar.zst",
347 'volid' => "$storeid:backup/vzdump-lxc-321-2070_01_01-00_01_00.tar.zst",
348 'ctime' => 60*60*24 * (365*100 + 25) + 60,
356 description
=> 'last=1, ne ID, year before 2000',
363 'volid' => "$storeid:backup/vzdump-lxc-novmid.tar.gz",
365 'mark' => 'protected',
371 description
=> 'all missing, multiple IDs',
373 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
376 description
=> 'all zero, multiple IDs',
385 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
388 description
=> 'some zero, some missing, multiple IDs',
396 expected
=> generate_expected
(\
@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']),
399 description
=> 'daily=weekly=monthly=1',
408 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_25-12_18_21.tar.zst",
409 'ctime' => $basetime - 7*24*60*60,
415 'volid' => "$storeid:backup/vzdump-qemu-7654-2019_12_31-12_18_21.tar.zst",
416 'ctime' => $basetime - 24*60*60,
419 'mark' => 'remove', # month is already covered by the backup kept by keep-weekly!
422 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_01_01-12_18_21.tar.zst",
423 'ctime' => $basetime,
431 description
=> 'daily=weekly=1,weekboundary',
436 list
=> 'weekboundary',
439 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_03-12_18_21.tar.zst",
440 'ctime' => $basetime + (366-31+2)*24*60*60,
446 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_04-12_18_21.tar.zst",
447 'ctime' => $basetime + (366-31+3)*24*60*60,
453 'volid' => "$storeid:backup/vzdump-qemu-7654-2020_12_07-12_18_21.tar.zst",
454 'ctime' => $basetime + (366-31+6)*24*60*60,
463 plan tests
=> scalar @$tests;
465 for my $tt (@$tests) {
468 $current_list = $tt->{list
} // 'default';
469 my $res = PVE
::Storage
::Plugin-
>prune_backups($tt->{scfg
}, $storeid, $tt->{keep
}, $tt->{vmid
}, $tt->{type
}, 1);
470 return [ sort { $a->{volid
} cmp $b->{volid
} } @{$res} ];
474 is_deeply
($got, $tt->{expected
}, $tt->{description
}) || diag
(explain
($got));