Signed-off-by: Max Carrara <m.carr...@proxmox.com>
---
 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<zfs list> 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 
C<E<lt>POOLE<gt>>
+is expected to be the same as the provided C<$pool>:
+
+    zfs list -o name,volsize,origin,type,refquota -t volume,filesystem -d1 -Hp 
<POOL>
+
+C<$pool> should refer to the actual pool / dataset that contains ZVOLs. Usually
+this is C<E<lt>POOLNAMEE<gt>/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

Reply via email to