From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 9E89C1FF15E for <inbox@lore.proxmox.com>; Tue, 11 Feb 2025 17:17:21 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 2C3804274; Tue, 11 Feb 2025 17:17:13 +0100 (CET) From: Daniel Kral <d.kral@proxmox.com> To: pve-devel@lists.proxmox.com Date: Tue, 11 Feb 2025 17:08:16 +0100 Message-Id: <20250211160825.254167-23-d.kral@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250211160825.254167-1-d.kral@proxmox.com> References: <20250211160825.254167-1-d.kral@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.008 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 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. 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 container v2 02/11] tests: add tests for expected behavior of alloc_disk wrapper X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> Adds test cases for the alloc_disk wrapper subroutine to ensure that: - zero-sized volumes are allocated as subvols on path-based storages - non-zero-sized volumes are allocated as raw on path-based storages - volumes are allocated as raw on btrfs storages without quotas - volumes are allocated as subvols on btrfs storages with quotas - volumes are allocated as subvols on zfs storages - volumes cannot be allocated on storages that do not support rootdir These test cases should allow to catch regressions in following changes to the alloc_disk wrapper. Signed-off-by: Daniel Kral <d.kral@proxmox.com> --- changes since v1: - new! src/test/Makefile | 5 +- src/test/run_alloc_disk_tests.pl | 149 +++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100755 src/test/run_alloc_disk_tests.pl diff --git a/src/test/Makefile b/src/test/Makefile index 91ae6ff..729f981 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -2,7 +2,7 @@ RUN_USERNS := lxc-usernsexec -m "u:0:`id -u`:1" -m "g:0:`id -g`:1" -- all: test -test: test_setup test_snapshot test_bindmount test_idmap +test: test_setup test_snapshot test_bindmount test_idmap test_alloc_disk test_setup: run_setup_tests.pl if test -e /run/lock/sbuild; then \ @@ -24,5 +24,8 @@ test_bindmount: bindmount_test.pl test_idmap: run_idmap_tests.pl ./run_idmap_tests.pl +test_alloc_disk: run_alloc_disk_tests.pl + ./run_alloc_disk_tests.pl + clean: rm -rf tmprootfs diff --git a/src/test/run_alloc_disk_tests.pl b/src/test/run_alloc_disk_tests.pl new file mode 100755 index 0000000..b13f5a2 --- /dev/null +++ b/src/test/run_alloc_disk_tests.pl @@ -0,0 +1,149 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use lib qw(..); + +use PVE::Tools; + +use Test::More; +use Test::MockModule; + +use PVE::LXC; + +my $test_vmid = 100; +my $test_root_uid = 100000; +my $test_root_gid = 100000; + +my $storage_config = { + ids => { + local => { + content => { + rootdir => 1, + }, + path => "/var/lib/vz", + type => "dir", + shared => 0, + }, + norootdirs => { + path => '/var/lib/vz', + type => 'dir', + }, + btrfsstore => { + content => { + rootdir => 1, + }, + path => '/butter/bread', + type => 'btrfs', + }, + btrfsquotas => { + content => { + rootdir => 1, + }, + path => '/butter/bread', + type => 'btrfs', + quotas => 1, + }, + zfspool0 => { + type => 'zfspool', + content => { + rootdir => 1, + }, + pool => 'rpool0', + mountpoint => '/zfspool0', + }, + }, +}; + +my $storage_module = Test::MockModule->new("PVE::Storage"); +$storage_module->redefine( + vdisk_alloc => sub { + my ($storecfg, $storage, $vmid, $fmt, $name, $size_kb) = @_; + + $fmt //= ''; + my $prefix = ($fmt eq 'subvol') ? 'subvol' : 'vm'; + + return "$storage:$prefix-$vmid-disk-0"; + }, +); + +my $format_disk_called = 0; + +my $lxc_module = Test::MockModule->new("PVE::LXC"); +$lxc_module->redefine( + format_disk => sub { + $format_disk_called = 1; + }, +); + +my $tests = [ + { + description => 'allocate zero-sized volume on path-based storage', + storage => 'local', + size_kb => 0, + result => ["local:subvol-$test_vmid-disk-0", 1], + }, + { + description => 'allocate non-zero-sized volume on path-based storage', + should_format_disk => 1, + storage => 'local', + size_kb => 1024 * 1024, + result => ["local:vm-$test_vmid-disk-0", 0], + }, + { + description => 'allocate volume on btrfs with quotas disabled', + should_format_disk => 1, + storage => 'btrfsstore', + size_kb => 1024 * 1024, + result => ["btrfsstore:vm-$test_vmid-disk-0", 0], + }, + { + description => 'allocate volume on btrfs with quotas enabled', + storage => 'btrfsquotas', + size_kb => 1024 * 1024, + result => ["btrfsquotas:subvol-$test_vmid-disk-0", 1], + }, + { + description => 'allocate volume on zfspool', + storage => 'zfspool0', + size_kb => 1024 * 1024, + result => ["zfspool0:subvol-$test_vmid-disk-0", 1], + }, + { + description => 'allocate volume on storage without rootdir content type support', + should_fail => 1, + storage => 'norootdirs', + size_kb => 1024 * 1024, + }, +]; + +# multiply by 2 because of format_disk test +plan(tests => 2 * scalar($tests->@*)); + +for my $case ($tests->@*) { + my $should_format_disk = exists($case->{should_format_disk}) ? $case->{should_format_disk} : 0; + $format_disk_called = 0; + + my @result = eval { + PVE::LXC::alloc_disk( + $storage_config, + $test_vmid, + $case->{storage}, + $case->{size_kb}, + $test_root_uid, + $test_root_gid + ) + }; + + if ($@) { + my $should_fail = exists($case->{should_fail}) ? $case->{should_fail} : 0; + is(defined($@), $should_fail, "should fail: $case->{description}") || diag explain $@; + } else { + is_deeply(\@result, $case->{result}, $case->{description}); + } + + is($format_disk_called, $should_format_disk, "should format_disk: $case->{description}"); +} + +done_testing(); -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel