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