]> git.proxmox.com Git - qemu-server.git/blob - test/run_qemu_img_convert_tests.pl
start: make not being able to set polling interval for ballooning non-critical
[qemu-server.git] / test / run_qemu_img_convert_tests.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use lib qw(..);
7
8 use Test::More;
9 use Test::MockModule;
10
11 use PVE::QemuServer;
12
13 my $vmid = 8006;
14 my $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 fsid => 'fc4181a6-56eb-4f68-b452-8ba1f381ca2a',
27 content => {
28 images => 1
29 },
30 type => "rbd",
31 pool => "cpool",
32 username => "admin",
33 shared => 1
34 },
35 "local-lvm" => {
36 vgname => "pve",
37 bwlimit => "restore=1024",
38 type => "lvmthin",
39 thinpool => "data",
40 content => {
41 images => 1,
42 }
43 },
44 "zfs-over-iscsi" => {
45 type => "zfs",
46 iscsiprovider => "LIO",
47 lio_tpg => "tpg1",
48 portal => "127.0.0.1",
49 target => "iqn.2019-10.org.test:foobar",
50 pool => "tank",
51 }
52 }
53 };
54
55 my $tests = [
56 {
57 name => 'qcow2raw',
58 parameters => [ "local:$vmid/vm-$vmid-disk-0.qcow2", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
59 expected => [
60 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "qcow2", "-O", "raw",
61 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.qcow2", "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw"
62 ],
63 },
64 {
65 name => "raw2qcow2",
66 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "local:$vmid/vm-$vmid-disk-0.qcow2", 1024*10, undef, 0 ],
67 expected => [
68 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "qcow2",
69 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw", "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.qcow2"
70 ]
71 },
72 {
73 name => "local2rbd",
74 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "rbd-store:vm-$vmid-disk-0", 1024*10, undef, 0 ],
75 expected => [
76 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
77 "/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"
78 ]
79 },
80 {
81 name => "rbd2local",
82 parameters => [ "rbd-store:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
83 expected => [
84 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
85 "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"
86 ]
87 },
88 {
89 name => "local2zos",
90 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
91 expected => [
92 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "--target-image-opts",
93 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
94 "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"
95 ]
96 },
97 {
98 name => "zos2local",
99 parameters => [ "zfs-over-iscsi:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
100 expected => [
101 "/usr/bin/qemu-img", "convert", "-p", "-n", "--image-opts", "-O", "raw",
102 "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",
103 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
104 ]
105 },
106 {
107 name => "zos2rbd",
108 parameters => [ "zfs-over-iscsi:vm-$vmid-disk-0", "rbd-store:vm-$vmid-disk-0", 1024*10, undef, 0 ],
109 expected => [
110 "/usr/bin/qemu-img", "convert", "-p", "-n", "--image-opts", "-O", "raw",
111 "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",
112 "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none"
113 ]
114 },
115 {
116 name => "rbd2zos",
117 parameters => [ "rbd-store:vm-$vmid-disk-0", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
118 expected => [
119 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "--target-image-opts",
120 "rbd:cpool/vm-$vmid-disk-0:mon_host=127.0.0.42;127.0.0.21;[\\:\\:1]:auth_supported=none",
121 "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",
122 ]
123 },
124 {
125 name => "local2lvmthin",
126 parameters => [ "local:$vmid/vm-$vmid-disk-0.raw", "local-lvm:vm-$vmid-disk-0", 1024*10, undef, 0 ],
127 expected => [
128 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
129 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
130 "/dev/pve/vm-$vmid-disk-0",
131 ]
132 },
133 {
134 name => "lvmthin2local",
135 parameters => [ "local-lvm:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
136 expected => [
137 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
138 "/dev/pve/vm-$vmid-disk-0",
139 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
140 ]
141 },
142 {
143 name => "zeroinit",
144 parameters => [ "local-lvm:vm-$vmid-disk-0", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 1 ],
145 expected => [
146 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "raw", "-O", "raw",
147 "/dev/pve/vm-$vmid-disk-0",
148 "zeroinit:/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
149 ]
150 },
151 {
152 name => "notexistingstorage",
153 parameters => [ "local-lvm:vm-$vmid-disk-0", "not-existing:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 1 ],
154 expected => "storage 'not-existing' does not exist\n",
155 },
156 {
157 name => "vmdkfile",
158 parameters => [ "./test.vmdk", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
159 expected => [
160 "/usr/bin/qemu-img", "convert", "-p", "-n", "-f", "vmdk", "-O", "raw",
161 "./test.vmdk",
162 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
163 ]
164 },
165 {
166 name => "notexistingfile",
167 parameters => [ "/foo/bar", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
168 expected => "source '/foo/bar' is not a valid volid nor path for qemu-img convert\n",
169 },
170 {
171 name => "efidisk",
172 parameters => [ "/usr/share/kvm/OVMF_VARS-pure-efi.fd", "local:$vmid/vm-$vmid-disk-0.raw", 1024*10, undef, 0 ],
173 expected => [
174 "/usr/bin/qemu-img", "convert", "-p", "-n", "-O", "raw",
175 "/usr/share/kvm/OVMF_VARS-pure-efi.fd",
176 "/var/lib/vz/images/$vmid/vm-$vmid-disk-0.raw",
177 ]
178 },
179 {
180 name => "efi2zos",
181 parameters => [ "/usr/share/kvm/OVMF_VARS-pure-efi.fd", "zfs-over-iscsi:vm-$vmid-disk-0", 1024*10, undef, 0 ],
182 expected => [
183 "/usr/bin/qemu-img", "convert", "-p", "-n", "--target-image-opts",
184 "/usr/share/kvm/OVMF_VARS-pure-efi.fd",
185 "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",
186 ]
187 }
188 ];
189
190 my $command;
191
192 my $storage_module = Test::MockModule->new("PVE::Storage");
193 $storage_module->mock(
194 config => sub {
195 return $storage_config;
196 },
197 activate_volumes => sub {
198 return 1;
199 }
200 );
201
202 my $lio_module = Test::MockModule->new("PVE::Storage::LunCmd::LIO");
203 $lio_module->mock(
204 run_lun_command => sub {
205 return 1;
206 }
207 );
208
209 # we use the exported run_command so we have to mock it there
210 my $zfsplugin_module = Test::MockModule->new("PVE::Storage::ZFSPlugin");
211 $zfsplugin_module->mock(
212 run_command => sub {
213 return 1;
214 }
215 );
216
217 # we use the exported run_command so we have to mock it there
218 my $qemu_server_module = Test::MockModule->new("PVE::QemuServer");
219 $qemu_server_module->mock(
220 run_command => sub {
221 $command = shift;
222 },
223 get_initiator_name => sub {
224 return "foobar";
225 }
226 );
227
228 foreach my $test (@$tests) {
229 my $name = $test->{name};
230 my $expected = $test->{expected};
231 eval { PVE::QemuServer::qemu_img_convert(@{$test->{parameters}}) };
232 if (my $err = $@) {
233 is ($err, $expected, $name);
234 } elsif (defined($command)) {
235 is_deeply($command, $expected, $name);
236 $command = undef;
237 } else {
238 fail($name);
239 note("no command")
240 }
241 }
242
243 done_testing();