Introduce prune-backups property for directory-based storages
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
committed by
Thomas Lamprecht
parent
0dffc7ba55
commit
3353698f45
@ -134,6 +134,7 @@ sub options {
|
|||||||
nodes => { optional => 1 },
|
nodes => { optional => 1 },
|
||||||
disable => { optional => 1 },
|
disable => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
content => { optional => 1 },
|
content => { optional => 1 },
|
||||||
format => { optional => 1 },
|
format => { optional => 1 },
|
||||||
username => { optional => 1 },
|
username => { optional => 1 },
|
||||||
|
|||||||
@ -150,6 +150,7 @@ sub options {
|
|||||||
fuse => { optional => 1 },
|
fuse => { optional => 1 },
|
||||||
bwlimit => { optional => 1 },
|
bwlimit => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -49,10 +49,11 @@ sub properties {
|
|||||||
sub options {
|
sub options {
|
||||||
return {
|
return {
|
||||||
path => { fixed => 1 },
|
path => { fixed => 1 },
|
||||||
nodes => { optional => 1 },
|
nodes => { optional => 1 },
|
||||||
shared => { optional => 1 },
|
shared => { optional => 1 },
|
||||||
disable => { optional => 1 },
|
disable => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
content => { optional => 1 },
|
content => { optional => 1 },
|
||||||
format => { optional => 1 },
|
format => { optional => 1 },
|
||||||
mkdir => { optional => 1 },
|
mkdir => { optional => 1 },
|
||||||
|
|||||||
@ -129,9 +129,10 @@ sub options {
|
|||||||
server2 => { optional => 1 },
|
server2 => { optional => 1 },
|
||||||
volume => { fixed => 1 },
|
volume => { fixed => 1 },
|
||||||
transport => { optional => 1 },
|
transport => { optional => 1 },
|
||||||
nodes => { optional => 1 },
|
nodes => { optional => 1 },
|
||||||
disable => { optional => 1 },
|
disable => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
content => { optional => 1 },
|
content => { optional => 1 },
|
||||||
format => { optional => 1 },
|
format => { optional => 1 },
|
||||||
mkdir => { optional => 1 },
|
mkdir => { optional => 1 },
|
||||||
|
|||||||
@ -79,9 +79,10 @@ sub options {
|
|||||||
path => { fixed => 1 },
|
path => { fixed => 1 },
|
||||||
server => { fixed => 1 },
|
server => { fixed => 1 },
|
||||||
export => { fixed => 1 },
|
export => { fixed => 1 },
|
||||||
nodes => { optional => 1 },
|
nodes => { optional => 1 },
|
||||||
disable => { optional => 1 },
|
disable => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
options => { optional => 1 },
|
options => { optional => 1 },
|
||||||
content => { optional => 1 },
|
content => { optional => 1 },
|
||||||
format => { optional => 1 },
|
format => { optional => 1 },
|
||||||
|
|||||||
@ -55,6 +55,7 @@ sub options {
|
|||||||
password => { optional => 1 },
|
password => { optional => 1 },
|
||||||
'encryption-key' => { optional => 1 },
|
'encryption-key' => { optional => 1 },
|
||||||
maxfiles => { optional => 1 },
|
maxfiles => { optional => 1 },
|
||||||
|
'prune-backups' => { optional => 1 },
|
||||||
fingerprint => { optional => 1 },
|
fingerprint => { optional => 1 },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ use File::Basename;
|
|||||||
use File::stat qw();
|
use File::stat qw();
|
||||||
|
|
||||||
use PVE::Tools qw(run_command);
|
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 PVE::Cluster qw(cfs_register_file);
|
||||||
|
|
||||||
use JSON;
|
use JSON;
|
||||||
@ -43,6 +43,62 @@ cfs_register_file ('storage.cfg',
|
|||||||
sub { __PACKAGE__->parse_config(@_); },
|
sub { __PACKAGE__->parse_config(@_); },
|
||||||
sub { __PACKAGE__->write_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 = {
|
my $defaultData = {
|
||||||
propertyList => {
|
propertyList => {
|
||||||
@ -68,6 +124,7 @@ my $defaultData = {
|
|||||||
minimum => 0,
|
minimum => 0,
|
||||||
optional => 1,
|
optional => 1,
|
||||||
},
|
},
|
||||||
|
'prune-backups' => get_standard_option('prune-backups'),
|
||||||
shared => {
|
shared => {
|
||||||
description => "Mark storage as shared.",
|
description => "Mark storage as shared.",
|
||||||
type => 'boolean',
|
type => 'boolean',
|
||||||
|
|||||||
Reference in New Issue
Block a user