blob: d12d7cb56618503de2c38ee67c08413952d5ec0d [file] [log] [blame]
Philippe Mathieu-Daudé7c477522020-01-30 17:32:30 +01001#!/usr/bin/env python3
Kevin Wolf39218a72018-02-07 16:42:44 +01002#
3# Test qcow2 and file image creation
4#
5# Copyright (C) 2018 Red Hat, Inc.
6#
Kevin Wolf4de110f2018-05-23 18:19:00 +02007# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
8#
Kevin Wolf39218a72018-02-07 16:42:44 +01009# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
21#
22
Kevin Wolf4de110f2018-05-23 18:19:00 +020023import iotests
24from iotests import imgfmt
Kevin Wolf39218a72018-02-07 16:42:44 +010025
Max Reitzeda7a9c2020-10-27 20:05:53 +010026iotests.script_initialize(supported_fmts=['qcow2'],
27 supported_protocols=['file'])
Max Reitzd2a839e2020-06-25 14:55:35 +020028iotests.verify_working_luks()
Kevin Wolf39218a72018-02-07 16:42:44 +010029
Kevin Wolf4de110f2018-05-23 18:19:00 +020030with iotests.FilePath('t.qcow2') as disk_path, \
31 iotests.FilePath('t.qcow2.base') as backing_path, \
32 iotests.VM() as vm:
Kevin Wolf39218a72018-02-07 16:42:44 +010033
Kevin Wolf4de110f2018-05-23 18:19:00 +020034 vm.add_object('secret,id=keysec0,data=foo')
Kevin Wolf39218a72018-02-07 16:42:44 +010035
Kevin Wolf4de110f2018-05-23 18:19:00 +020036 #
37 # Successful image creation (defaults)
38 #
39 iotests.log("=== Successful image creation (defaults) ===")
40 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +010041
Kevin Wolf4de110f2018-05-23 18:19:00 +020042 size = 128 * 1024 * 1024
Kevin Wolf39218a72018-02-07 16:42:44 +010043
Kevin Wolf4de110f2018-05-23 18:19:00 +020044 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +010045 vm.blockdev_create({ 'driver': 'file',
46 'filename': disk_path,
47 'size': 0 })
Kevin Wolf39218a72018-02-07 16:42:44 +010048
John Snowf8ca8602018-12-21 04:35:26 -050049 vm.qmp_log('blockdev-add',
John Snow08fcd612018-12-21 04:35:27 -050050 filters=[iotests.filter_qmp_testfiles],
John Snowf8ca8602018-12-21 04:35:26 -050051 driver='file', filename=disk_path,
Kevin Wolf4de110f2018-05-23 18:19:00 +020052 node_name='imgfile')
Kevin Wolf39218a72018-02-07 16:42:44 +010053
Kevin Wolff6da1732019-12-16 17:57:19 +010054 vm.blockdev_create({ 'driver': imgfmt,
55 'file': 'imgfile',
56 'size': size })
Kevin Wolf4de110f2018-05-23 18:19:00 +020057 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +010058
Kevin Wolf4de110f2018-05-23 18:19:00 +020059 iotests.img_info_log(disk_path)
Kevin Wolf39218a72018-02-07 16:42:44 +010060
Kevin Wolf4de110f2018-05-23 18:19:00 +020061 #
62 # Successful image creation (inline blockdev-add, explicit defaults)
63 #
64 iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===")
65 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +010066
Kevin Wolf4de110f2018-05-23 18:19:00 +020067 # Choose a different size to show that we got a new image
68 size = 64 * 1024 * 1024
Kevin Wolf39218a72018-02-07 16:42:44 +010069
Kevin Wolf4de110f2018-05-23 18:19:00 +020070 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +010071 vm.blockdev_create({ 'driver': 'file',
72 'filename': disk_path,
73 'size': 0,
74 'preallocation': 'off',
75 'nocow': False })
Kevin Wolf39218a72018-02-07 16:42:44 +010076
Kevin Wolff6da1732019-12-16 17:57:19 +010077 vm.blockdev_create({ 'driver': imgfmt,
78 'file': {
79 'driver': 'file',
80 'filename': disk_path,
81 },
82 'size': size,
83 'version': 'v3',
84 'cluster-size': 65536,
85 'preallocation': 'off',
86 'lazy-refcounts': False,
87 'refcount-bits': 16 })
Kevin Wolf4de110f2018-05-23 18:19:00 +020088 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +010089
Kevin Wolf4de110f2018-05-23 18:19:00 +020090 iotests.img_info_log(disk_path)
Kevin Wolf39218a72018-02-07 16:42:44 +010091
Kevin Wolf4de110f2018-05-23 18:19:00 +020092 #
93 # Successful image creation (v3 non-default options)
94 #
95 iotests.log("=== Successful image creation (v3 non-default options) ===")
96 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +010097
Kevin Wolf4de110f2018-05-23 18:19:00 +020098 # Choose a different size to show that we got a new image
99 size = 32 * 1024 * 1024
Kevin Wolf39218a72018-02-07 16:42:44 +0100100
Kevin Wolf4de110f2018-05-23 18:19:00 +0200101 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100102 vm.blockdev_create({ 'driver': 'file',
103 'filename': disk_path,
104 'size': 0,
105 'preallocation': 'falloc',
106 'nocow': True })
Kevin Wolf39218a72018-02-07 16:42:44 +0100107
Kevin Wolff6da1732019-12-16 17:57:19 +0100108 vm.blockdev_create({ 'driver': imgfmt,
109 'file': {
110 'driver': 'file',
111 'filename': disk_path,
112 },
113 'size': size,
114 'version': 'v3',
115 'cluster-size': 2097152,
116 'preallocation': 'metadata',
117 'lazy-refcounts': True,
118 'refcount-bits': 1 })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200119 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100120
Kevin Wolf4de110f2018-05-23 18:19:00 +0200121 iotests.img_info_log(disk_path)
Kevin Wolf39218a72018-02-07 16:42:44 +0100122
Kevin Wolf4de110f2018-05-23 18:19:00 +0200123 #
124 # Successful image creation (v2 non-default options)
125 #
126 iotests.log("=== Successful image creation (v2 non-default options) ===")
127 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +0100128
Kevin Wolf4de110f2018-05-23 18:19:00 +0200129 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100130 vm.blockdev_create({ 'driver': 'file',
131 'filename': disk_path,
132 'size': 0 })
Kevin Wolf39218a72018-02-07 16:42:44 +0100133
Kevin Wolff6da1732019-12-16 17:57:19 +0100134 vm.blockdev_create({ 'driver': imgfmt,
135 'file': {
136 'driver': 'file',
137 'filename': disk_path,
138 },
139 'size': size,
140 'backing-file': backing_path,
141 'backing-fmt': 'qcow2',
142 'version': 'v2',
143 'cluster-size': 512 })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200144 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100145
Kevin Wolf4de110f2018-05-23 18:19:00 +0200146 iotests.img_info_log(disk_path)
Kevin Wolf39218a72018-02-07 16:42:44 +0100147
Kevin Wolf4de110f2018-05-23 18:19:00 +0200148 #
149 # Successful image creation (encrypted)
150 #
151 iotests.log("=== Successful image creation (encrypted) ===")
152 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +0100153
Kevin Wolf4de110f2018-05-23 18:19:00 +0200154 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100155 vm.blockdev_create({ 'driver': imgfmt,
156 'file': {
157 'driver': 'file',
158 'filename': disk_path,
159 },
160 'size': size,
161 'encrypt': {
162 'format': 'luks',
163 'key-secret': 'keysec0',
164 'cipher-alg': 'twofish-128',
165 'cipher-mode': 'ctr',
166 'ivgen-alg': 'plain64',
167 'ivgen-hash-alg': 'md5',
168 'hash-alg': 'sha1',
169 'iter-time': 10,
170 }})
Kevin Wolf4de110f2018-05-23 18:19:00 +0200171 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100172
Kevin Wolf4de110f2018-05-23 18:19:00 +0200173 iotests.img_info_log(disk_path)
Kevin Wolf39218a72018-02-07 16:42:44 +0100174
Kevin Wolf4de110f2018-05-23 18:19:00 +0200175 #
176 # Invalid BlockdevRef
177 #
178 iotests.log("=== Invalid BlockdevRef ===")
179 iotests.log("")
Kevin Wolf39218a72018-02-07 16:42:44 +0100180
Kevin Wolf4de110f2018-05-23 18:19:00 +0200181 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100182 vm.blockdev_create({ 'driver': imgfmt,
183 'file': "this doesn't exist",
184 'size': size })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200185 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100186
Kevin Wolf4de110f2018-05-23 18:19:00 +0200187 #
188 # Invalid sizes
189 #
190 iotests.log("=== Invalid sizes ===")
Kevin Wolf39218a72018-02-07 16:42:44 +0100191
Kevin Wolf4de110f2018-05-23 18:19:00 +0200192 # TODO Negative image sizes aren't handled correctly, but this is a problem
193 # with QAPI's implementation of the 'size' type and affects other commands
194 # as well. Once this is fixed, we may want to add a test case here.
195 #
196 # 1. Misaligned image size
197 # 2. 2^64 - 512
198 # 3. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
199 # 4. 2^63 - 512 (generally valid, but qcow2 can't handle images this size)
Kevin Wolf39218a72018-02-07 16:42:44 +0100200
Kevin Wolf4de110f2018-05-23 18:19:00 +0200201 vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))
Kevin Wolf39218a72018-02-07 16:42:44 +0100202
Kevin Wolf4de110f2018-05-23 18:19:00 +0200203 vm.launch()
204 for size in [ 1234, 18446744073709551104, 9223372036854775808,
Vladimir Sementsov-Ogievskiy8b117002020-12-04 01:27:13 +0300205 9223372036854775296, 9223372035781033984 ]:
Kevin Wolff6da1732019-12-16 17:57:19 +0100206 vm.blockdev_create({ 'driver': imgfmt,
207 'file': 'node0',
208 'size': size })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200209 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100210
Kevin Wolf4de110f2018-05-23 18:19:00 +0200211 #
212 # Invalid version
213 #
214 iotests.log("=== Invalid version ===")
Kevin Wolf39218a72018-02-07 16:42:44 +0100215
Kevin Wolf4de110f2018-05-23 18:19:00 +0200216 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100217 vm.blockdev_create({ 'driver': imgfmt,
218 'file': 'node0',
219 'size': 67108864,
220 'version': 'v1' })
221 vm.blockdev_create({ 'driver': imgfmt,
222 'file': 'node0',
223 'size': 67108864,
224 'version': 'v2',
225 'lazy-refcounts': True })
226 vm.blockdev_create({ 'driver': imgfmt,
227 'file': 'node0',
228 'size': 67108864,
229 'version': 'v2',
230 'refcount-bits': 8 })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200231 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100232
Kevin Wolf4de110f2018-05-23 18:19:00 +0200233 #
234 # Invalid backing file options
235 #
236 iotests.log("=== Invalid backing file options ===")
Kevin Wolf39218a72018-02-07 16:42:44 +0100237
Kevin Wolf4de110f2018-05-23 18:19:00 +0200238 vm.launch()
Kevin Wolff6da1732019-12-16 17:57:19 +0100239 vm.blockdev_create({ 'driver': imgfmt,
240 'file': 'node0',
241 'size': 67108864,
242 'backing-file': '/dev/null',
243 'preallocation': 'full' })
244 vm.blockdev_create({ 'driver': imgfmt,
245 'file': 'node0',
246 'size': 67108864,
247 'backing-fmt': imgfmt })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200248 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100249
Kevin Wolf4de110f2018-05-23 18:19:00 +0200250 #
251 # Invalid cluster size
252 #
253 iotests.log("=== Invalid cluster size ===")
Kevin Wolf39218a72018-02-07 16:42:44 +0100254
Kevin Wolf4de110f2018-05-23 18:19:00 +0200255 vm.launch()
256 for csize in [ 1234, 128, 4194304, 0 ]:
Kevin Wolff6da1732019-12-16 17:57:19 +0100257 vm.blockdev_create({ 'driver': imgfmt,
258 'file': 'node0',
259 'size': 67108864,
260 'cluster-size': csize })
261 vm.blockdev_create({ 'driver': imgfmt,
262 'file': 'node0',
263 'size': 281474976710656,
264 'cluster-size': 512 })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200265 vm.shutdown()
Kevin Wolf39218a72018-02-07 16:42:44 +0100266
Kevin Wolf4de110f2018-05-23 18:19:00 +0200267 #
268 # Invalid refcount width
269 #
270 iotests.log("=== Invalid refcount width ===")
271
272 vm.launch()
273 for refcount_bits in [ 128, 0, 7 ]:
Kevin Wolff6da1732019-12-16 17:57:19 +0100274 vm.blockdev_create({ 'driver': imgfmt,
275 'file': 'node0',
276 'size': 67108864,
277 'refcount-bits': refcount_bits })
Kevin Wolf4de110f2018-05-23 18:19:00 +0200278 vm.shutdown()