From: Max Carrara <m.carrara@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [RFC pve-storage 35/36] plugin: zfspool: move helper `zfs_parse_zvol_list` to common module
Date: Wed, 17 Jul 2024 11:40:33 +0200 [thread overview]
Message-ID: <20240717094034.124857-36-m.carrara@proxmox.com> (raw)
In-Reply-To: <20240717094034.124857-1-m.carrara@proxmox.com>
Signed-off-by: Max Carrara <m.carrara@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
next prev parent reply other threads:[~2024-07-17 9:43 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-17 9:39 [pve-devel] [RFC pve-storage 00/36] Refactor / Cleanup of Storage Plugins Max Carrara
2024-07-17 9:39 ` [pve-devel] [RFC pve-storage 01/36] plugin: base: remove old fixme comments Max Carrara
2024-07-17 16:02 ` Thomas Lamprecht
2024-07-18 7:43 ` Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 02/36] plugin: btrfs: make plugin-specific helpers private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 03/36] plugin: cephfs: " Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 04/36] api: remove unused import of CIFS storage plugin Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 05/36] plugin: cifs: make plugin-specific helpers private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 06/36] api: remove unused import of LVM storage plugin Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 07/36] common: introduce common module Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 08/36] plugin: dir: move helper subs of directory plugin to common modules Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 09/36] plugin: lvm: move LVM helper subroutines into separate common module Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 10/36] api: replace usages of deprecated LVM helper subs with new ones Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 11/36] plugin: lvmthin: replace usages of deprecated LVM helpers " Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 12/36] plugin: lvmthin: move helper that lists thinpools to common LVM module Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 13/36] common: lvm: update code style Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 14/36] api: replace usages of deprecated LVM thin pool helper sub Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 15/36] plugin: btrfs: replace deprecated helpers from directory plugin Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 16/36] plugin: dir: factor storage methods into separate common subs Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 17/36] plugin: dir: factor path validity check into helper methods Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 18/36] plugin: btrfs: remove dependency on directory plugin Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 19/36] plugin: cifs: " Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 20/36] plugin: cephfs: " Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 21/36] plugin: nfs: " Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 22/36] plugin: btrfs: make helper methods private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 23/36] plugin: esxi: make helper subroutines private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 24/36] plugin: esxi: remove unused helper subroutine `query_vmdk_size` Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 25/36] plugin: esxi: make helper methods private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 26/36] plugin: gluster: make helper subroutines private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 27/36] plugin: iscsi-direct: make helper subroutine `iscsi_ls` private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 28/36] plugin: iscsi: factor helper functions into common module Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 29/36] plugin: iscsi: make helper subroutine `iscsi_session` private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 30/36] plugin: lvm: update definition of subroutine `check_tags` Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 31/36] plugin: lvmthin: update definition of subroutine `activate_lv` Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 32/36] plugin: nfs: make helper subroutines private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 33/36] plugin: rbd: update private sub signatures and make helpers private Max Carrara
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 34/36] common: zfs: introduce module for common ZFS helpers Max Carrara
2024-07-17 9:40 ` Max Carrara [this message]
2024-07-17 9:40 ` [pve-devel] [RFC pve-storage 36/36] plugin: zfspool: refactor method `zfs_request` into helper subroutine Max Carrara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240717094034.124857-36-m.carrara@proxmox.com \
--to=m.carrara@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox