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.k...@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