]>
git.proxmox.com Git - pve-storage.git/blob - test/list_volumes_test.pm
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
,
137 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz',
140 'content' => 'backup',
141 'ctime' => 1585602765,
142 'format' => 'vma.lzo',
143 'size' => DEFAULT_SIZE
,
145 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_12_45.vma.lzo',
148 'content' => 'backup',
149 'ctime' => 1585602835,
151 'size' => DEFAULT_SIZE
,
153 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_13_55.vma',
156 'content' => 'backup',
157 'ctime' => 1585602835,
158 'format' => 'vma.zst',
159 'size' => DEFAULT_SIZE
,
161 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_13_55.vma.zst',
164 'content' => 'snippets',
165 'ctime' => DEFAULT_CTIME
,
166 'format' => 'snippet',
167 'size' => DEFAULT_SIZE
,
168 'volid' => 'local:snippets/hookscript.pl',
171 'content' => 'snippets',
172 'ctime' => DEFAULT_CTIME
,
173 'format' => 'snippet',
174 'size' => DEFAULT_SIZE
,
175 'volid' => 'local:snippets/userconfig.yaml',
180 description
=> 'VMID: 16112, lxc, raw, backup',
183 "$storage_dir/images/16112/vm-16112-disk-0.raw",
184 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo",
185 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz",
186 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_49_30.tar.zst",
187 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_59_30.tgz",
191 'content' => 'rootdir',
192 'ctime' => DEFAULT_CTIME
,
195 'size' => DEFAULT_SIZE
,
196 'used' => DEFAULT_USED
,
198 'volid' => 'local:16112/vm-16112-disk-0.raw',
201 'content' => 'backup',
202 'ctime' => 1585604370,
203 'format' => 'tar.lzo',
204 'size' => DEFAULT_SIZE
,
206 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo',
209 'content' => 'backup',
210 'ctime' => 1585604970,
211 'format' => 'tar.gz',
212 'size' => DEFAULT_SIZE
,
214 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz',
217 'content' => 'backup',
218 'ctime' => 1585604970,
219 'format' => 'tar.zst',
220 'size' => DEFAULT_SIZE
,
222 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_49_30.tar.zst',
225 'content' => 'backup',
226 'ctime' => 1585605570,
228 'size' => DEFAULT_SIZE
,
230 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_59_30.tgz',
235 description
=> 'VMID: 16114, VM, qcow2, linked clone',
238 "$storage_dir/images/16114/vm-16114-disk-0.qcow2",
239 "$storage_dir/images/16114/vm-16114-disk-1.qcow2",
242 "../9004/base-9004-disk-0.qcow2",
243 "../9004/base-9004-disk-1.qcow2",
247 'content' => 'images',
248 'ctime' => DEFAULT_CTIME
,
250 'parent' => '../9004/base-9004-disk-0.qcow2',
251 'size' => DEFAULT_SIZE
,
252 'used' => DEFAULT_USED
,
254 'volid' => 'local:9004/base-9004-disk-0.qcow2/16114/vm-16114-disk-0.qcow2',
257 'content' => 'images',
258 'ctime' => DEFAULT_CTIME
,
260 'parent' => '../9004/base-9004-disk-1.qcow2',
261 'size' => DEFAULT_SIZE
,
262 'used' => DEFAULT_USED
,
264 'volid' => 'local:9004/base-9004-disk-1.qcow2/16114/vm-16114-disk-1.qcow2',
269 description
=> 'VMID: 9004, VM, template, qcow2',
272 "$storage_dir/images/9004/base-9004-disk-0.qcow2",
273 "$storage_dir/images/9004/base-9004-disk-1.qcow2",
277 'content' => 'images',
278 'ctime' => DEFAULT_CTIME
,
281 'size' => DEFAULT_SIZE
,
282 'used' => DEFAULT_USED
,
284 'volid' => 'local:9004/base-9004-disk-0.qcow2',
287 'content' => 'images',
288 'ctime' => DEFAULT_CTIME
,
291 'size' => DEFAULT_SIZE
,
292 'used' => DEFAULT_USED
,
294 'volid' => 'local:9004/base-9004-disk-1.qcow2',
299 description
=> 'VMID: none, templates, snippets, backup',
302 "$storage_dir/dump/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz",
303 "$storage_dir/dump/vzdump-lxc-19254-2019_01_21-19_29_19.tar",
304 "$storage_dir/template/iso/archlinux-2020.02.01-x86_64.iso",
305 "$storage_dir/template/iso/debian-8.11.1-amd64-DVD-1.iso",
306 "$storage_dir/template/iso/debian-9.12.0-amd64-netinst.iso",
307 "$storage_dir/template/iso/proxmox-ve_6.1-1.iso",
308 "$storage_dir/template/cache/archlinux-base_20190924-1_amd64.tar.gz",
309 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz",
310 "$storage_dir/template/cache/alpine-3.10-default_20190626_amd64.tar.xz",
311 "$storage_dir/snippets/userconfig.yaml",
312 "$storage_dir/snippets/hookscript.pl",
313 "$storage_dir/private/1234/", # fileparse needs / at the end
314 "$storage_dir/private/1234/subvol-1234-disk-0.subvol/", # fileparse needs / at the end
318 'content' => 'vztmpl',
319 'ctime' => DEFAULT_CTIME
,
321 'size' => DEFAULT_SIZE
,
322 'volid' => 'local:vztmpl/alpine-3.10-default_20190626_amd64.tar.xz',
325 'content' => 'vztmpl',
326 'ctime' => DEFAULT_CTIME
,
328 'size' => DEFAULT_SIZE
,
329 'volid' => 'local:vztmpl/archlinux-base_20190924-1_amd64.tar.gz',
332 'content' => 'vztmpl',
333 'ctime' => DEFAULT_CTIME
,
335 'size' => DEFAULT_SIZE
,
336 'volid' => 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz',
340 'ctime' => DEFAULT_CTIME
,
342 'size' => DEFAULT_SIZE
,
343 'volid' => 'local:iso/archlinux-2020.02.01-x86_64.iso',
347 'ctime' => DEFAULT_CTIME
,
349 'size' => DEFAULT_SIZE
,
350 'volid' => 'local:iso/debian-8.11.1-amd64-DVD-1.iso',
354 'ctime' => DEFAULT_CTIME
,
356 'size' => DEFAULT_SIZE
,
357 'volid' => 'local:iso/debian-9.12.0-amd64-netinst.iso',
361 'ctime' => DEFAULT_CTIME
,
363 'size' => DEFAULT_SIZE
,
364 'volid' => 'local:iso/proxmox-ve_6.1-1.iso',
367 'content' => 'backup',
368 'ctime' => 1580759863,
369 'format' => 'tar.gz',
370 'size' => DEFAULT_SIZE
,
372 'volid' => 'local:backup/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz',
375 'content' => 'backup',
376 'ctime' => 1548098959,
378 'size' => DEFAULT_SIZE
,
380 'volid' => 'local:backup/vzdump-lxc-19254-2019_01_21-19_29_19.tar',
383 'content' => 'snippets',
384 'ctime' => DEFAULT_CTIME
,
385 'format' => 'snippet',
386 'size' => DEFAULT_SIZE
,
387 'volid' => 'local:snippets/hookscript.pl',
390 'content' => 'snippets',
391 'ctime' => DEFAULT_CTIME
,
392 'format' => 'snippet',
393 'size' => DEFAULT_SIZE
,
394 'volid' => 'local:snippets/userconfig.yaml',
399 description
=> 'VMID: none, parent, non-matching',
400 # string instead of vmid in folder
401 #"$storage_dir/images/ssss/base-4321-disk-0.qcow2/1234/vm-1234-disk-0.qcow2",
404 "$storage_dir/images/1234/vm-1234-disk-0.qcow2",
407 "../ssss/base-4321-disk-0.qcow2",
411 'content' => 'images',
412 'ctime' => DEFAULT_CTIME
,
414 'parent' => '../ssss/base-4321-disk-0.qcow2',
415 'size' => DEFAULT_SIZE
,
416 'used' => DEFAULT_USED
,
418 'volid' => 'local:1234/vm-1234-disk-0.qcow2',
423 description
=> 'VMID: none, non-matching',
427 "$storage_dir/images/ssss/base-4321-disk-0.raw",
428 "$storage_dir/images/ssss/vm-1234-disk-0.qcow2",
429 "$storage_dir/template/iso/yet-again-a-installation-disk.dvd",
430 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.zip.gz",
431 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.bz2",
432 "$storage_dir/private/subvol-19254-disk-0/19254",
433 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tar.bz2",
434 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.zip.gz",
435 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tgz.lzo",
436 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz",
437 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vms.gz",
439 expected
=> [], # returns empty list
444 # provide static vmlist for tests
445 my $mock_cluster = Test
::MockModule-
>new('PVE::Cluster', no_auto
=> 1);
446 $mock_cluster->redefine(get_vmlist
=> sub { return $mocked_vmlist; });
448 # populate is File::stat's method to fill all information from CORE::stat into
450 my $mock_stat = Test
::MockModule-
>new('File::stat', no_auto
=> 1);
451 $mock_stat->redefine(populate
=> sub {
453 $st[7] = DEFAULT_SIZE
;
454 $st[10] = DEFAULT_CTIME
;
456 my $result = $mock_stat->original('populate')->(@st);
461 # override info provided by qemu-img in file_size_info
462 my $mock_fsi = Test
::MockModule-
>new('PVE::Storage::Plugin', no_auto
=> 1);
463 $mock_fsi->redefine(file_size_info
=> sub {
464 my ($filename, $timeout) = @_;
465 my ($size, $format, $used, $parent, $ctime) = $mock_fsi->original('file_size_info')->($filename, $timeout);
467 $size = DEFAULT_SIZE
;
468 $used = DEFAULT_USED
;
470 return wantarray ?
($size, $format, $used, $parent, $ctime) : $size;
473 my $plan = scalar @tests;
474 plan tests
=> $plan + 1;
477 # don't accidentally modify vmlist, see bug report
478 # https://pve.proxmox.com/pipermail/pve-devel/2020-January/041096.html
479 my $scfg_with_type = { path
=> $storage_dir, type
=> 'dir' };
480 my $original_vmlist = { ids
=> {} };
481 my $tested_vmlist = dclone
($original_vmlist);
483 PVE
::Storage
::Plugin-
>list_volumes('sid', $scfg_with_type, undef, ['images']);
485 is_deeply
($tested_vmlist, $original_vmlist,
486 'PVE::Cluster::vmlist remains unmodified')
487 || diag
("Expected vmlist to remain\n", explain
($original_vmlist),
488 "but it turned to\n", explain
($tested_vmlist));
494 my $types = [ 'rootdir', 'images', 'vztmpl', 'iso', 'backup', 'snippets' ];
495 my @suffixes = ( 'qcow2', 'raw', 'vmdk', 'vhdx' );
497 # run through test cases
498 foreach my $tt (@tests) {
499 my $vmid = $tt->{vmid
};
500 my $files = $tt->{files
};
501 my $expected = $tt->{expected
};
502 my $description = $tt->{description
};
503 my $parent = $tt->{parent
};
505 # prepare environment
506 my $num = 0; #parent disks
507 for my $file (@$files) {
508 my ($name, $dir, $suffix) = fileparse
($file, @suffixes);
510 make_path
($dir, { verbose
=> 1, mode
=> 0755 });
513 # using qemu-img to also be able to represent the backing device
514 my @cmd = ( '/usr/bin/qemu-img', 'create', "$file", DEFAULT_SIZE
);
515 push @cmd, ( '-f', $suffix ) if $suffix;
516 push @cmd, ( '-u', '-b', @$parent[$num] ) if $parent;
517 push @cmd, ( '-F', $suffix ) if $parent && $suffix;
525 eval { $got = PVE
::Storage
::Plugin-
>list_volumes($sid, $scfg, $vmid, $types) };
528 is_deeply
($got, $expected, $description) || diag
(explain
($got));
530 # clean up after each test case, otherwise
531 # we get wrong results from leftover files
532 remove_tree
($storage_dir, { verbose
=> 1 });