From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E29871FF2C8 for ; Wed, 17 Jul 2024 11:43:49 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4245238C4C; Wed, 17 Jul 2024 11:43:36 +0200 (CEST) From: Max Carrara To: pve-devel@lists.proxmox.com Date: Wed, 17 Jul 2024 11:40:33 +0200 Message-Id: <20240717094034.124857-36-m.carrara@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240717094034.124857-1-m.carrara@proxmox.com> References: <20240717094034.124857-1-m.carrara@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.030 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [RFC pve-storage 35/36] plugin: zfspool: move helper `zfs_parse_zvol_list` to common module 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: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" Signed-off-by: Max Carrara --- src/PVE/Storage/Common/ZFS.pm | 93 +++++++++++++++++++++++++++++++- src/PVE/Storage/ZFSPoolPlugin.pm | 45 +++------------- 2 files changed, 99 insertions(+), 39 deletions(-) diff --git a/src/PVE/Storage/Common/ZFS.pm b/src/PVE/Storage/Common/ZFS.pm index 8b0969c..21b28d9 100644 --- a/src/PVE/Storage/Common/ZFS.pm +++ b/src/PVE/Storage/Common/ZFS.pm @@ -5,7 +5,9 @@ use warnings; use parent qw(Exporter); -our @EXPORT_OK = qw(); +our @EXPORT_OK = qw( + zfs_parse_zvol_list +); =pod @@ -17,5 +19,94 @@ PVE::Storage::Common::ZFS - Shared ZFS utilities and command line wrappers =cut +=pod + +=head3 zfs_parse_zvol_list + + $zvol_list = zfs_parse_zvol_list($text, $pool) + +Parses ZVOLs from a C command output for a given C<$pool> and returns +them as a list of hashes. + +C<$text> must contain the output of the following command, where CPOOLE> +is expected to be the same as the provided C<$pool>: + + zfs list -o name,volsize,origin,type,refquota -t volume,filesystem -d1 -Hp + +C<$pool> should refer to the actual pool / dataset that contains ZVOLs. Usually +this is CPOOLNAMEE/vm-store>. + +The returned list has the following structure: + + ( + { + name => "pool/vm-store/vm-9000-disk-0", + size => 68719476736, # size in bytes + origin => "...", # optional + format => "raw", + vmid => 9000, + }, + { + name => "pool/vm-store/vm-9000-disk-1", + size => 68719476736, # size in bytes + origin => "...", # optional + format => "raw", + vmid => 9000, + }, + { + name => "pool/vm-store/vm-9000-disk-2", + size => 137438953472, # size in bytes + origin => "...", # optional + format => "raw", + vmid => 9000, + }, + ... + ) + +=cut + +sub zfs_parse_zvol_list : prototype($$) { + my ($text, $pool) = @_; + + my $list = (); + + return $list if !$text; + + my @lines = split /\n/, $text; + foreach my $line (@lines) { + my ($dataset, $size, $origin, $type, $refquota) = split(/\s+/, $line); + next if !($type eq 'volume' || $type eq 'filesystem'); + + my $zvol = {}; + my @parts = split /\//, $dataset; + next if scalar(@parts) < 2; # we need pool/name + my $name = pop @parts; + my $parsed_pool = join('/', @parts); + next if $parsed_pool ne $pool; + + next unless $name =~ m!^(vm|base|subvol|basevol)-(\d+)-(\S+)$!; + $zvol->{owner} = $2; + + $zvol->{name} = $name; + if ($type eq 'filesystem') { + if ($refquota eq 'none') { + $zvol->{size} = 0; + } else { + $zvol->{size} = $refquota + 0; + } + $zvol->{format} = 'subvol'; + } else { + $zvol->{size} = $size + 0; + $zvol->{format} = 'raw'; + } + if ($origin !~ /^-$/) { + $zvol->{origin} = $origin; + } + push @$list, $zvol; + } + + return $list; +} + 1; diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm b/src/PVE/Storage/ZFSPoolPlugin.pm index 3669fe1..fdfedca 100644 --- a/src/PVE/Storage/ZFSPoolPlugin.pm +++ b/src/PVE/Storage/ZFSPoolPlugin.pm @@ -9,6 +9,8 @@ use POSIX; use PVE::ProcFSTools; use PVE::RPCEnvironment; +use PVE::Storage::Common qw(get_deprecation_warning); +use PVE::Storage::Common::ZFS; use PVE::Storage::Plugin; use PVE::Tools qw(run_command); @@ -60,44 +62,11 @@ sub options { sub zfs_parse_zvol_list { my ($text, $pool) = @_; - my $list = (); - - return $list if !$text; - - my @lines = split /\n/, $text; - foreach my $line (@lines) { - my ($dataset, $size, $origin, $type, $refquota) = split(/\s+/, $line); - next if !($type eq 'volume' || $type eq 'filesystem'); - - my $zvol = {}; - my @parts = split /\//, $dataset; - next if scalar(@parts) < 2; # we need pool/name - my $name = pop @parts; - my $parsed_pool = join('/', @parts); - next if $parsed_pool ne $pool; - - next unless $name =~ m!^(vm|base|subvol|basevol)-(\d+)-(\S+)$!; - $zvol->{owner} = $2; - - $zvol->{name} = $name; - if ($type eq 'filesystem') { - if ($refquota eq 'none') { - $zvol->{size} = 0; - } else { - $zvol->{size} = $refquota + 0; - } - $zvol->{format} = 'subvol'; - } else { - $zvol->{size} = $size + 0; - $zvol->{format} = 'raw'; - } - if ($origin !~ /^-$/) { - $zvol->{origin} = $origin; - } - push @$list, $zvol; - } + warn get_deprecation_warning( + "PVE::Storage::Common::ZFS::zfs_parse_zvol_list" + ); - return $list; + return PVE::Storage::Common::ZFS::zfs_parse_zvol_list($text, $pool); } sub parse_volname { @@ -383,7 +352,7 @@ sub zfs_list_zvol { ); # It's still required to have zfs_parse_zvol_list filter by pool, because -d1 lists # $scfg->{pool} too and while unlikely, it could be named to be mistaken for a volume. - my $zvols = zfs_parse_zvol_list($text, $scfg->{pool}); + my $zvols = PVE::Storage::Common::ZFS::zfs_parse_zvol_list($text, $scfg->{pool}); return {} if !$zvols; my $list = {}; -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel