Storage/Plugin: add get/update_volume_comment and implement for dir

and add the appropriate api call to set and get the comment
we need to bump APIVER for this and can bump APIAGE, since
we only use it at this new call that can work with the default
implementation

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak
2020-11-24 10:09:32 +01:00
committed by Thomas Lamprecht
parent 3369651885
commit e9991d2694
4 changed files with 123 additions and 2 deletions

View File

@ -285,6 +285,11 @@ __PACKAGE__->register_method ({
description => "Format identifier ('raw', 'qcow2', 'subvol', 'iso', 'tgz' ...)",
type => 'string',
},
notes => {
description => "Optional notes.",
optional => 1,
type => 'string',
}
},
},
code => sub {
@ -303,13 +308,67 @@ __PACKAGE__->register_method ({
my ($size, $format, $used, $parent) = PVE::Storage::volume_size_info($cfg, $volid);
die "volume_size_info on '$volid' failed\n" if !($format && $size);
# fixme: return more attributes?
return {
my $entry = {
path => $path,
size => $size,
used => $used,
format => $format,
};
# not all storages/types support notes, so ignore errors here
eval {
my $notes = PVE::Storage::get_volume_notes($cfg, $volid);
$entry->{notes} = $notes if defined($notes);
};
return $entry;
}});
__PACKAGE__->register_method ({
name => 'updateattributes',
path => '{volume}',
method => 'PUT',
description => "Update volume attributes",
permissions => {
description => "You need read access for the volume.",
user => 'all',
},
protected => 1,
proxyto => 'node',
parameters => {
additionalProperties => 0,
properties => {
node => get_standard_option('pve-node'),
storage => get_standard_option('pve-storage-id', { optional => 1 }),
volume => {
description => "Volume identifier",
type => 'string',
},
notes => {
description => "The new notes.",
type => 'string',
optional => 1,
},
},
},
returns => { type => 'null' },
code => sub {
my ($param) = @_;
my $rpcenv = PVE::RPCEnvironment::get();
my $authuser = $rpcenv->get_user();
my ($volid, $storeid) = &$real_volume_id($param->{storage}, $param->{volume});
my $cfg = PVE::Storage::config();
PVE::Storage::check_volume_access($rpcenv, $authuser, $cfg, undef, $volid);
if (my $notes = $param->{notes}) {
PVE::Storage::update_volume_notes($cfg, $volid, $notes);
}
return undef;
}});
__PACKAGE__->register_method ({

View File

@ -217,6 +217,26 @@ sub file_size_info {
return PVE::Storage::Plugin::file_size_info($filename, $timeout);
}
sub get_volume_notes {
my ($cfg, $volid, $timeout) = @_;
my ($storeid, $volname) = parse_volume_id($volid);
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
return $plugin->get_volume_notes($scfg, $storeid, $volname, $timeout);
}
sub update_volume_notes {
my ($cfg, $volid, $notes, $timeout) = @_;
my ($storeid, $volname) = parse_volume_id($volid);
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
$plugin->update_volume_notes($scfg, $storeid, $volname, $notes, $timeout);
}
sub volume_size_info {
my ($cfg, $volid, $timeout) = @_;

View File

@ -87,6 +87,36 @@ sub parse_is_mountpoint {
return $is_mp; # contains a path
}
sub get_volume_notes {
my ($class, $scfg, $storeid, $volname, $timeout) = @_;
my $path = $class->filesystem_path($scfg, $volname);
$path .= $class->SUPER::NOTES_EXT;
my $notes = "";
if (-f $path) {
$notes = PVE::Tools::file_get_contents($path);
}
return $notes;
}
sub update_volume_notes {
my ($class, $scfg, $storeid, $volname, $notes, $timeout) = @_;
my $path = $class->filesystem_path($scfg, $volname);
my ($vtype, undef, undef, undef, undef, undef, undef) = $class->parse_volname($volname);
if ($vtype ne 'backup') {
die "only backups can have notes\n";
}
$path .= $class->SUPER::NOTES_EXT;
PVE::Tools::file_set_contents($path, $notes);
return undef;
}
sub status {
my ($class, $storeid, $scfg, $cache) = @_;

View File

@ -826,6 +826,18 @@ sub file_size_info {
return wantarray ? ($size, $format, $used, $parent, $st->ctime) : $size;
}
sub get_volume_notes {
my ($class, $scfg, $storeid, $volname, $timeout) = @_;
die "volume notes are not supported for $class";
}
sub update_volume_notes {
my ($class, $scfg, $storeid, $volname, $notes, $timeout) = @_;
die "volume notes are not supported for $class";
}
sub volume_size_info {
my ($class, $scfg, $storeid, $volname, $timeout) = @_;
my $path = $class->filesystem_path($scfg, $volname);