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