From f514181d2800207eb0a56a3d8fffa7bffdd84418 Mon Sep 17 00:00:00 2001 From: Fabian Ebner Date: Fri, 13 Nov 2020 14:08:54 +0100 Subject: [PATCH] prune mark: keep all if all prune options are zero/missing as an additional safety measure. And add some tests. Signed-off-by: Fabian Ebner --- PVE/Storage.pm | 7 +++++++ test/prune_backups_test.pm | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 932f0f1..a2f400c 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -1622,6 +1622,13 @@ my $prune_mark = sub { sub prune_mark_backup_group { my ($backup_group, $keep) = @_; + if (!scalar(grep {$_ > 0} values %{$keep})) { + foreach my $prune_entry (@{$backup_group}) { + $prune_entry->{mark} = 'keep'; + } + return; + } + my $prune_list = [ sort { $b->{ctime} <=> $a->{ctime} } @{$backup_group} ]; $prune_mark->($prune_list, $keep->{'keep-last'}, sub { diff --git a/test/prune_backups_test.pm b/test/prune_backups_test.pm index 1e6a3d1..8bf564d 100644 --- a/test/prune_backups_test.pm +++ b/test/prune_backups_test.pm @@ -239,6 +239,18 @@ my $tests = [ }, expected => generate_expected(\@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']), }, + { + description => 'last=daily=weekly=1, others zero, multiple IDs', + keep => { + 'keep-hourly' => 0, + 'keep-last' => 1, + 'keep-daily' => 1, + 'keep-weekly' => 1, + 'keep-monthly' => 0, + 'keep-yearly' => 0, + }, + expected => generate_expected(\@vmids, undef, ['keep', 'remove', 'keep', 'remove', 'keep', 'keep']), + }, { description => 'daily=2, one ID', vmid => $vmids[0], @@ -321,6 +333,34 @@ my $tests = [ }, ], }, + { + description => 'all missing, multiple IDs', + keep => {}, + expected => generate_expected(\@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']), + }, + { + description => 'all zero, multiple IDs', + keep => { + 'keep-last' => 0, + 'keep-hourly' => 0, + 'keep-daily' => 0, + 'keep-weekly' => 0, + 'keep-monthyl' => 0, + 'keep-yearly' => 0, + }, + expected => generate_expected(\@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']), + }, + { + description => 'some zero, some missing, multiple IDs', + keep => { + 'keep-last' => 0, + 'keep-hourly' => 0, + 'keep-daily' => 0, + 'keep-monthyl' => 0, + 'keep-yearly' => 0, + }, + expected => generate_expected(\@vmids, undef, ['keep', 'keep', 'keep', 'keep', 'keep', 'keep']), + }, ]; plan tests => scalar @$tests; -- 2.39.5