[pve-devel] [PATCH storage v2 3/4] Storage/Plugin: add get/update_volume_comment and implement for dir
Dominik Csapak
d.csapak at proxmox.com
Tue Nov 24 10:09:32 CET 2020
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 at proxmox.com>
---
PVE/API2/Storage/Content.pm | 63 +++++++++++++++++++++++++++++++++++--
PVE/Storage.pm | 20 ++++++++++++
PVE/Storage/DirPlugin.pm | 30 ++++++++++++++++++
PVE/Storage/Plugin.pm | 12 +++++++
4 files changed, 123 insertions(+), 2 deletions(-)
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);
--
2.20.1
More information about the pve-devel
mailing list