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);