]>
git.proxmox.com Git - pve-storage.git/blob - test/list_volumes_test.pm
d155cb9f758df36e21f27dd3d74542e6a7c99bf1
1 package PVE
::Storage
::TestListVolumes
;
10 use PVE
::Tools
qw(run_command);
17 use File
::Path
qw(make_path remove_tree);
20 use Storable
qw(dclone);
22 use constant DEFAULT_SIZE
=> 131072; # 128 kiB
23 use constant DEFAULT_USED
=> 262144; # 256 kiB
24 use constant DEFAULT_CTIME
=> 1234567890;
26 # get_vmlist() return values
63 my $storage_dir = File
::Temp-
>newdir();
67 'path' => $storage_dir,
79 # The test cases are comprised of an arry of hashes with the following keys:
80 # description => displayed on error by Test::More
81 # vmid => used for image matches by list_volume
82 # files => array of files for qemu-img to create
83 # expected => returned result hash
84 # (content, ctime, format, parent, size, used, vimd, volid)
87 description
=> 'VMID: 16110, VM, qcow2, backup, snippets',
90 "$storage_dir/images/16110/vm-16110-disk-0.qcow2",
91 "$storage_dir/images/16110/vm-16110-disk-1.raw",
92 "$storage_dir/images/16110/vm-16110-disk-2.vmdk",
93 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz",
94 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_45.vma.lzo",
95 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_13_55.vma",
96 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_13_55.vma.zst",
97 "$storage_dir/snippets/userconfig.yaml",
98 "$storage_dir/snippets/hookscript.pl",
102 'content' => 'images',
103 'ctime' => DEFAULT_CTIME
,
106 'size' => DEFAULT_SIZE
,
107 'used' => DEFAULT_USED
,
109 'volid' => 'local:16110/vm-16110-disk-0.qcow2',
112 'content' => 'images',
113 'ctime' => DEFAULT_CTIME
,
116 'size' => DEFAULT_SIZE
,
117 'used' => DEFAULT_USED
,
119 'volid' => 'local:16110/vm-16110-disk-1.raw',
122 'content' => 'images',
123 'ctime' => DEFAULT_CTIME
,
126 'size' => DEFAULT_SIZE
,
127 'used' => DEFAULT_USED
,
129 'volid' => 'local:16110/vm-16110-disk-2.vmdk',
132 'content' => 'backup',
133 'ctime' => 1585602700,
134 'format' => 'vma.gz',
135 'size' => DEFAULT_SIZE
,
138 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz',
141 'content' => 'backup',
142 'ctime' => 1585602765,
143 'format' => 'vma.lzo',
144 'size' => DEFAULT_SIZE
,
147 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_12_45.vma.lzo',
150 'content' => 'backup',
151 'ctime' => 1585602835,
153 'size' => DEFAULT_SIZE
,
156 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_13_55.vma',
159 'content' => 'backup',
160 'ctime' => 1585602835,
161 'format' => 'vma.zst',
162 'size' => DEFAULT_SIZE
,
165 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_13_55.vma.zst',
168 'content' => 'snippets',
169 'ctime' => DEFAULT_CTIME
,
170 'format' => 'snippet',
171 'size' => DEFAULT_SIZE
,
172 'volid' => 'local:snippets/hookscript.pl',
175 'content' => 'snippets',
176 'ctime' => DEFAULT_CTIME
,
177 'format' => 'snippet',
178 'size' => DEFAULT_SIZE
,
179 'volid' => 'local:snippets/userconfig.yaml',
184 description
=> 'VMID: 16112, lxc, raw, backup',
187 "$storage_dir/images/16112/vm-16112-disk-0.raw",
188 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo",
189 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz",
190 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_49_30.tar.zst",
191 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_59_30.tgz",
195 'content' => 'rootdir',
196 'ctime' => DEFAULT_CTIME
,
199 'size' => DEFAULT_SIZE
,
200 'used' => DEFAULT_USED
,
202 'volid' => 'local:16112/vm-16112-disk-0.raw',
205 'content' => 'backup',
206 'ctime' => 1585604370,
207 'format' => 'tar.lzo',
208 'size' => DEFAULT_SIZE
,
211 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo',
214 'content' => 'backup',
215 'ctime' => 1585604970,
216 'format' => 'tar.gz',
217 'size' => DEFAULT_SIZE
,
220 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz',
223 'content' => 'backup',
224 'ctime' => 1585604970,
225 'format' => 'tar.zst',
226 'size' => DEFAULT_SIZE
,
229 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_49_30.tar.zst',
232 'content' => 'backup',
233 'ctime' => 1585605570,
235 'size' => DEFAULT_SIZE
,
238 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_59_30.tgz',
243 description
=> 'VMID: 16114, VM, qcow2, linked clone',
246 "$storage_dir/images/16114/vm-16114-disk-0.qcow2",
247 "$storage_dir/images/16114/vm-16114-disk-1.qcow2",
250 "../9004/base-9004-disk-0.qcow2",
251 "../9004/base-9004-disk-1.qcow2",
255 'content' => 'images',
256 'ctime' => DEFAULT_CTIME
,
258 'parent' => '../9004/base-9004-disk-0.qcow2',
259 'size' => DEFAULT_SIZE
,
260 'used' => DEFAULT_USED
,
262 'volid' => 'local:9004/base-9004-disk-0.qcow2/16114/vm-16114-disk-0.qcow2',
265 'content' => 'images',
266 'ctime' => DEFAULT_CTIME
,
268 'parent' => '../9004/base-9004-disk-1.qcow2',
269 'size' => DEFAULT_SIZE
,
270 'used' => DEFAULT_USED
,
272 'volid' => 'local:9004/base-9004-disk-1.qcow2/16114/vm-16114-disk-1.qcow2',
277 description
=> 'VMID: 9004, VM, template, qcow2',
280 "$storage_dir/images/9004/base-9004-disk-0.qcow2",
281 "$storage_dir/images/9004/base-9004-disk-1.qcow2",
285 'content' => 'images',
286 'ctime' => DEFAULT_CTIME
,
289 'size' => DEFAULT_SIZE
,
290 'used' => DEFAULT_USED
,
292 'volid' => 'local:9004/base-9004-disk-0.qcow2',
295 'content' => 'images',
296 'ctime' => DEFAULT_CTIME
,
299 'size' => DEFAULT_SIZE
,
300 'used' => DEFAULT_USED
,
302 'volid' => 'local:9004/base-9004-disk-1.qcow2',
307 description
=> 'VMID: none, templates, snippets, backup',
310 "$storage_dir/dump/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz",
311 "$storage_dir/dump/vzdump-lxc-19254-2019_01_21-19_29_19.tar",
312 "$storage_dir/template/iso/archlinux-2020.02.01-x86_64.iso",
313 "$storage_dir/template/iso/debian-8.11.1-amd64-DVD-1.iso",
314 "$storage_dir/template/iso/debian-9.12.0-amd64-netinst.iso",
315 "$storage_dir/template/iso/proxmox-ve_6.1-1.iso",
316 "$storage_dir/template/cache/archlinux-base_20190924-1_amd64.tar.gz",
317 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz",
318 "$storage_dir/template/cache/alpine-3.10-default_20190626_amd64.tar.xz",
319 "$storage_dir/snippets/userconfig.yaml",
320 "$storage_dir/snippets/hookscript.pl",
321 "$storage_dir/private/1234/", # fileparse needs / at the end
322 "$storage_dir/private/1234/subvol-1234-disk-0.subvol/", # fileparse needs / at the end
326 'content' => 'vztmpl',
327 'ctime' => DEFAULT_CTIME
,
329 'size' => DEFAULT_SIZE
,
330 'volid' => 'local:vztmpl/alpine-3.10-default_20190626_amd64.tar.xz',
333 'content' => 'vztmpl',
334 'ctime' => DEFAULT_CTIME
,
336 'size' => DEFAULT_SIZE
,
337 'volid' => 'local:vztmpl/archlinux-base_20190924-1_amd64.tar.gz',
340 'content' => 'vztmpl',
341 'ctime' => DEFAULT_CTIME
,
343 'size' => DEFAULT_SIZE
,
344 'volid' => 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz',
348 'ctime' => DEFAULT_CTIME
,
350 'size' => DEFAULT_SIZE
,
351 'volid' => 'local:iso/archlinux-2020.02.01-x86_64.iso',
355 'ctime' => DEFAULT_CTIME
,
357 'size' => DEFAULT_SIZE
,
358 'volid' => 'local:iso/debian-8.11.1-amd64-DVD-1.iso',
362 'ctime' => DEFAULT_CTIME
,
364 'size' => DEFAULT_SIZE
,
365 'volid' => 'local:iso/debian-9.12.0-amd64-netinst.iso',
369 'ctime' => DEFAULT_CTIME
,
371 'size' => DEFAULT_SIZE
,
372 'volid' => 'local:iso/proxmox-ve_6.1-1.iso',
375 'content' => 'backup',
376 'ctime' => 1580759863,
377 'format' => 'tar.gz',
378 'size' => DEFAULT_SIZE
,
381 'volid' => 'local:backup/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz',
384 'content' => 'backup',
385 'ctime' => 1548098959,
387 'size' => DEFAULT_SIZE
,
390 'volid' => 'local:backup/vzdump-lxc-19254-2019_01_21-19_29_19.tar',
393 'content' => 'snippets',
394 'ctime' => DEFAULT_CTIME
,
395 'format' => 'snippet',
396 'size' => DEFAULT_SIZE
,
397 'volid' => 'local:snippets/hookscript.pl',
400 'content' => 'snippets',
401 'ctime' => DEFAULT_CTIME
,
402 'format' => 'snippet',
403 'size' => DEFAULT_SIZE
,
404 'volid' => 'local:snippets/userconfig.yaml',
409 description
=> 'VMID: none, parent, non-matching',
410 # string instead of vmid in folder
411 #"$storage_dir/images/ssss/base-4321-disk-0.qcow2/1234/vm-1234-disk-0.qcow2",
414 "$storage_dir/images/1234/vm-1234-disk-0.qcow2",
417 "../ssss/base-4321-disk-0.qcow2",
421 'content' => 'images',
422 'ctime' => DEFAULT_CTIME
,
424 'parent' => '../ssss/base-4321-disk-0.qcow2',
425 'size' => DEFAULT_SIZE
,
426 'used' => DEFAULT_USED
,
428 'volid' => 'local:1234/vm-1234-disk-0.qcow2',
433 description
=> 'VMID: none, non-matching',
437 "$storage_dir/images/ssss/base-4321-disk-0.raw",
438 "$storage_dir/images/ssss/vm-1234-disk-0.qcow2",
439 "$storage_dir/template/iso/yet-again-a-installation-disk.dvd",
440 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.zip.gz",
441 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.bz2",
442 "$storage_dir/private/subvol-19254-disk-0/19254",
443 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tar.bz2",
444 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.zip.gz",
445 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tgz.lzo",
446 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz",
447 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vms.gz",
449 expected
=> [], # returns empty list
454 # provide static vmlist for tests
455 my $mock_cluster = Test
::MockModule-
>new('PVE::Cluster', no_auto
=> 1);
456 $mock_cluster->redefine(get_vmlist
=> sub { return $mocked_vmlist; });
458 # populate is File::stat's method to fill all information from CORE::stat into
460 my $mock_stat = Test
::MockModule-
>new('File::stat', no_auto
=> 1);
461 $mock_stat->redefine(populate
=> sub {
463 $st[7] = DEFAULT_SIZE
;
464 $st[10] = DEFAULT_CTIME
;
466 my $result = $mock_stat->original('populate')->(@st);
471 # override info provided by qemu-img in file_size_info
472 my $mock_fsi = Test
::MockModule-
>new('PVE::Storage::Plugin', no_auto
=> 1);
473 $mock_fsi->redefine(file_size_info
=> sub {
474 my ($filename, $timeout) = @_;
475 my ($size, $format, $used, $parent, $ctime) = $mock_fsi->original('file_size_info')->($filename, $timeout);
477 $size = DEFAULT_SIZE
;
478 $used = DEFAULT_USED
;
480 return wantarray ?
($size, $format, $used, $parent, $ctime) : $size;
483 my $plan = scalar @tests;
484 plan tests
=> $plan + 1;
487 # don't accidentally modify vmlist, see bug report
488 # https://pve.proxmox.com/pipermail/pve-devel/2020-January/041096.html
489 my $scfg_with_type = { path
=> $storage_dir, type
=> 'dir' };
490 my $original_vmlist = { ids
=> {} };
491 my $tested_vmlist = dclone
($original_vmlist);
493 PVE
::Storage
::Plugin-
>list_volumes('sid', $scfg_with_type, undef, ['images']);
495 is_deeply
($tested_vmlist, $original_vmlist,
496 'PVE::Cluster::vmlist remains unmodified')
497 || diag
("Expected vmlist to remain\n", explain
($original_vmlist),
498 "but it turned to\n", explain
($tested_vmlist));
504 my $types = [ 'rootdir', 'images', 'vztmpl', 'iso', 'backup', 'snippets' ];
505 my @suffixes = ( 'qcow2', 'raw', 'vmdk', 'vhdx' );
507 # run through test cases
508 foreach my $tt (@tests) {
509 my $vmid = $tt->{vmid
};
510 my $files = $tt->{files
};
511 my $expected = $tt->{expected
};
512 my $description = $tt->{description
};
513 my $parent = $tt->{parent
};
515 # prepare environment
516 my $num = 0; #parent disks
517 for my $file (@$files) {
518 my ($name, $dir, $suffix) = fileparse
($file, @suffixes);
520 make_path
($dir, { verbose
=> 1, mode
=> 0755 });
523 # using qemu-img to also be able to represent the backing device
524 my @cmd = ( '/usr/bin/qemu-img', 'create', "$file", DEFAULT_SIZE
);
525 push @cmd, ( '-f', $suffix ) if $suffix;
526 push @cmd, ( '-u', '-b', @$parent[$num] ) if $parent;
527 push @cmd, ( '-F', $suffix ) if $parent && $suffix;
535 eval { $got = PVE
::Storage
::Plugin-
>list_volumes($sid, $scfg, $vmid, $types) };
538 is_deeply
($got, $expected, $description) || diag
(explain
($got));
540 # clean up after each test case, otherwise
541 # we get wrong results from leftover files
542 remove_tree
($storage_dir, { verbose
=> 1 });