xref: /openbmc/qemu/tests/qemu-iotests/211 (revision b7de0777)
1*b7de0777SKevin Wolf#!/bin/bash
2*b7de0777SKevin Wolf#
3*b7de0777SKevin Wolf# Test VDI and file image creation
4*b7de0777SKevin Wolf#
5*b7de0777SKevin Wolf# Copyright (C) 2018 Red Hat, Inc.
6*b7de0777SKevin Wolf#
7*b7de0777SKevin Wolf# This program is free software; you can redistribute it and/or modify
8*b7de0777SKevin Wolf# it under the terms of the GNU General Public License as published by
9*b7de0777SKevin Wolf# the Free Software Foundation; either version 2 of the License, or
10*b7de0777SKevin Wolf# (at your option) any later version.
11*b7de0777SKevin Wolf#
12*b7de0777SKevin Wolf# This program is distributed in the hope that it will be useful,
13*b7de0777SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of
14*b7de0777SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*b7de0777SKevin Wolf# GNU General Public License for more details.
16*b7de0777SKevin Wolf#
17*b7de0777SKevin Wolf# You should have received a copy of the GNU General Public License
18*b7de0777SKevin Wolf# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19*b7de0777SKevin Wolf#
20*b7de0777SKevin Wolf
21*b7de0777SKevin Wolf# creator
22*b7de0777SKevin Wolfowner=kwolf@redhat.com
23*b7de0777SKevin Wolf
24*b7de0777SKevin Wolfseq=`basename $0`
25*b7de0777SKevin Wolfecho "QA output created by $seq"
26*b7de0777SKevin Wolf
27*b7de0777SKevin Wolfhere=`pwd`
28*b7de0777SKevin Wolfstatus=1	# failure is the default!
29*b7de0777SKevin Wolf
30*b7de0777SKevin Wolf# get standard environment, filters and checks
31*b7de0777SKevin Wolf. ./common.rc
32*b7de0777SKevin Wolf. ./common.filter
33*b7de0777SKevin Wolf
34*b7de0777SKevin Wolf_supported_fmt vdi
35*b7de0777SKevin Wolf_supported_proto file
36*b7de0777SKevin Wolf_supported_os Linux
37*b7de0777SKevin Wolf
38*b7de0777SKevin Wolffunction do_run_qemu()
39*b7de0777SKevin Wolf{
40*b7de0777SKevin Wolf    echo Testing: "$@"
41*b7de0777SKevin Wolf    $QEMU -nographic -qmp stdio -serial none "$@"
42*b7de0777SKevin Wolf    echo
43*b7de0777SKevin Wolf}
44*b7de0777SKevin Wolf
45*b7de0777SKevin Wolffunction run_qemu()
46*b7de0777SKevin Wolf{
47*b7de0777SKevin Wolf    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
48*b7de0777SKevin Wolf                          | _filter_qemu | _filter_imgfmt \
49*b7de0777SKevin Wolf                          | _filter_actual_image_size
50*b7de0777SKevin Wolf}
51*b7de0777SKevin Wolf
52*b7de0777SKevin Wolfecho
53*b7de0777SKevin Wolfecho "=== Successful image creation (defaults) ==="
54*b7de0777SKevin Wolfecho
55*b7de0777SKevin Wolf
56*b7de0777SKevin Wolfsize=$((128 * 1024 * 1024))
57*b7de0777SKevin Wolf
58*b7de0777SKevin Wolfrun_qemu <<EOF
59*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
60*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
61*b7de0777SKevin Wolf  "arguments": {
62*b7de0777SKevin Wolf      "driver": "file",
63*b7de0777SKevin Wolf      "filename": "$TEST_IMG",
64*b7de0777SKevin Wolf      "size": 0
65*b7de0777SKevin Wolf  }
66*b7de0777SKevin Wolf}
67*b7de0777SKevin Wolf{ "execute": "blockdev-add",
68*b7de0777SKevin Wolf  "arguments": {
69*b7de0777SKevin Wolf      "driver": "file",
70*b7de0777SKevin Wolf      "node-name": "imgfile",
71*b7de0777SKevin Wolf      "filename": "$TEST_IMG"
72*b7de0777SKevin Wolf  }
73*b7de0777SKevin Wolf}
74*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
75*b7de0777SKevin Wolf  "arguments": {
76*b7de0777SKevin Wolf      "driver": "$IMGFMT",
77*b7de0777SKevin Wolf      "file": "imgfile",
78*b7de0777SKevin Wolf      "size": $size
79*b7de0777SKevin Wolf  }
80*b7de0777SKevin Wolf}
81*b7de0777SKevin Wolf{ "execute": "quit" }
82*b7de0777SKevin WolfEOF
83*b7de0777SKevin Wolf
84*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
85*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map
86*b7de0777SKevin Wolf
87*b7de0777SKevin Wolfecho
88*b7de0777SKevin Wolfecho "=== Successful image creation (explicit defaults) ==="
89*b7de0777SKevin Wolfecho
90*b7de0777SKevin Wolf
91*b7de0777SKevin Wolf# Choose a different size to show that we got a new image
92*b7de0777SKevin Wolfsize=$((64 * 1024 * 1024))
93*b7de0777SKevin Wolf
94*b7de0777SKevin Wolfrun_qemu <<EOF
95*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
96*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
97*b7de0777SKevin Wolf  "arguments": {
98*b7de0777SKevin Wolf      "driver": "file",
99*b7de0777SKevin Wolf      "filename": "$TEST_IMG",
100*b7de0777SKevin Wolf      "size": 0
101*b7de0777SKevin Wolf  }
102*b7de0777SKevin Wolf}
103*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
104*b7de0777SKevin Wolf  "arguments": {
105*b7de0777SKevin Wolf      "driver": "$IMGFMT",
106*b7de0777SKevin Wolf      "file": {
107*b7de0777SKevin Wolf          "driver": "file",
108*b7de0777SKevin Wolf          "filename": "$TEST_IMG"
109*b7de0777SKevin Wolf      },
110*b7de0777SKevin Wolf      "size": $size,
111*b7de0777SKevin Wolf      "preallocation": "off"
112*b7de0777SKevin Wolf  }
113*b7de0777SKevin Wolf}
114*b7de0777SKevin Wolf{ "execute": "quit" }
115*b7de0777SKevin WolfEOF
116*b7de0777SKevin Wolf
117*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
118*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map
119*b7de0777SKevin Wolf
120*b7de0777SKevin Wolfecho
121*b7de0777SKevin Wolfecho "=== Successful image creation (with non-default options) ==="
122*b7de0777SKevin Wolfecho
123*b7de0777SKevin Wolf
124*b7de0777SKevin Wolf# Choose a different size to show that we got a new image
125*b7de0777SKevin Wolfsize=$((32 * 1024 * 1024))
126*b7de0777SKevin Wolf
127*b7de0777SKevin Wolfrun_qemu <<EOF
128*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
129*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
130*b7de0777SKevin Wolf  "arguments": {
131*b7de0777SKevin Wolf      "driver": "file",
132*b7de0777SKevin Wolf      "filename": "$TEST_IMG",
133*b7de0777SKevin Wolf      "size": 0
134*b7de0777SKevin Wolf  }
135*b7de0777SKevin Wolf}
136*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
137*b7de0777SKevin Wolf  "arguments": {
138*b7de0777SKevin Wolf      "driver": "$IMGFMT",
139*b7de0777SKevin Wolf      "file": {
140*b7de0777SKevin Wolf          "driver": "file",
141*b7de0777SKevin Wolf          "filename": "$TEST_IMG"
142*b7de0777SKevin Wolf      },
143*b7de0777SKevin Wolf      "size": $size,
144*b7de0777SKevin Wolf      "preallocation": "metadata"
145*b7de0777SKevin Wolf  }
146*b7de0777SKevin Wolf}
147*b7de0777SKevin Wolf{ "execute": "quit" }
148*b7de0777SKevin WolfEOF
149*b7de0777SKevin Wolf
150*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific
151*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map
152*b7de0777SKevin Wolf
153*b7de0777SKevin Wolfecho
154*b7de0777SKevin Wolfecho "=== Invalid BlockdevRef ==="
155*b7de0777SKevin Wolfecho
156*b7de0777SKevin Wolf
157*b7de0777SKevin Wolfrun_qemu <<EOF
158*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
159*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
160*b7de0777SKevin Wolf  "arguments": {
161*b7de0777SKevin Wolf      "driver": "$IMGFMT",
162*b7de0777SKevin Wolf      "file": "this doesn't exist",
163*b7de0777SKevin Wolf      "size": $size
164*b7de0777SKevin Wolf  }
165*b7de0777SKevin Wolf}
166*b7de0777SKevin Wolf{ "execute": "quit" }
167*b7de0777SKevin WolfEOF
168*b7de0777SKevin Wolf
169*b7de0777SKevin Wolfecho
170*b7de0777SKevin Wolfecho "=== Zero size ==="
171*b7de0777SKevin Wolfecho
172*b7de0777SKevin Wolf
173*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
174*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
175*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
176*b7de0777SKevin Wolf  "arguments": {
177*b7de0777SKevin Wolf      "driver": "$IMGFMT",
178*b7de0777SKevin Wolf      "file": "node0",
179*b7de0777SKevin Wolf      "size": 0
180*b7de0777SKevin Wolf  }
181*b7de0777SKevin Wolf}
182*b7de0777SKevin Wolf{ "execute": "quit" }
183*b7de0777SKevin WolfEOF
184*b7de0777SKevin Wolf
185*b7de0777SKevin Wolf_img_info | _filter_img_info
186*b7de0777SKevin Wolf
187*b7de0777SKevin Wolfecho
188*b7de0777SKevin Wolfecho "=== Maximum size ==="
189*b7de0777SKevin Wolfecho
190*b7de0777SKevin Wolf
191*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
192*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
193*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
194*b7de0777SKevin Wolf  "arguments": {
195*b7de0777SKevin Wolf      "driver": "$IMGFMT",
196*b7de0777SKevin Wolf      "file": "node0",
197*b7de0777SKevin Wolf      "size": 562949819203584
198*b7de0777SKevin Wolf  }
199*b7de0777SKevin Wolf}
200*b7de0777SKevin Wolf{ "execute": "quit" }
201*b7de0777SKevin WolfEOF
202*b7de0777SKevin Wolf
203*b7de0777SKevin Wolf_img_info | _filter_img_info
204*b7de0777SKevin Wolf
205*b7de0777SKevin Wolfecho
206*b7de0777SKevin Wolfecho "=== Invalid sizes ==="
207*b7de0777SKevin Wolfecho
208*b7de0777SKevin Wolf
209*b7de0777SKevin Wolf# TODO Negative image sizes aren't handled correctly, but this is a problem
210*b7de0777SKevin Wolf# with QAPI's implementation of the 'size' type and affects other commands as
211*b7de0777SKevin Wolf# well. Once this is fixed, we may want to add a test case here.
212*b7de0777SKevin Wolf
213*b7de0777SKevin Wolf# 1. 2^64 - 512
214*b7de0777SKevin Wolf# 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
215*b7de0777SKevin Wolf# 3. 0x1fffff8000001 (one byte more than maximum image size for VDI)
216*b7de0777SKevin Wolf
217*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF
218*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" }
219*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
220*b7de0777SKevin Wolf  "arguments": {
221*b7de0777SKevin Wolf      "driver": "$IMGFMT",
222*b7de0777SKevin Wolf      "file": "node0",
223*b7de0777SKevin Wolf      "size": 18446744073709551104
224*b7de0777SKevin Wolf  }
225*b7de0777SKevin Wolf}
226*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
227*b7de0777SKevin Wolf  "arguments": {
228*b7de0777SKevin Wolf      "driver": "$IMGFMT",
229*b7de0777SKevin Wolf      "file": "node0",
230*b7de0777SKevin Wolf      "size": 9223372036854775808
231*b7de0777SKevin Wolf  }
232*b7de0777SKevin Wolf}
233*b7de0777SKevin Wolf{ "execute": "x-blockdev-create",
234*b7de0777SKevin Wolf  "arguments": {
235*b7de0777SKevin Wolf      "driver": "$IMGFMT",
236*b7de0777SKevin Wolf      "file": "node0",
237*b7de0777SKevin Wolf      "size": 562949819203585
238*b7de0777SKevin Wolf  }
239*b7de0777SKevin Wolf}
240*b7de0777SKevin Wolf{ "execute": "quit" }
241*b7de0777SKevin WolfEOF
242*b7de0777SKevin Wolf
243*b7de0777SKevin Wolf# success, all done
244*b7de0777SKevin Wolfecho "*** done"
245*b7de0777SKevin Wolfrm -f $seq.full
246*b7de0777SKevin Wolfstatus=0
247