]> git.proxmox.com Git - qemu-server.git/blame - test/run_qemu_img_convert_tests.pl
add tests for qemu_img_convert
[qemu-server.git] / test / run_qemu_img_convert_tests.pl
CommitLineData
458a2b26
DC
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use lib qw(..);
7
8use Test::More;
9use Test::MockModule;
10
11use PVE::QemuServer;
12
13my $vmid = 8006;
14my $storage_config = {
15 ids => {
16 local => {
17 content => {
18 images => 1,
19 },
20 path => "/var/lib/vz",
21 type => "dir",
22 shared => 0,
23 },
24 "rbd-store" => {
25 monhost => "127.0.0.42,127.0.0.21,::1",
26 content => {
27 images => 1
28 },
29 type => "rbd",
30 pool => "cpool",
31 username => "admin",
32 shared => 1
33 },
34 "local-lvm" => {
35 vgname => "pve",
36 bwlimit => "restore=1024",
37 type => "lvmthin",
38 thinpool => "data",
39 content => {
40 images => 1,
41 }
42 },
43 "zfs-over-iscsi" => {
44 type => "zfs",
45 iscsiprovider => "LIO",
46 lio_tpg => "tpg1",
47 portal => "127.0.0.1",
48 target => "iqn.2019-10.org.test:foobar",
49 pool => "tank",
50 }
51 }
52};
53
54my $tests = [
55 {
56 name => 'qcow2raw',
57 parameters => [ "local:$vmid/vm-$vmid-disk-0.qcow2", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
58 expected => [
59 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "qcow2", "-O", "raw",
60 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.qcow2", "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw"
61 ],
62 },
63 {
64 name => "raw2qcow2",
65 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "local:$vmid/vm-$vmid-disk-0.qcow2", 1024*10, undef, 0 ],
66 expected => [
67 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "qcow2",
68 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw", "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.qcow2"
69 ]
70 },
71 {
72 name => "local2rbd",
73 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "rbd-store:vm-$vmid-disk-0", 1024*10, undef, 0 ],
74 expected => [
75 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
76 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw", "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none"
77 ]
78 },
79 {
80 name => "rbd2local",
81 parameters => [ "rbd-store:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
82 expected => [
83 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
84 "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none", "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw"
85 ]
86 },
87 {
88 name => "local2zos",
89 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
90 expected => [
91 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "--target-image-opts",
92 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
93 "file.driver=iscsi,file.transport=tcp,file.initiator-name=foobar,file.portal=127.0.0.1,file.target=iqn.2019-10.org.test:foobar,file.lun=1,driver=raw"
94 ]
95 },
96 {
97 name => "zos2local",
98 parameters => [ "zfs-over-iscsi:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
99 expected => [
100 "/usr/bin/qemu-img", "convert", "-p", "-n", "--image-opts", "-O", "raw",
101 "file.driver=iscsi,file.transport=tcp,file.initiator-name=foobar,file.portal=127.0.0.1,file.target=iqn.2019-10.org.test:foobar,file.lun=1,driver=raw",
102 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
103 ]
104 },
105 {
106 name => "zos2rbd",
107 parameters => [ "zfs-over-iscsi:vm-$vmid-disk-0", "rbd-store:vm-$vmid-disk-0", 1024*10, undef, 0 ],
108 expected => [
109 "/usr/bin/qemu-img", "convert", "-p", "-n", "--image-opts", "-O", "raw",
110 "file.driver=iscsi,file.transport=tcp,file.initiator-name=foobar,file.portal=127.0.0.1,file.target=iqn.2019-10.org.test:foobar,file.lun=1,driver=raw",
111 "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none"
112 ]
113 },
114 {
115 name => "rbd2zos",
116 parameters => [ "rbd-store:vm-$vmid-disk-0", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
117 expected => [
118 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "--target-image-opts",
119 "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none",
120 "file.driver=iscsi,file.transport=tcp,file.initiator-name=foobar,file.portal=127.0.0.1,file.target=iqn.2019-10.org.test:foobar,file.lun=1,driver=raw",
121 ]
122 },
123 {
124 name => "local2lvmthin",
125 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "local-lvm:vm-$vmid-disk-0", 1024*10, undef, 0 ],
126 expected => [
127 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
128 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
129 "/dev/pve/vm-$vmid-disk-0",
130 ]
131 },
132 {
133 name => "lvmthin2local",
134 parameters => [ "local-lvm:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
135 expected => [
136 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
137 "/dev/pve/vm-$vmid-disk-0",
138 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
139 ]
140 },
141 {
142 name => "zeroinit",
143 parameters => [ "local-lvm:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 1 ],
144 expected => [
145 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
146 "/dev/pve/vm-$vmid-disk-0",
147 "zeroinit:/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
148 ]
149 },
150 {
151 name => "notexistingstorage",
152 parameters => [ "local-lvm:vm-$vmid-disk-0", "not-existing:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 1 ],
153 expected => "storage 'not-existing' does not exists\n",
154 },
155];
156
157my $command;
158
159my $storage_module = Test::MockModule->new("PVE::Storage");
160$storage_module->mock(
161 config => sub {
162 return $storage_config;
163 },
164 activate_volumes => sub {
165 return 1;
166 }
167);
168
169my $lio_module = Test::MockModule->new("PVE::Storage::LunCmd::LIO");
170$lio_module->mock(
171 run_lun_command => sub {
172 return 1;
173 }
174);
175
176# we use the exported run_command so we have to mock it there
177my $zfsplugin_module = Test::MockModule->new("PVE::Storage::ZFSPlugin");
178$zfsplugin_module->mock(
179 run_command => sub {
180 return 1;
181 }
182);
183
184# we use the exported run_command so we have to mock it there
185my $qemu_server_module = Test::MockModule->new("PVE::QemuServer");
186$qemu_server_module->mock(
187 run_command => sub {
188 $command = shift;
189 },
190 get_initiator_name => sub {
191 return "foobar";
192 }
193);
194
195foreach my $test (@$tests) {
196 my $name = $test->{name};
197 my $expected = $test->{expected};
198 eval { PVE::QemuServer::qemu_img_convert(@{$test->{parameters}}) };
199 if (my $err = $@) {
200 is ($err, $expected, $name);
201 } elsif (defined($command)) {
202 is_deeply($command, $expected, $name);
203 $command = undef;
204 } else {
205 fail($name);
206 note("no command")
207 }
208}
209
210done_testing();