From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 6848B626AB; Tue, 24 Nov 2020 10:09:40 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6677888DC; Tue, 24 Nov 2020 10:09:40 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 0F6ED8898; Tue, 24 Nov 2020 10:09:38 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id C5C2143F07; Tue, 24 Nov 2020 10:09:37 +0100 (CET) From: Dominik Csapak To: pve-devel@lists.proxmox.com, pbs-devel@lists.proxmox.com Date: Tue, 24 Nov 2020 10:09:32 +0100 Message-Id: <20201124090936.21810-5-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201124090936.21810-1-d.csapak@proxmox.com> References: <20201124090936.21810-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.323 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [dirplugin.pm, plugin.pm, content.pm, storage.pm] Subject: [pve-devel] [PATCH storage v2 3/4] Storage/Plugin: add get/update_volume_comment and implement for dir X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Nov 2020 09:09:40 -0000 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 --- 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