From: Dominik Csapak Date: Tue, 24 Nov 2020 09:09:32 +0000 (+0100) Subject: Storage/Plugin: add get/update_volume_comment and implement for dir X-Git-Url: https://git.proxmox.com/?p=pve-storage.git;a=commitdiff_plain;h=e9991d2694811251397f625a4626d6049c278798 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 --- diff --git a/PVE/API2/Storage/Content.pm b/PVE/API2/Storage/Content.pm index 7b81171..eac6343 100644 --- a/PVE/API2/Storage/Content.pm +++ b/PVE/API2/Storage/Content.pm @@ -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 ({ diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 8d904d7..aded60e 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -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) = @_; diff --git a/PVE/Storage/DirPlugin.pm b/PVE/Storage/DirPlugin.pm index 3c81d24..b36eec5 100644 --- a/PVE/Storage/DirPlugin.pm +++ b/PVE/Storage/DirPlugin.pm @@ -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) = @_; diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 1c86666..57c58a9 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -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);