[pve-devel] [PATCH container v2 02/11] tests: add tests for expected behavior of alloc_disk wrapper

Daniel Kral d.kral at proxmox.com
Tue Feb 11 17:08:16 CET 2025


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 at 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





More information about the pve-devel mailing list