From: Daniel Kral <d.kral@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH container v3 02/11] tests: add tests for expected behavior of alloc_disk wrapper
Date: Tue, 15 Apr 2025 15:50:36 +0200 [thread overview]
Message-ID: <20250415135045.255272-19-d.kral@proxmox.com> (raw)
In-Reply-To: <20250415135045.255272-1-d.kral@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 v2:
* added a content type (images) to the 'norootdirs' test storage
* destructure @result to $volid and $needs_chown
* simplify logic for $should_fail
src/test/Makefile | 5 +-
src/test/run_alloc_disk_tests.pl | 157 +++++++++++++++++++++++++++++++
2 files changed, 161 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..2af64e6
--- /dev/null
+++ b/src/test/run_alloc_disk_tests.pl
@@ -0,0 +1,157 @@
+#!/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 => {
+ content => {
+ images => 1,
+ },
+ 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 ($volid, $needs_chown) = eval {
+ PVE::LXC::alloc_disk(
+ $storage_config,
+ $test_vmid,
+ $case->{storage},
+ $case->{size_kb},
+ $test_root_uid,
+ $test_root_gid
+ )
+ };
+ if (my $err = $@) {
+ my $should_fail = exists($case->{should_fail}) ? $case->{should_fail} : 0;
+
+ if ($should_fail) {
+ pass("should fail: $case->{description}");
+ } else {
+ diag explain $err;
+ fail("should fail: $case->{description}");
+ }
+ } else {
+ is_deeply([$volid, $needs_chown], $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
next prev parent reply other threads:[~2025-04-15 13:52 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-15 13:50 [pve-devel] [PATCH storage/qemu-server/container v3 00/27] consistent assertions for volume's content types Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH storage v3 1/4] introduce helpers for content type assertions of storages and volumes Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH storage v3 2/4] tree-wide: make use of content type assertion helper Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH storage v3 3/4] vdisk_alloc: factor out optional parameters in options hash argument Daniel Kral
2025-05-05 14:51 ` Wolfgang Bumiller
2025-05-06 7:33 ` Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH storage v3 4/4] vdisk_alloc: add assertion for volume's content type Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 01/12] fix #5284: cli: importovf: assert content type support for target storage Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 02/12] api: remove unusable default storage parameter in check_storage_access Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 03/12] fix #5284: api: update-vm: assert content type support for cloudinit images Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 04/12] tree-wide: update vdisk_alloc optional arguments signature Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 05/12] tree-wide: update vdisk_alloc vtype argument signature Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 06/12] cfg2cmd: improve error message for invalid volume content type Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 07/12] api: {clone, move}_vm: use volume content type assertion helpers Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 08/12] api: {create, update}_vm: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 09/12] api: import{disk, ovf}: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 10/12] api: qmrestore: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 11/12] api: migrate_vm: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH qemu-server v3 12/12] tree-wide: add todos for breaking content type assertions Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 01/11] migration: prepare: factor out common read-only variables Daniel Kral
2025-04-15 13:50 ` Daniel Kral [this message]
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 03/11] alloc disk: fix content type check for ZFS storages Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 04/11] alloc_disk: factor out common arguments for call to vdisk_alloc Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 05/11] alloc_disk: simplify storage-specific logic for vdisk_alloc arguments Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 06/11] alloc_disk: update vdisk_alloc optional arguments signature Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 07/11] alloc_disk: use volume content type assertion helpers Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 08/11] api: create: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 09/11] migration: prepare: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 10/11] api: update_vm: " Daniel Kral
2025-04-15 13:50 ` [pve-devel] [PATCH container v3 11/11] mount: raw/iso: " Daniel Kral
2025-05-06 8:33 ` [pve-devel] [PATCH storage/qemu-server/container v3 00/27] consistent assertions for volume's content types Wolfgang Bumiller
2025-05-09 8:11 ` Fabian Grünbichler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250415135045.255272-19-d.kral@proxmox.com \
--to=d.kral@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal