[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