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