xref: /openbmc/qemu/tests/qemu-iotests/213 (revision 0b7e7f66813a7e346e12d47be977a32a530a6316)
1*0b7e7f66SKevin Wolf#!/bin/bash
2*0b7e7f66SKevin Wolf#
3*0b7e7f66SKevin Wolf# Test vhdx and file image creation
4*0b7e7f66SKevin Wolf#
5*0b7e7f66SKevin Wolf# Copyright (C) 2018 Red Hat, Inc.
6*0b7e7f66SKevin Wolf#
7*0b7e7f66SKevin Wolf# This program is free software; you can redistribute it and/or modify
8*0b7e7f66SKevin Wolf# it under the terms of the GNU General Public License as published by
9*0b7e7f66SKevin Wolf# the Free Software Foundation; either version 2 of the License, or
10*0b7e7f66SKevin Wolf# (at your option) any later version.
11*0b7e7f66SKevin Wolf#
12*0b7e7f66SKevin Wolf# This program is distributed in the hope that it will be useful,
13*0b7e7f66SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of
14*0b7e7f66SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*0b7e7f66SKevin Wolf# GNU General Public License for more details.
16*0b7e7f66SKevin Wolf#
17*0b7e7f66SKevin Wolf# You should have received a copy of the GNU General Public License
18*0b7e7f66SKevin Wolf# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19*0b7e7f66SKevin Wolf#
20*0b7e7f66SKevin Wolf
21*0b7e7f66SKevin Wolf# creator
22*0b7e7f66SKevin Wolfowner=kwolf@redhat.com
23*0b7e7f66SKevin Wolf
24*0b7e7f66SKevin Wolfseq=`basename $0`
25*0b7e7f66SKevin Wolfecho "QA output created by $seq"
26*0b7e7f66SKevin Wolf
27*0b7e7f66SKevin Wolfhere=`pwd`
28*0b7e7f66SKevin Wolfstatus=1	# failure is the default!
29*0b7e7f66SKevin Wolf
30*0b7e7f66SKevin Wolf# get standard environment, filters and checks
31*0b7e7f66SKevin Wolf. ./common.rc
32*0b7e7f66SKevin Wolf. ./common.filter
33*0b7e7f66SKevin Wolf
34*0b7e7f66SKevin Wolf_supported_fmt vhdx
35*0b7e7f66SKevin Wolf_supported_proto file
36*0b7e7f66SKevin Wolf_supported_os Linux
37*0b7e7f66SKevin Wolf
38*0b7e7f66SKevin Wolffunction do_run_qemu()
39*0b7e7f66SKevin Wolf{
40*0b7e7f66SKevin Wolf    echo Testing: "$@"
41*0b7e7f66SKevin Wolf    $QEMU -nographic -qmp stdio -serial none "$@"
42*0b7e7f66SKevin Wolf    echo
43*0b7e7f66SKevin Wolf}
44*0b7e7f66SKevin Wolf
45*0b7e7f66SKevin Wolffunction run_qemu()
46*0b7e7f66SKevin Wolf{
47*0b7e7f66SKevin Wolf    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
48*0b7e7f66SKevin Wolf                          | _filter_qemu | _filter_imgfmt \
49*0b7e7f66SKevin Wolf                          | _filter_actual_image_size
50*0b7e7f66SKevin Wolf}
51*0b7e7f66SKevin Wolf
52*0b7e7f66SKevin Wolfecho
53*0b7e7f66SKevin Wolfecho "=== Successful image creation (defaults) ==="
54*0b7e7f66SKevin Wolfecho
55*0b7e7f66SKevin Wolf
56*0b7e7f66SKevin Wolfsize=$((128 * 1024 * 1024))
57*0b7e7f66SKevin Wolf
58*0b7e7f66SKevin Wolfrun_qemu <<EOF
59*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
60*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
61*0b7e7f66SKevin Wolf  "arguments": {
62*0b7e7f66SKevin Wolf      "driver": "file",
63*0b7e7f66SKevin Wolf      "filename": "$TEST_IMG",
64*0b7e7f66SKevin Wolf      "size": 0
65*0b7e7f66SKevin Wolf  }
66*0b7e7f66SKevin Wolf}
67*0b7e7f66SKevin Wolf{ "execute": "blockdev-add",
68*0b7e7f66SKevin Wolf  "arguments": {
69*0b7e7f66SKevin Wolf      "driver": "file",
70*0b7e7f66SKevin Wolf      "node-name": "imgfile",
71*0b7e7f66SKevin Wolf      "filename": "$TEST_IMG"
72*0b7e7f66SKevin Wolf  }
73*0b7e7f66SKevin Wolf}
74*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
75*0b7e7f66SKevin Wolf  "arguments": {
76*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
77*0b7e7f66SKevin Wolf      "file": "imgfile",
78*0b7e7f66SKevin Wolf      "size": $size
79*0b7e7f66SKevin Wolf  }
80*0b7e7f66SKevin Wolf}
81*0b7e7f66SKevin Wolf{ "execute": "quit" }
82*0b7e7f66SKevin WolfEOF
83*0b7e7f66SKevin Wolf
84*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
85*0b7e7f66SKevin Wolf
86*0b7e7f66SKevin Wolfecho
87*0b7e7f66SKevin Wolfecho "=== Successful image creation (explicit defaults) ==="
88*0b7e7f66SKevin Wolfecho
89*0b7e7f66SKevin Wolf
90*0b7e7f66SKevin Wolf# Choose a different size to show that we got a new image
91*0b7e7f66SKevin Wolfsize=$((64 * 1024 * 1024))
92*0b7e7f66SKevin Wolf
93*0b7e7f66SKevin Wolfrun_qemu <<EOF
94*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
95*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
96*0b7e7f66SKevin Wolf  "arguments": {
97*0b7e7f66SKevin Wolf      "driver": "file",
98*0b7e7f66SKevin Wolf      "filename": "$TEST_IMG",
99*0b7e7f66SKevin Wolf      "size": 0
100*0b7e7f66SKevin Wolf  }
101*0b7e7f66SKevin Wolf}
102*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
103*0b7e7f66SKevin Wolf  "arguments": {
104*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
105*0b7e7f66SKevin Wolf      "file": {
106*0b7e7f66SKevin Wolf          "driver": "file",
107*0b7e7f66SKevin Wolf          "filename": "$TEST_IMG"
108*0b7e7f66SKevin Wolf      },
109*0b7e7f66SKevin Wolf      "size": $size,
110*0b7e7f66SKevin Wolf      "log-size": 1048576,
111*0b7e7f66SKevin Wolf      "block-size": 8388608,
112*0b7e7f66SKevin Wolf      "subformat": "dynamic",
113*0b7e7f66SKevin Wolf      "block-state-zero": true
114*0b7e7f66SKevin Wolf  }
115*0b7e7f66SKevin Wolf}
116*0b7e7f66SKevin Wolf{ "execute": "quit" }
117*0b7e7f66SKevin WolfEOF
118*0b7e7f66SKevin Wolf
119*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
120*0b7e7f66SKevin Wolf
121*0b7e7f66SKevin Wolfecho
122*0b7e7f66SKevin Wolfecho "=== Successful image creation (with non-default options) ==="
123*0b7e7f66SKevin Wolfecho
124*0b7e7f66SKevin Wolf
125*0b7e7f66SKevin Wolf# Choose a different size to show that we got a new image
126*0b7e7f66SKevin Wolfsize=$((32 * 1024 * 1024))
127*0b7e7f66SKevin Wolf
128*0b7e7f66SKevin Wolfrun_qemu <<EOF
129*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
130*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
131*0b7e7f66SKevin Wolf  "arguments": {
132*0b7e7f66SKevin Wolf      "driver": "file",
133*0b7e7f66SKevin Wolf      "filename": "$TEST_IMG",
134*0b7e7f66SKevin Wolf      "size": 0
135*0b7e7f66SKevin Wolf  }
136*0b7e7f66SKevin Wolf}
137*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
138*0b7e7f66SKevin Wolf  "arguments": {
139*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
140*0b7e7f66SKevin Wolf      "file": {
141*0b7e7f66SKevin Wolf          "driver": "file",
142*0b7e7f66SKevin Wolf          "filename": "$TEST_IMG"
143*0b7e7f66SKevin Wolf      },
144*0b7e7f66SKevin Wolf      "size": $size,
145*0b7e7f66SKevin Wolf      "log-size": 8388608,
146*0b7e7f66SKevin Wolf      "block-size": 268435456,
147*0b7e7f66SKevin Wolf      "subformat": "fixed",
148*0b7e7f66SKevin Wolf      "block-state-zero": false
149*0b7e7f66SKevin Wolf  }
150*0b7e7f66SKevin Wolf}
151*0b7e7f66SKevin Wolf{ "execute": "quit" }
152*0b7e7f66SKevin WolfEOF
153*0b7e7f66SKevin Wolf
154*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
155*0b7e7f66SKevin Wolf
156*0b7e7f66SKevin Wolfecho
157*0b7e7f66SKevin Wolfecho "=== Invalid BlockdevRef ==="
158*0b7e7f66SKevin Wolfecho
159*0b7e7f66SKevin Wolf
160*0b7e7f66SKevin Wolfrun_qemu <<EOF
161*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
162*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
163*0b7e7f66SKevin Wolf  "arguments": {
164*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
165*0b7e7f66SKevin Wolf      "file": "this doesn't exist",
166*0b7e7f66SKevin Wolf      "size": $size
167*0b7e7f66SKevin Wolf  }
168*0b7e7f66SKevin Wolf}
169*0b7e7f66SKevin Wolf{ "execute": "quit" }
170*0b7e7f66SKevin WolfEOF
171*0b7e7f66SKevin Wolf
172*0b7e7f66SKevin Wolfecho
173*0b7e7f66SKevin Wolfecho "=== Zero size ==="
174*0b7e7f66SKevin Wolfecho
175*0b7e7f66SKevin Wolf
176*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
177*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
178*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
179*0b7e7f66SKevin Wolf  "arguments": {
180*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
181*0b7e7f66SKevin Wolf      "file": "node0",
182*0b7e7f66SKevin Wolf      "size": 0
183*0b7e7f66SKevin Wolf  }
184*0b7e7f66SKevin Wolf}
185*0b7e7f66SKevin Wolf{ "execute": "quit" }
186*0b7e7f66SKevin WolfEOF
187*0b7e7f66SKevin Wolf
188*0b7e7f66SKevin Wolf_img_info | _filter_img_info
189*0b7e7f66SKevin Wolf
190*0b7e7f66SKevin Wolfecho
191*0b7e7f66SKevin Wolfecho "=== Maximum size ==="
192*0b7e7f66SKevin Wolfecho
193*0b7e7f66SKevin Wolf
194*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
195*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
196*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
197*0b7e7f66SKevin Wolf  "arguments": {
198*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
199*0b7e7f66SKevin Wolf      "file": "node0",
200*0b7e7f66SKevin Wolf      "size": 70368744177664
201*0b7e7f66SKevin Wolf  }
202*0b7e7f66SKevin Wolf}
203*0b7e7f66SKevin Wolf{ "execute": "quit" }
204*0b7e7f66SKevin WolfEOF
205*0b7e7f66SKevin Wolf
206*0b7e7f66SKevin Wolf_img_info | _filter_img_info
207*0b7e7f66SKevin Wolf
208*0b7e7f66SKevin Wolfecho
209*0b7e7f66SKevin Wolfecho "=== Invalid sizes ==="
210*0b7e7f66SKevin Wolfecho
211*0b7e7f66SKevin Wolf
212*0b7e7f66SKevin Wolf# TODO Negative image sizes aren't handled correctly, but this is a problem
213*0b7e7f66SKevin Wolf# with QAPI's implementation of the 'size' type and affects other commands as
214*0b7e7f66SKevin Wolf# well. Once this is fixed, we may want to add a test case here.
215*0b7e7f66SKevin Wolf
216*0b7e7f66SKevin Wolf# 1. 2^64 - 512
217*0b7e7f66SKevin Wolf# 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
218*0b7e7f66SKevin Wolf# 3. 2^63 - 512 (generally valid, but with the image header the file will
219*0b7e7f66SKevin Wolf#                exceed 63 bits)
220*0b7e7f66SKevin Wolf# 4. 2^46 + 1 (one byte more than maximum image size)
221*0b7e7f66SKevin Wolf
222*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
223*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
224*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
225*0b7e7f66SKevin Wolf  "arguments": {
226*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
227*0b7e7f66SKevin Wolf      "file": "node0",
228*0b7e7f66SKevin Wolf      "size": 18446744073709551104
229*0b7e7f66SKevin Wolf  }
230*0b7e7f66SKevin Wolf}
231*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
232*0b7e7f66SKevin Wolf  "arguments": {
233*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
234*0b7e7f66SKevin Wolf      "file": "node0",
235*0b7e7f66SKevin Wolf      "size": 9223372036854775808
236*0b7e7f66SKevin Wolf  }
237*0b7e7f66SKevin Wolf}
238*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
239*0b7e7f66SKevin Wolf  "arguments": {
240*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
241*0b7e7f66SKevin Wolf      "file": "node0",
242*0b7e7f66SKevin Wolf      "size": 9223372036854775296
243*0b7e7f66SKevin Wolf  }
244*0b7e7f66SKevin Wolf}
245*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
246*0b7e7f66SKevin Wolf  "arguments": {
247*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
248*0b7e7f66SKevin Wolf      "file": "node0",
249*0b7e7f66SKevin Wolf      "size": 70368744177665
250*0b7e7f66SKevin Wolf  }
251*0b7e7f66SKevin Wolf}
252*0b7e7f66SKevin Wolf{ "execute": "quit" }
253*0b7e7f66SKevin WolfEOF
254*0b7e7f66SKevin Wolf
255*0b7e7f66SKevin Wolfecho
256*0b7e7f66SKevin Wolfecho "=== Invalid block size ==="
257*0b7e7f66SKevin Wolfecho
258*0b7e7f66SKevin Wolf
259*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
260*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
261*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
262*0b7e7f66SKevin Wolf  "arguments": {
263*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
264*0b7e7f66SKevin Wolf      "file": "node0",
265*0b7e7f66SKevin Wolf      "size": 67108864,
266*0b7e7f66SKevin Wolf      "block-size": 1234567
267*0b7e7f66SKevin Wolf  }
268*0b7e7f66SKevin Wolf}
269*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
270*0b7e7f66SKevin Wolf  "arguments": {
271*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
272*0b7e7f66SKevin Wolf      "file": "node0",
273*0b7e7f66SKevin Wolf      "size": 67108864,
274*0b7e7f66SKevin Wolf      "block-size": 128
275*0b7e7f66SKevin Wolf  }
276*0b7e7f66SKevin Wolf}
277*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
278*0b7e7f66SKevin Wolf  "arguments": {
279*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
280*0b7e7f66SKevin Wolf      "file": "node0",
281*0b7e7f66SKevin Wolf      "size": 67108864,
282*0b7e7f66SKevin Wolf      "block-size": 3145728
283*0b7e7f66SKevin Wolf  }
284*0b7e7f66SKevin Wolf}
285*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
286*0b7e7f66SKevin Wolf  "arguments": {
287*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
288*0b7e7f66SKevin Wolf      "file": "node0",
289*0b7e7f66SKevin Wolf      "size": 67108864,
290*0b7e7f66SKevin Wolf      "block-size": 536870912
291*0b7e7f66SKevin Wolf  }
292*0b7e7f66SKevin Wolf}
293*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
294*0b7e7f66SKevin Wolf  "arguments": {
295*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
296*0b7e7f66SKevin Wolf      "file": "node0",
297*0b7e7f66SKevin Wolf      "size": 67108864,
298*0b7e7f66SKevin Wolf      "block-size": 0
299*0b7e7f66SKevin Wolf  }
300*0b7e7f66SKevin Wolf}
301*0b7e7f66SKevin Wolf{ "execute": "quit" }
302*0b7e7f66SKevin WolfEOF
303*0b7e7f66SKevin Wolf
304*0b7e7f66SKevin Wolfecho
305*0b7e7f66SKevin Wolfecho "=== Invalid log size ==="
306*0b7e7f66SKevin Wolfecho
307*0b7e7f66SKevin Wolf
308*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
309*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" }
310*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
311*0b7e7f66SKevin Wolf  "arguments": {
312*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
313*0b7e7f66SKevin Wolf      "file": "node0",
314*0b7e7f66SKevin Wolf      "size": 67108864,
315*0b7e7f66SKevin Wolf      "log-size": 1234567
316*0b7e7f66SKevin Wolf  }
317*0b7e7f66SKevin Wolf}
318*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
319*0b7e7f66SKevin Wolf  "arguments": {
320*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
321*0b7e7f66SKevin Wolf      "file": "node0",
322*0b7e7f66SKevin Wolf      "size": 67108864,
323*0b7e7f66SKevin Wolf      "log-size": 128
324*0b7e7f66SKevin Wolf  }
325*0b7e7f66SKevin Wolf}
326*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
327*0b7e7f66SKevin Wolf  "arguments": {
328*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
329*0b7e7f66SKevin Wolf      "file": "node0",
330*0b7e7f66SKevin Wolf      "size": 67108864,
331*0b7e7f66SKevin Wolf      "log-size": 4294967296
332*0b7e7f66SKevin Wolf  }
333*0b7e7f66SKevin Wolf}
334*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create",
335*0b7e7f66SKevin Wolf  "arguments": {
336*0b7e7f66SKevin Wolf      "driver": "$IMGFMT",
337*0b7e7f66SKevin Wolf      "file": "node0",
338*0b7e7f66SKevin Wolf      "size": 67108864,
339*0b7e7f66SKevin Wolf      "log-size": 0
340*0b7e7f66SKevin Wolf  }
341*0b7e7f66SKevin Wolf}
342*0b7e7f66SKevin Wolf{ "execute": "quit" }
343*0b7e7f66SKevin WolfEOF
344*0b7e7f66SKevin Wolf
345*0b7e7f66SKevin Wolf
346*0b7e7f66SKevin Wolf# success, all done
347*0b7e7f66SKevin Wolfecho "*** done"
348*0b7e7f66SKevin Wolfrm -f $seq.full
349*0b7e7f66SKevin Wolfstatus=0
350