xref: /qemu/tests/qemu-iotests/206 (revision 8b1170012b1de6649c66ac1887f4df7e312abf3b)
17c477526SPhilippe Mathieu-Daudé#!/usr/bin/env python3
239218a77SKevin Wolf#
339218a77SKevin Wolf# Test qcow2 and file image creation
439218a77SKevin Wolf#
539218a77SKevin Wolf# Copyright (C) 2018 Red Hat, Inc.
639218a77SKevin Wolf#
74de110f8SKevin Wolf# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
84de110f8SKevin Wolf#
939218a77SKevin Wolf# This program is free software; you can redistribute it and/or modify
1039218a77SKevin Wolf# it under the terms of the GNU General Public License as published by
1139218a77SKevin Wolf# the Free Software Foundation; either version 2 of the License, or
1239218a77SKevin Wolf# (at your option) any later version.
1339218a77SKevin Wolf#
1439218a77SKevin Wolf# This program is distributed in the hope that it will be useful,
1539218a77SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of
1639218a77SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1739218a77SKevin Wolf# GNU General Public License for more details.
1839218a77SKevin Wolf#
1939218a77SKevin Wolf# You should have received a copy of the GNU General Public License
2039218a77SKevin Wolf# along with this program.  If not, see <http://www.gnu.org/licenses/>.
2139218a77SKevin Wolf#
2239218a77SKevin Wolf
234de110f8SKevin Wolfimport iotests
244de110f8SKevin Wolffrom iotests import imgfmt
2539218a77SKevin Wolf
26eda7a9c5SMax Reitziotests.script_initialize(supported_fmts=['qcow2'],
27eda7a9c5SMax Reitz                          supported_protocols=['file'])
28d2a839edSMax Reitziotests.verify_working_luks()
2939218a77SKevin Wolf
304de110f8SKevin Wolfwith iotests.FilePath('t.qcow2') as disk_path, \
314de110f8SKevin Wolf     iotests.FilePath('t.qcow2.base') as backing_path, \
324de110f8SKevin Wolf     iotests.VM() as vm:
3339218a77SKevin Wolf
344de110f8SKevin Wolf    vm.add_object('secret,id=keysec0,data=foo')
3539218a77SKevin Wolf
364de110f8SKevin Wolf    #
374de110f8SKevin Wolf    # Successful image creation (defaults)
384de110f8SKevin Wolf    #
394de110f8SKevin Wolf    iotests.log("=== Successful image creation (defaults) ===")
404de110f8SKevin Wolf    iotests.log("")
4139218a77SKevin Wolf
424de110f8SKevin Wolf    size = 128 * 1024 * 1024
4339218a77SKevin Wolf
444de110f8SKevin Wolf    vm.launch()
45f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': 'file',
464de110f8SKevin Wolf                         'filename': disk_path,
474de110f8SKevin Wolf                         'size': 0 })
4839218a77SKevin Wolf
49f8ca8609SJohn Snow    vm.qmp_log('blockdev-add',
5008fcd611SJohn Snow               filters=[iotests.filter_qmp_testfiles],
51f8ca8609SJohn Snow               driver='file', filename=disk_path,
524de110f8SKevin Wolf               node_name='imgfile')
5339218a77SKevin Wolf
54f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
554de110f8SKevin Wolf                         'file': 'imgfile',
564de110f8SKevin Wolf                         'size': size })
574de110f8SKevin Wolf    vm.shutdown()
5839218a77SKevin Wolf
594de110f8SKevin Wolf    iotests.img_info_log(disk_path)
604de110f8SKevin Wolf
614de110f8SKevin Wolf    #
624de110f8SKevin Wolf    # Successful image creation (inline blockdev-add, explicit defaults)
634de110f8SKevin Wolf    #
644de110f8SKevin Wolf    iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===")
654de110f8SKevin Wolf    iotests.log("")
6639218a77SKevin Wolf
6739218a77SKevin Wolf    # Choose a different size to show that we got a new image
684de110f8SKevin Wolf    size = 64 * 1024 * 1024
6939218a77SKevin Wolf
704de110f8SKevin Wolf    vm.launch()
71f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': 'file',
724de110f8SKevin Wolf                         'filename': disk_path,
734de110f8SKevin Wolf                         'size': 0,
744de110f8SKevin Wolf                         'preallocation': 'off',
754de110f8SKevin Wolf                         'nocow': False })
764de110f8SKevin Wolf
77f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
784de110f8SKevin Wolf                         'file': {
794de110f8SKevin Wolf                             'driver': 'file',
804de110f8SKevin Wolf                             'filename': disk_path,
8139218a77SKevin Wolf                         },
824de110f8SKevin Wolf                         'size': size,
834de110f8SKevin Wolf                         'version': 'v3',
844de110f8SKevin Wolf                         'cluster-size': 65536,
854de110f8SKevin Wolf                         'preallocation': 'off',
864de110f8SKevin Wolf                         'lazy-refcounts': False,
874de110f8SKevin Wolf                         'refcount-bits': 16 })
884de110f8SKevin Wolf    vm.shutdown()
8939218a77SKevin Wolf
904de110f8SKevin Wolf    iotests.img_info_log(disk_path)
9139218a77SKevin Wolf
924de110f8SKevin Wolf    #
934de110f8SKevin Wolf    # Successful image creation (v3 non-default options)
944de110f8SKevin Wolf    #
954de110f8SKevin Wolf    iotests.log("=== Successful image creation (v3 non-default options) ===")
964de110f8SKevin Wolf    iotests.log("")
9739218a77SKevin Wolf
9839218a77SKevin Wolf    # Choose a different size to show that we got a new image
994de110f8SKevin Wolf    size = 32 * 1024 * 1024
10039218a77SKevin Wolf
1014de110f8SKevin Wolf    vm.launch()
102f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': 'file',
1034de110f8SKevin Wolf                         'filename': disk_path,
1044de110f8SKevin Wolf                         'size': 0,
1054de110f8SKevin Wolf                         'preallocation': 'falloc',
1064de110f8SKevin Wolf                         'nocow': True })
1074de110f8SKevin Wolf
108f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
1094de110f8SKevin Wolf                         'file': {
1104de110f8SKevin Wolf                             'driver': 'file',
1114de110f8SKevin Wolf                             'filename': disk_path,
11239218a77SKevin Wolf                         },
1134de110f8SKevin Wolf                         'size': size,
1144de110f8SKevin Wolf                         'version': 'v3',
1154de110f8SKevin Wolf                         'cluster-size': 2097152,
1164de110f8SKevin Wolf                         'preallocation': 'metadata',
1174de110f8SKevin Wolf                         'lazy-refcounts': True,
1184de110f8SKevin Wolf                         'refcount-bits': 1 })
1194de110f8SKevin Wolf    vm.shutdown()
12039218a77SKevin Wolf
1214de110f8SKevin Wolf    iotests.img_info_log(disk_path)
12239218a77SKevin Wolf
1234de110f8SKevin Wolf    #
1244de110f8SKevin Wolf    # Successful image creation (v2 non-default options)
1254de110f8SKevin Wolf    #
1264de110f8SKevin Wolf    iotests.log("=== Successful image creation (v2 non-default options) ===")
1274de110f8SKevin Wolf    iotests.log("")
12839218a77SKevin Wolf
1294de110f8SKevin Wolf    vm.launch()
130f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': 'file',
1314de110f8SKevin Wolf                         'filename': disk_path,
1324de110f8SKevin Wolf                         'size': 0 })
13339218a77SKevin Wolf
134f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
1354de110f8SKevin Wolf                         'file': {
1364de110f8SKevin Wolf                             'driver': 'file',
1374de110f8SKevin Wolf                             'filename': disk_path,
13839218a77SKevin Wolf                         },
1394de110f8SKevin Wolf                         'size': size,
1404de110f8SKevin Wolf                         'backing-file': backing_path,
1414de110f8SKevin Wolf                         'backing-fmt': 'qcow2',
1424de110f8SKevin Wolf                         'version': 'v2',
1434de110f8SKevin Wolf                         'cluster-size': 512 })
1444de110f8SKevin Wolf    vm.shutdown()
14539218a77SKevin Wolf
1464de110f8SKevin Wolf    iotests.img_info_log(disk_path)
14739218a77SKevin Wolf
1484de110f8SKevin Wolf    #
1494de110f8SKevin Wolf    # Successful image creation (encrypted)
1504de110f8SKevin Wolf    #
1514de110f8SKevin Wolf    iotests.log("=== Successful image creation (encrypted) ===")
1524de110f8SKevin Wolf    iotests.log("")
15339218a77SKevin Wolf
1544de110f8SKevin Wolf    vm.launch()
155f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
1564de110f8SKevin Wolf                         'file': {
1574de110f8SKevin Wolf                             'driver': 'file',
1584de110f8SKevin Wolf                             'filename': disk_path,
15939218a77SKevin Wolf                         },
1604de110f8SKevin Wolf                         'size': size,
1614de110f8SKevin Wolf                         'encrypt': {
1624de110f8SKevin Wolf                             'format': 'luks',
1634de110f8SKevin Wolf                             'key-secret': 'keysec0',
1644de110f8SKevin Wolf                             'cipher-alg': 'twofish-128',
1654de110f8SKevin Wolf                             'cipher-mode': 'ctr',
1664de110f8SKevin Wolf                             'ivgen-alg': 'plain64',
1674de110f8SKevin Wolf                             'ivgen-hash-alg': 'md5',
1684de110f8SKevin Wolf                             'hash-alg': 'sha1',
1694de110f8SKevin Wolf                             'iter-time': 10,
1704de110f8SKevin Wolf                         }})
1714de110f8SKevin Wolf    vm.shutdown()
17239218a77SKevin Wolf
1734de110f8SKevin Wolf    iotests.img_info_log(disk_path)
17439218a77SKevin Wolf
1754de110f8SKevin Wolf    #
1764de110f8SKevin Wolf    # Invalid BlockdevRef
1774de110f8SKevin Wolf    #
1784de110f8SKevin Wolf    iotests.log("=== Invalid BlockdevRef ===")
1794de110f8SKevin Wolf    iotests.log("")
18039218a77SKevin Wolf
1814de110f8SKevin Wolf    vm.launch()
182f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
1834de110f8SKevin Wolf                         'file': "this doesn't exist",
1844de110f8SKevin Wolf                         'size': size })
1854de110f8SKevin Wolf    vm.shutdown()
18639218a77SKevin Wolf
1874de110f8SKevin Wolf    #
1884de110f8SKevin Wolf    # Invalid sizes
1894de110f8SKevin Wolf    #
1904de110f8SKevin Wolf    iotests.log("=== Invalid sizes ===")
19139218a77SKevin Wolf
19239218a77SKevin Wolf    # TODO Negative image sizes aren't handled correctly, but this is a problem
1934de110f8SKevin Wolf    # with QAPI's implementation of the 'size' type and affects other commands
1944de110f8SKevin Wolf    # as well. Once this is fixed, we may want to add a test case here.
1954de110f8SKevin Wolf    #
19639218a77SKevin Wolf    # 1. Misaligned image size
19739218a77SKevin Wolf    # 2. 2^64 - 512
19839218a77SKevin Wolf    # 3. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
19939218a77SKevin Wolf    # 4. 2^63 - 512 (generally valid, but qcow2 can't handle images this size)
20039218a77SKevin Wolf
2014de110f8SKevin Wolf    vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))
20239218a77SKevin Wolf
2034de110f8SKevin Wolf    vm.launch()
2044de110f8SKevin Wolf    for size in [ 1234, 18446744073709551104, 9223372036854775808,
205*8b117001SVladimir Sementsov-Ogievskiy                  9223372036854775296, 9223372035781033984 ]:
206f6da1736SKevin Wolf        vm.blockdev_create({ 'driver': imgfmt,
2074de110f8SKevin Wolf                             'file': 'node0',
2084de110f8SKevin Wolf                             'size': size })
2094de110f8SKevin Wolf    vm.shutdown()
21039218a77SKevin Wolf
2114de110f8SKevin Wolf    #
2124de110f8SKevin Wolf    # Invalid version
2134de110f8SKevin Wolf    #
2144de110f8SKevin Wolf    iotests.log("=== Invalid version ===")
21539218a77SKevin Wolf
2164de110f8SKevin Wolf    vm.launch()
217f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2184de110f8SKevin Wolf                         'file': 'node0',
2194de110f8SKevin Wolf                         'size': 67108864,
2204de110f8SKevin Wolf                         'version': 'v1' })
221f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2224de110f8SKevin Wolf                         'file': 'node0',
2234de110f8SKevin Wolf                         'size': 67108864,
2244de110f8SKevin Wolf                         'version': 'v2',
2254de110f8SKevin Wolf                         'lazy-refcounts': True })
226f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2274de110f8SKevin Wolf                         'file': 'node0',
2284de110f8SKevin Wolf                         'size': 67108864,
2294de110f8SKevin Wolf                         'version': 'v2',
2304de110f8SKevin Wolf                         'refcount-bits': 8 })
2314de110f8SKevin Wolf    vm.shutdown()
23239218a77SKevin Wolf
2334de110f8SKevin Wolf    #
2344de110f8SKevin Wolf    # Invalid backing file options
2354de110f8SKevin Wolf    #
2364de110f8SKevin Wolf    iotests.log("=== Invalid backing file options ===")
23739218a77SKevin Wolf
2384de110f8SKevin Wolf    vm.launch()
239f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2404de110f8SKevin Wolf                         'file': 'node0',
2414de110f8SKevin Wolf                         'size': 67108864,
2424de110f8SKevin Wolf                         'backing-file': '/dev/null',
2434de110f8SKevin Wolf                         'preallocation': 'full' })
244f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2454de110f8SKevin Wolf                         'file': 'node0',
2464de110f8SKevin Wolf                         'size': 67108864,
2474de110f8SKevin Wolf                         'backing-fmt': imgfmt })
2484de110f8SKevin Wolf    vm.shutdown()
24939218a77SKevin Wolf
2504de110f8SKevin Wolf    #
2514de110f8SKevin Wolf    # Invalid cluster size
2524de110f8SKevin Wolf    #
2534de110f8SKevin Wolf    iotests.log("=== Invalid cluster size ===")
25439218a77SKevin Wolf
2554de110f8SKevin Wolf    vm.launch()
2564de110f8SKevin Wolf    for csize in [ 1234, 128, 4194304, 0 ]:
257f6da1736SKevin Wolf        vm.blockdev_create({ 'driver': imgfmt,
2584de110f8SKevin Wolf                             'file': 'node0',
2594de110f8SKevin Wolf                             'size': 67108864,
2604de110f8SKevin Wolf                             'cluster-size': csize })
261f6da1736SKevin Wolf    vm.blockdev_create({ 'driver': imgfmt,
2624de110f8SKevin Wolf                         'file': 'node0',
2634de110f8SKevin Wolf                         'size': 281474976710656,
2644de110f8SKevin Wolf                         'cluster-size': 512 })
2654de110f8SKevin Wolf    vm.shutdown()
26639218a77SKevin Wolf
2674de110f8SKevin Wolf    #
2684de110f8SKevin Wolf    # Invalid refcount width
2694de110f8SKevin Wolf    #
2704de110f8SKevin Wolf    iotests.log("=== Invalid refcount width ===")
27139218a77SKevin Wolf
2724de110f8SKevin Wolf    vm.launch()
2734de110f8SKevin Wolf    for refcount_bits in [ 128, 0, 7 ]:
274f6da1736SKevin Wolf        vm.blockdev_create({ 'driver': imgfmt,
2754de110f8SKevin Wolf                             'file': 'node0',
2764de110f8SKevin Wolf                             'size': 67108864,
2774de110f8SKevin Wolf                             'refcount-bits': refcount_bits })
2784de110f8SKevin Wolf    vm.shutdown()
279