]> git.proxmox.com Git - qemu-server.git/blame - test/run_qemu_img_convert_tests.pl
fix #2469: fix qemu-img convert src_format detection
[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 },
af1f1ec0
DC
155 {
156 name => "vmdkfile",
157 parameters => [ "./test.vmdk", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
158 expected => [
159 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "vmdk", "-O", "raw",
160 "./test.vmdk",
161 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
162 ]
163 },
164 {
165 name => "notexistingfile",
166 parameters => [ "/foo/bar", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
167 expected => "source '/foo/bar' is not a valid volid nor path for qemu-img convert\n",
168 },
169 {
170 name => "efidisk",
171 parameters => [ "/usr/share/kvm/OVMF_VARS-pure-efi.fd", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
172 expected => [
bdd1feef 173 "/usr/bin/qemu-img", "convert", "-p", "-n", "-O", "raw",
af1f1ec0
DC
174 "/usr/share/kvm/OVMF_VARS-pure-efi.fd",
175 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
176 ]
177 },
178 {
179 name => "efi2zos",
180 parameters => [ "/usr/share/kvm/OVMF_VARS-pure-efi.fd", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
181 expected => [
bdd1feef 182 "/usr/bin/qemu-img", "convert", "-p", "-n", "--target-image-opts",
af1f1ec0
DC
183 "/usr/share/kvm/OVMF_VARS-pure-efi.fd",
184 "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",
185 ]
186 }
458a2b26
DC
187];
188
189my $command;
190
191my $storage_module = Test::MockModule->new("PVE::Storage");
192$storage_module->mock(
193 config => sub {
194 return $storage_config;
195 },
196 activate_volumes => sub {
197 return 1;
198 }
199);
200
201my $lio_module = Test::MockModule->new("PVE::Storage::LunCmd::LIO");
202$lio_module->mock(
203 run_lun_command => sub {
204 return 1;
205 }
206);
207
208# we use the exported run_command so we have to mock it there
209my $zfsplugin_module = Test::MockModule->new("PVE::Storage::ZFSPlugin");
210$zfsplugin_module->mock(
211 run_command => sub {
212 return 1;
213 }
214);
215
216# we use the exported run_command so we have to mock it there
217my $qemu_server_module = Test::MockModule->new("PVE::QemuServer");
218$qemu_server_module->mock(
219 run_command => sub {
220 $command = shift;
221 },
222 get_initiator_name => sub {
223 return "foobar";
224 }
225);
226
227foreach my $test (@$tests) {
228 my $name = $test->{name};
229 my $expected = $test->{expected};
230 eval { PVE::QemuServer::qemu_img_convert(@{$test->{parameters}}) };
231 if (my $err = $@) {
232 is ($err, $expected, $name);
233 } elsif (defined($command)) {
234 is_deeply($command, $expected, $name);
235 $command = undef;
236 } else {
237 fail($name);
238 note("no command")
239 }
240}
241
242done_testing();