Introduce prune-backups property for directory-based storages

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
Fabian Ebner
2020-07-09 14:45:41 +02:00
committed by Thomas Lamprecht
parent 0dffc7ba55
commit 3353698f45
7 changed files with 70 additions and 7 deletions

View File

@ -134,6 +134,7 @@ sub options {
nodes => { optional => 1 },
disable => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
content => { optional => 1 },
format => { optional => 1 },
username => { optional => 1 },

View File

@ -150,6 +150,7 @@ sub options {
fuse => { optional => 1 },
bwlimit => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
};
}

View File

@ -49,10 +49,11 @@ sub properties {
sub options {
return {
path => { fixed => 1 },
nodes => { optional => 1 },
nodes => { optional => 1 },
shared => { optional => 1 },
disable => { optional => 1 },
maxfiles => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
content => { optional => 1 },
format => { optional => 1 },
mkdir => { optional => 1 },

View File

@ -129,9 +129,10 @@ sub options {
server2 => { optional => 1 },
volume => { fixed => 1 },
transport => { optional => 1 },
nodes => { optional => 1 },
nodes => { optional => 1 },
disable => { optional => 1 },
maxfiles => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
content => { optional => 1 },
format => { optional => 1 },
mkdir => { optional => 1 },

View File

@ -79,9 +79,10 @@ sub options {
path => { fixed => 1 },
server => { fixed => 1 },
export => { fixed => 1 },
nodes => { optional => 1 },
nodes => { optional => 1 },
disable => { optional => 1 },
maxfiles => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
options => { optional => 1 },
content => { optional => 1 },
format => { optional => 1 },

View File

@ -55,6 +55,7 @@ sub options {
password => { optional => 1 },
'encryption-key' => { optional => 1 },
maxfiles => { optional => 1 },
'prune-backups' => { optional => 1 },
fingerprint => { optional => 1 },
};
}

View File

@ -10,7 +10,7 @@ use File::Basename;
use File::stat qw();
use PVE::Tools qw(run_command);
use PVE::JSONSchema qw(get_standard_option);
use PVE::JSONSchema qw(get_standard_option register_standard_option);
use PVE::Cluster qw(cfs_register_file);
use JSON;
@ -43,6 +43,62 @@ cfs_register_file ('storage.cfg',
sub { __PACKAGE__->parse_config(@_); },
sub { __PACKAGE__->write_config(@_); });
my %prune_option = (
optional => 1,
type => 'integer', minimum => '0',
format_description => 'N',
);
my $prune_backups_format = {
'keep-last' => {
%prune_option,
description => 'Keep the last <N> backups.',
},
'keep-hourly' => {
%prune_option,
description => 'Keep backups for the last <N> different hours. If there is more' .
'than one backup for a single hour, only the latest one is kept.'
},
'keep-daily' => {
%prune_option,
description => 'Keep backups for the last <N> different days. If there is more' .
'than one backup for a single day, only the latest one is kept.'
},
'keep-weekly' => {
%prune_option,
description => 'Keep backups for the last <N> different weeks. If there is more' .
'than one backup for a single week, only the latest one is kept.'
},
'keep-monthly' => {
%prune_option,
description => 'Keep backups for the last <N> different months. If there is more' .
'than one backup for a single month, only the latest one is kept.'
},
'keep-yearly' => {
%prune_option,
description => 'Keep backups for the last <N> different years. If there is more' .
'than one backup for a single year, only the latest one is kept.'
},
};
PVE::JSONSchema::register_format('prune-backups', $prune_backups_format, \&validate_prune_backups);
sub validate_prune_backups {
my ($keep) = @_;
die "at least one keep-option must be set and positive\n"
if !grep { $_ } values %{$keep};
return $keep;
}
register_standard_option('prune-backups', {
description => "The retention options with shorter intervals are processed first " .
"with --keep-last being the very first one. Each option covers a " .
"specific period of time. We say that backups within this period " .
"are covered by this option. The next option does not take care " .
"of already covered backups and only considers older backups.",
optional => 1,
type => 'string',
format => 'prune-backups',
});
my $defaultData = {
propertyList => {
@ -68,6 +124,7 @@ my $defaultData = {
minimum => 0,
optional => 1,
},
'prune-backups' => get_standard_option('prune-backups'),
shared => {
description => "Mark storage as shared.",
type => 'boolean',