]>
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/snippets/userconfig.yaml",
97 "$storage_dir/snippets/hookscript.pl",
101 'content' => 'images',
102 'ctime' => DEFAULT_CTIME
,
105 'size' => DEFAULT_SIZE
,
106 'used' => DEFAULT_USED
,
108 'volid' => 'local:16110/vm-16110-disk-0.qcow2',
111 'content' => 'images',
112 'ctime' => DEFAULT_CTIME
,
115 'size' => DEFAULT_SIZE
,
116 'used' => DEFAULT_USED
,
118 'volid' => 'local:16110/vm-16110-disk-1.raw',
121 'content' => 'images',
122 'ctime' => DEFAULT_CTIME
,
125 'size' => DEFAULT_SIZE
,
126 'used' => DEFAULT_USED
,
128 'volid' => 'local:16110/vm-16110-disk-2.vmdk',
131 'content' => 'backup',
132 'ctime' => DEFAULT_CTIME
,
133 'format' => 'vma.gz',
134 'size' => DEFAULT_SIZE
,
136 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz',
139 'content' => 'backup',
140 'ctime' => DEFAULT_CTIME
,
141 'format' => 'vma.lzo',
142 'size' => DEFAULT_SIZE
,
144 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_12_45.vma.lzo',
147 'content' => 'backup',
148 'ctime' => DEFAULT_CTIME
,
150 'size' => DEFAULT_SIZE
,
152 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_13_55.vma',
155 'content' => 'snippets',
156 'ctime' => DEFAULT_CTIME
,
157 'format' => 'snippet',
158 'size' => DEFAULT_SIZE
,
159 'volid' => 'local:snippets/hookscript.pl',
162 'content' => 'snippets',
163 'ctime' => DEFAULT_CTIME
,
164 'format' => 'snippet',
165 'size' => DEFAULT_SIZE
,
166 'volid' => 'local:snippets/userconfig.yaml',
171 description
=> 'VMID: 16112, lxc, raw, backup',
174 "$storage_dir/images/16112/vm-16112-disk-0.raw",
175 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo",
176 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz",
177 "$storage_dir/dump/vzdump-lxc-16112-2020_03_30-21_59_30.tgz",
181 'content' => 'rootdir',
182 'ctime' => DEFAULT_CTIME
,
185 'size' => DEFAULT_SIZE
,
186 'used' => DEFAULT_USED
,
188 'volid' => 'local:16112/vm-16112-disk-0.raw',
191 'content' => 'backup',
192 'ctime' => DEFAULT_CTIME
,
193 'format' => 'tar.lzo',
194 'size' => DEFAULT_SIZE
,
196 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo',
199 'content' => 'backup',
200 'ctime' => DEFAULT_CTIME
,
201 'format' => 'tar.gz',
202 'size' => DEFAULT_SIZE
,
204 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_49_30.tar.gz',
207 'content' => 'backup',
208 'ctime' => DEFAULT_CTIME
,
210 'size' => DEFAULT_SIZE
,
212 'volid' => 'local:backup/vzdump-lxc-16112-2020_03_30-21_59_30.tgz',
217 description
=> 'VMID: 16114, VM, qcow2, linked clone',
220 "$storage_dir/images/16114/vm-16114-disk-0.qcow2",
221 "$storage_dir/images/16114/vm-16114-disk-1.qcow2",
224 "../9004/base-9004-disk-0.qcow2",
225 "../9004/base-9004-disk-1.qcow2",
229 'content' => 'images',
230 'ctime' => DEFAULT_CTIME
,
232 'parent' => '../9004/base-9004-disk-0.qcow2',
233 'size' => DEFAULT_SIZE
,
234 'used' => DEFAULT_USED
,
236 'volid' => 'local:9004/base-9004-disk-0.qcow2/16114/vm-16114-disk-0.qcow2',
239 'content' => 'images',
240 'ctime' => DEFAULT_CTIME
,
242 'parent' => '../9004/base-9004-disk-1.qcow2',
243 'size' => DEFAULT_SIZE
,
244 'used' => DEFAULT_USED
,
246 'volid' => 'local:9004/base-9004-disk-1.qcow2/16114/vm-16114-disk-1.qcow2',
251 description
=> 'VMID: 9004, VM, template, qcow2',
254 "$storage_dir/images/9004/base-9004-disk-0.qcow2",
255 "$storage_dir/images/9004/base-9004-disk-1.qcow2",
259 'content' => 'images',
260 'ctime' => DEFAULT_CTIME
,
263 'size' => DEFAULT_SIZE
,
264 'used' => DEFAULT_USED
,
266 'volid' => 'local:9004/base-9004-disk-0.qcow2',
269 'content' => 'images',
270 'ctime' => DEFAULT_CTIME
,
273 'size' => DEFAULT_SIZE
,
274 'used' => DEFAULT_USED
,
276 'volid' => 'local:9004/base-9004-disk-1.qcow2',
281 description
=> 'VMID: none, templates, snippets, backup',
284 "$storage_dir/dump/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz",
285 "$storage_dir/dump/vzdump-lxc-19254-2019_01_21-19_29_19.tar",
286 "$storage_dir/template/iso/archlinux-2020.02.01-x86_64.iso",
287 "$storage_dir/template/iso/debian-8.11.1-amd64-DVD-1.iso",
288 "$storage_dir/template/iso/debian-9.12.0-amd64-netinst.iso",
289 "$storage_dir/template/iso/proxmox-ve_6.1-1.iso",
290 "$storage_dir/template/cache/archlinux-base_20190924-1_amd64.tar.gz",
291 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz",
292 "$storage_dir/template/cache/alpine-3.10-default_20190626_amd64.tar.xz",
293 "$storage_dir/snippets/userconfig.yaml",
294 "$storage_dir/snippets/hookscript.pl",
295 "$storage_dir/private/1234/", # fileparse needs / at the end
296 "$storage_dir/private/1234/subvol-1234-disk-0.subvol/", # fileparse needs / at the end
300 'content' => 'vztmpl',
301 'ctime' => DEFAULT_CTIME
,
303 'size' => DEFAULT_SIZE
,
304 'volid' => 'local:vztmpl/alpine-3.10-default_20190626_amd64.tar.xz',
307 'content' => 'vztmpl',
308 'ctime' => DEFAULT_CTIME
,
310 'size' => DEFAULT_SIZE
,
311 'volid' => 'local:vztmpl/archlinux-base_20190924-1_amd64.tar.gz',
314 'content' => 'vztmpl',
315 'ctime' => DEFAULT_CTIME
,
317 'size' => DEFAULT_SIZE
,
318 'volid' => 'local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz',
322 'ctime' => DEFAULT_CTIME
,
324 'size' => DEFAULT_SIZE
,
325 'volid' => 'local:iso/archlinux-2020.02.01-x86_64.iso',
329 'ctime' => DEFAULT_CTIME
,
331 'size' => DEFAULT_SIZE
,
332 'volid' => 'local:iso/debian-8.11.1-amd64-DVD-1.iso',
336 'ctime' => DEFAULT_CTIME
,
338 'size' => DEFAULT_SIZE
,
339 'volid' => 'local:iso/debian-9.12.0-amd64-netinst.iso',
343 'ctime' => DEFAULT_CTIME
,
345 'size' => DEFAULT_SIZE
,
346 'volid' => 'local:iso/proxmox-ve_6.1-1.iso',
349 'content' => 'backup',
350 'ctime' => DEFAULT_CTIME
,
351 'format' => 'tar.gz',
352 'size' => DEFAULT_SIZE
,
354 'volid' => 'local:backup/vzdump-lxc-19253-2020_02_03-19_57_43.tar.gz',
357 'content' => 'backup',
358 'ctime' => DEFAULT_CTIME
,
360 'size' => DEFAULT_SIZE
,
362 'volid' => 'local:backup/vzdump-lxc-19254-2019_01_21-19_29_19.tar',
365 'content' => 'snippets',
366 'ctime' => DEFAULT_CTIME
,
367 'format' => 'snippet',
368 'size' => DEFAULT_SIZE
,
369 'volid' => 'local:snippets/hookscript.pl',
372 'content' => 'snippets',
373 'ctime' => DEFAULT_CTIME
,
374 'format' => 'snippet',
375 'size' => DEFAULT_SIZE
,
376 'volid' => 'local:snippets/userconfig.yaml',
381 description
=> 'VMID: none, parent, non-matching',
382 # string instead of vmid in folder
383 #"$storage_dir/images/ssss/base-4321-disk-0.qcow2/1234/vm-1234-disk-0.qcow2",
386 "$storage_dir/images/1234/vm-1234-disk-0.qcow2",
389 "../ssss/base-4321-disk-0.qcow2",
393 'content' => 'images',
394 'ctime' => DEFAULT_CTIME
,
396 'parent' => '../ssss/base-4321-disk-0.qcow2',
397 'size' => DEFAULT_SIZE
,
398 'used' => DEFAULT_USED
,
400 'volid' => 'local:1234/vm-1234-disk-0.qcow2',
405 description
=> 'VMID: none, non-matching',
409 "$storage_dir/images/ssss/base-4321-disk-0.raw",
410 "$storage_dir/images/ssss/vm-1234-disk-0.qcow2",
411 "$storage_dir/template/iso/yet-again-a-installation-disk.dvd",
412 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.zip.gz",
413 "$storage_dir/template/cache/debian-10.0-standard_10.0-1_amd64.tar.bz2",
414 "$storage_dir/private/subvol-19254-disk-0/19254",
415 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tar.bz2",
416 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.zip.gz",
417 "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tgz.lzo",
418 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz",
419 "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vms.gz",
421 expected
=> [], # returns empty list
426 # provide static vmlist for tests
427 my $mock_cluster = Test
::MockModule-
>new('PVE::Cluster', no_auto
=> 1);
428 $mock_cluster->redefine(get_vmlist
=> sub { return $mocked_vmlist; });
430 # populate is File::stat's method to fill all information from CORE::stat into
432 my $mock_stat = Test
::MockModule-
>new('File::stat', no_auto
=> 1);
433 $mock_stat->redefine(populate
=> sub {
435 $st[7] = DEFAULT_SIZE
;
436 $st[10] = DEFAULT_CTIME
;
438 my $result = $mock_stat->original('populate')->(@st);
443 # override info provided by qemu-img in file_size_info
444 my $mock_fsi = Test
::MockModule-
>new('PVE::Storage::Plugin', no_auto
=> 1);
445 $mock_fsi->redefine(file_size_info
=> sub {
446 my ($filename, $timeout) = @_;
447 my ($size, $format, $used, $parent, $ctime) = $mock_fsi->original('file_size_info')->($filename, $timeout);
449 $size = DEFAULT_SIZE
;
450 $used = DEFAULT_USED
;
452 return wantarray ?
($size, $format, $used, $parent, $ctime) : $size;
455 my $plan = scalar @tests;
456 plan tests
=> $plan + 1;
459 # don't accidentally modify vmlist, see bug report
460 # https://pve.proxmox.com/pipermail/pve-devel/2020-January/041096.html
461 my $scfg_with_type = { path
=> $storage_dir, type
=> 'dir' };
462 my $original_vmlist = { ids
=> {} };
463 my $tested_vmlist = dclone
($original_vmlist);
465 PVE
::Storage
::Plugin-
>list_volumes('sid', $scfg_with_type, undef, ['images']);
467 is_deeply
($tested_vmlist, $original_vmlist,
468 'PVE::Cluster::vmlist remains unmodified')
469 || diag
("Expected vmlist to remain\n", explain
($original_vmlist),
470 "but it turned to\n", explain
($tested_vmlist));
476 my $types = [ 'rootdir', 'images', 'vztmpl', 'iso', 'backup', 'snippets' ];
477 my @suffixes = ( 'qcow2', 'raw', 'vmdk', 'vhdx' );
479 # run through test cases
480 foreach my $tt (@tests) {
481 my $vmid = $tt->{vmid
};
482 my $files = $tt->{files
};
483 my $expected = $tt->{expected
};
484 my $description = $tt->{description
};
485 my $parent = $tt->{parent
};
487 # prepare environment
488 my $num = 0; #parent disks
489 for my $file (@$files) {
490 my ($name, $dir, $suffix) = fileparse
($file, @suffixes);
492 make_path
($dir, { verbose
=> 1, mode
=> 0755 });
495 # using qemu-img to also be able to represent the backing device
496 my @cmd = ( '/usr/bin/qemu-img', 'create', "$file", DEFAULT_SIZE
);
497 push @cmd, ( '-f', $suffix ) if $suffix;
498 push @cmd, ( '-u', '-b', @$parent[$num] ) if $parent;
506 eval { $got = PVE
::Storage
::Plugin-
>list_volumes($sid, $scfg, $vmid, $types) };
509 is_deeply
($got, $expected, $description) || diag
(explain
($got));
511 # clean up after each test case, otherwise
512 # we get wrong results from leftover files
513 remove_tree
($storage_dir, { verbose
=> 1 });