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 5D6A71FF38C for ; Thu, 16 May 2024 12:29:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 99C6034F51; Thu, 16 May 2024 12:29:21 +0200 (CEST) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Thu, 16 May 2024 12:28:33 +0200 Message-ID: <20240516102837.422278-2-c.heiss@proxmox.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240516102837.422278-1-c.heiss@proxmox.com> References: <20240516102837.422278-1-c.heiss@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.006 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] [PATCH installer 1/3] low-level: add zfs module for retrieving importable zpool info 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: Christoph Heiss --- Proxmox/Makefile | 1 + Proxmox/Sys/ZFS.pm | 43 ++++++++++++++++++++++++++++++++++ test/Makefile | 6 +++++ test/zfs-get-pool-list.pl | 49 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 Proxmox/Sys/ZFS.pm create mode 100755 test/zfs-get-pool-list.pl diff --git a/Proxmox/Makefile b/Proxmox/Makefile index 9561d9b..035626b 100644 --- a/Proxmox/Makefile +++ b/Proxmox/Makefile @@ -17,6 +17,7 @@ PERL_MODULES=\ Sys/File.pm \ Sys/Net.pm \ Sys/Udev.pm \ + Sys/ZFS.pm \ UI.pm \ UI/Base.pm \ UI/Gtk3.pm \ diff --git a/Proxmox/Sys/ZFS.pm b/Proxmox/Sys/ZFS.pm new file mode 100644 index 0000000..4c732ca --- /dev/null +++ b/Proxmox/Sys/ZFS.pm @@ -0,0 +1,43 @@ +package Proxmox::Sys::ZFS; + +use strict; +use warnings; + +use Proxmox::Sys::Command qw(run_command); + +use base qw(Exporter); +our @EXPORT_OK = qw(get_exported_pools); + +my sub parse_pool_list { + my ($fh) = @_; + + my @pools; + my $pool = {}; # last found pool in output + + while (my $line = <$fh>) { + if ($line =~ /^\s+pool: (.+)$/) { + push @pools, $pool if %$pool; + $pool = { name => $1 }; + next; + } + + next if !%$pool; + + if ($line =~ /^\s*(id|state|status|action): (.+)$/) { + chomp($pool->{$1} = $2); + next; + } + } + + push @pools, $pool if %$pool; + return \@pools; +} + +sub get_exported_pools { + my $raw = run_command(['zpool', 'import']); + open (my $fh, '<', \$raw) or die 'failed to open in-memory stream'; + + return parse_pool_list($fh); +} + +1; diff --git a/test/Makefile b/test/Makefile index 99bf14e..2d9decc 100644 --- a/test/Makefile +++ b/test/Makefile @@ -2,6 +2,7 @@ all: export PERLLIB=.. +# test-zfs-get-pool-list is not run by default, due to requiring root access .PHONY: check check: test-zfs-arc-max test-run-command test-parse-fqdn test-ui2-stdio @@ -9,6 +10,7 @@ check: test-zfs-arc-max test-run-command test-parse-fqdn test-ui2-stdio test-zfs-arc-max: ./zfs-arc-max.pl +.PHONY: test-run-command test-run-command: ./run-command.pl @@ -19,3 +21,7 @@ test-parse-fqdn: .PHONY: test-ui2-stdio test-ui2-stdio: ./ui2-stdio.pl + +.PHONY: test-zfs-get-pool-list +test-zfs-get-pool-list: + ./zfs-get-pool-list.pl diff --git a/test/zfs-get-pool-list.pl b/test/zfs-get-pool-list.pl new file mode 100755 index 0000000..072da2f --- /dev/null +++ b/test/zfs-get-pool-list.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use File::Temp; +use Test::More tests => 6; + +use Proxmox::Sys::Command qw(syscmd run_command); +use Proxmox::Sys::ZFS; +use Proxmox::UI; + +my $log_file = File::Temp->new(); +Proxmox::Log::init($log_file->filename); + +Proxmox::UI::init_stdio(); + +our $POOL_PREFIX = 'pve-installer'; +my $pools = { 'test-pool1' => {}, 'test-pool2' => {} }; + +foreach (keys %$pools) { + my $f = File::Temp->new(); + print "$_: $f\n"; + + syscmd("truncate -s 1G $f"); + my $dev = run_command("losetup --find --show $f"); + + syscmd("zpool create $POOL_PREFIX-$_ $dev"); + syscmd("zpool export $POOL_PREFIX-$_"); + + $pools->{$_} = { + file => $f, + dev => $dev, + }; +} + +my $exported = Proxmox::Sys::ZFS::get_exported_pools(); +while (my ($name, $info) = each %$pools) { + my ($p) = grep { $_->{name} eq "$POOL_PREFIX-$name" } @$exported; + ok(defined($p), "pool $name was found"); + is($p->{state}, 'ONLINE', "pool $name is online"); + is($p->{action}, 'The pool can be imported using its name or numeric identifier.', + "pool $name can be imported"); +} + +keys %$pools; +while (my ($name, $info) = each %$pools) { + syscmd("losetup --detach $info->{dev}"); +} -- 2.44.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel