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 267d814059SJohn Snowiotests.script_initialize(supported_fmts=['qcow2']) 27*d2a839edSMax Reitziotests.verify_working_luks() 2839218a77SKevin Wolf 294de110f8SKevin Wolfwith iotests.FilePath('t.qcow2') as disk_path, \ 304de110f8SKevin Wolf iotests.FilePath('t.qcow2.base') as backing_path, \ 314de110f8SKevin Wolf iotests.VM() as vm: 3239218a77SKevin Wolf 334de110f8SKevin Wolf vm.add_object('secret,id=keysec0,data=foo') 3439218a77SKevin Wolf 354de110f8SKevin Wolf # 364de110f8SKevin Wolf # Successful image creation (defaults) 374de110f8SKevin Wolf # 384de110f8SKevin Wolf iotests.log("=== Successful image creation (defaults) ===") 394de110f8SKevin Wolf iotests.log("") 4039218a77SKevin Wolf 414de110f8SKevin Wolf size = 128 * 1024 * 1024 4239218a77SKevin Wolf 434de110f8SKevin Wolf vm.launch() 44f6da1736SKevin Wolf vm.blockdev_create({ 'driver': 'file', 454de110f8SKevin Wolf 'filename': disk_path, 464de110f8SKevin Wolf 'size': 0 }) 4739218a77SKevin Wolf 48f8ca8609SJohn Snow vm.qmp_log('blockdev-add', 4908fcd611SJohn Snow filters=[iotests.filter_qmp_testfiles], 50f8ca8609SJohn Snow driver='file', filename=disk_path, 514de110f8SKevin Wolf node_name='imgfile') 5239218a77SKevin Wolf 53f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 544de110f8SKevin Wolf 'file': 'imgfile', 554de110f8SKevin Wolf 'size': size }) 564de110f8SKevin Wolf vm.shutdown() 5739218a77SKevin Wolf 584de110f8SKevin Wolf iotests.img_info_log(disk_path) 594de110f8SKevin Wolf 604de110f8SKevin Wolf # 614de110f8SKevin Wolf # Successful image creation (inline blockdev-add, explicit defaults) 624de110f8SKevin Wolf # 634de110f8SKevin Wolf iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===") 644de110f8SKevin Wolf iotests.log("") 6539218a77SKevin Wolf 6639218a77SKevin Wolf # Choose a different size to show that we got a new image 674de110f8SKevin Wolf size = 64 * 1024 * 1024 6839218a77SKevin Wolf 694de110f8SKevin Wolf vm.launch() 70f6da1736SKevin Wolf vm.blockdev_create({ 'driver': 'file', 714de110f8SKevin Wolf 'filename': disk_path, 724de110f8SKevin Wolf 'size': 0, 734de110f8SKevin Wolf 'preallocation': 'off', 744de110f8SKevin Wolf 'nocow': False }) 754de110f8SKevin Wolf 76f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 774de110f8SKevin Wolf 'file': { 784de110f8SKevin Wolf 'driver': 'file', 794de110f8SKevin Wolf 'filename': disk_path, 8039218a77SKevin Wolf }, 814de110f8SKevin Wolf 'size': size, 824de110f8SKevin Wolf 'version': 'v3', 834de110f8SKevin Wolf 'cluster-size': 65536, 844de110f8SKevin Wolf 'preallocation': 'off', 854de110f8SKevin Wolf 'lazy-refcounts': False, 864de110f8SKevin Wolf 'refcount-bits': 16 }) 874de110f8SKevin Wolf vm.shutdown() 8839218a77SKevin Wolf 894de110f8SKevin Wolf iotests.img_info_log(disk_path) 9039218a77SKevin Wolf 914de110f8SKevin Wolf # 924de110f8SKevin Wolf # Successful image creation (v3 non-default options) 934de110f8SKevin Wolf # 944de110f8SKevin Wolf iotests.log("=== Successful image creation (v3 non-default options) ===") 954de110f8SKevin Wolf iotests.log("") 9639218a77SKevin Wolf 9739218a77SKevin Wolf # Choose a different size to show that we got a new image 984de110f8SKevin Wolf size = 32 * 1024 * 1024 9939218a77SKevin Wolf 1004de110f8SKevin Wolf vm.launch() 101f6da1736SKevin Wolf vm.blockdev_create({ 'driver': 'file', 1024de110f8SKevin Wolf 'filename': disk_path, 1034de110f8SKevin Wolf 'size': 0, 1044de110f8SKevin Wolf 'preallocation': 'falloc', 1054de110f8SKevin Wolf 'nocow': True }) 1064de110f8SKevin Wolf 107f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 1084de110f8SKevin Wolf 'file': { 1094de110f8SKevin Wolf 'driver': 'file', 1104de110f8SKevin Wolf 'filename': disk_path, 11139218a77SKevin Wolf }, 1124de110f8SKevin Wolf 'size': size, 1134de110f8SKevin Wolf 'version': 'v3', 1144de110f8SKevin Wolf 'cluster-size': 2097152, 1154de110f8SKevin Wolf 'preallocation': 'metadata', 1164de110f8SKevin Wolf 'lazy-refcounts': True, 1174de110f8SKevin Wolf 'refcount-bits': 1 }) 1184de110f8SKevin Wolf vm.shutdown() 11939218a77SKevin Wolf 1204de110f8SKevin Wolf iotests.img_info_log(disk_path) 12139218a77SKevin Wolf 1224de110f8SKevin Wolf # 1234de110f8SKevin Wolf # Successful image creation (v2 non-default options) 1244de110f8SKevin Wolf # 1254de110f8SKevin Wolf iotests.log("=== Successful image creation (v2 non-default options) ===") 1264de110f8SKevin Wolf iotests.log("") 12739218a77SKevin Wolf 1284de110f8SKevin Wolf vm.launch() 129f6da1736SKevin Wolf vm.blockdev_create({ 'driver': 'file', 1304de110f8SKevin Wolf 'filename': disk_path, 1314de110f8SKevin Wolf 'size': 0 }) 13239218a77SKevin Wolf 133f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 1344de110f8SKevin Wolf 'file': { 1354de110f8SKevin Wolf 'driver': 'file', 1364de110f8SKevin Wolf 'filename': disk_path, 13739218a77SKevin Wolf }, 1384de110f8SKevin Wolf 'size': size, 1394de110f8SKevin Wolf 'backing-file': backing_path, 1404de110f8SKevin Wolf 'backing-fmt': 'qcow2', 1414de110f8SKevin Wolf 'version': 'v2', 1424de110f8SKevin Wolf 'cluster-size': 512 }) 1434de110f8SKevin Wolf vm.shutdown() 14439218a77SKevin Wolf 1454de110f8SKevin Wolf iotests.img_info_log(disk_path) 14639218a77SKevin Wolf 1474de110f8SKevin Wolf # 1484de110f8SKevin Wolf # Successful image creation (encrypted) 1494de110f8SKevin Wolf # 1504de110f8SKevin Wolf iotests.log("=== Successful image creation (encrypted) ===") 1514de110f8SKevin Wolf iotests.log("") 15239218a77SKevin Wolf 1534de110f8SKevin Wolf vm.launch() 154f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 1554de110f8SKevin Wolf 'file': { 1564de110f8SKevin Wolf 'driver': 'file', 1574de110f8SKevin Wolf 'filename': disk_path, 15839218a77SKevin Wolf }, 1594de110f8SKevin Wolf 'size': size, 1604de110f8SKevin Wolf 'encrypt': { 1614de110f8SKevin Wolf 'format': 'luks', 1624de110f8SKevin Wolf 'key-secret': 'keysec0', 1634de110f8SKevin Wolf 'cipher-alg': 'twofish-128', 1644de110f8SKevin Wolf 'cipher-mode': 'ctr', 1654de110f8SKevin Wolf 'ivgen-alg': 'plain64', 1664de110f8SKevin Wolf 'ivgen-hash-alg': 'md5', 1674de110f8SKevin Wolf 'hash-alg': 'sha1', 1684de110f8SKevin Wolf 'iter-time': 10, 1694de110f8SKevin Wolf }}) 1704de110f8SKevin Wolf vm.shutdown() 17139218a77SKevin Wolf 1724de110f8SKevin Wolf iotests.img_info_log(disk_path) 17339218a77SKevin Wolf 1744de110f8SKevin Wolf # 1754de110f8SKevin Wolf # Invalid BlockdevRef 1764de110f8SKevin Wolf # 1774de110f8SKevin Wolf iotests.log("=== Invalid BlockdevRef ===") 1784de110f8SKevin Wolf iotests.log("") 17939218a77SKevin Wolf 1804de110f8SKevin Wolf vm.launch() 181f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 1824de110f8SKevin Wolf 'file': "this doesn't exist", 1834de110f8SKevin Wolf 'size': size }) 1844de110f8SKevin Wolf vm.shutdown() 18539218a77SKevin Wolf 1864de110f8SKevin Wolf # 1874de110f8SKevin Wolf # Invalid sizes 1884de110f8SKevin Wolf # 1894de110f8SKevin Wolf iotests.log("=== Invalid sizes ===") 19039218a77SKevin Wolf 19139218a77SKevin Wolf # TODO Negative image sizes aren't handled correctly, but this is a problem 1924de110f8SKevin Wolf # with QAPI's implementation of the 'size' type and affects other commands 1934de110f8SKevin Wolf # as well. Once this is fixed, we may want to add a test case here. 1944de110f8SKevin Wolf # 19539218a77SKevin Wolf # 1. Misaligned image size 19639218a77SKevin Wolf # 2. 2^64 - 512 19739218a77SKevin Wolf # 3. 2^63 = 8 EB (qemu-img enforces image sizes less than this) 19839218a77SKevin Wolf # 4. 2^63 - 512 (generally valid, but qcow2 can't handle images this size) 19939218a77SKevin Wolf 2004de110f8SKevin Wolf vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path)) 20139218a77SKevin Wolf 2024de110f8SKevin Wolf vm.launch() 2034de110f8SKevin Wolf for size in [ 1234, 18446744073709551104, 9223372036854775808, 2044de110f8SKevin Wolf 9223372036854775296 ]: 205f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2064de110f8SKevin Wolf 'file': 'node0', 2074de110f8SKevin Wolf 'size': size }) 2084de110f8SKevin Wolf vm.shutdown() 20939218a77SKevin Wolf 2104de110f8SKevin Wolf # 2114de110f8SKevin Wolf # Invalid version 2124de110f8SKevin Wolf # 2134de110f8SKevin Wolf iotests.log("=== Invalid version ===") 21439218a77SKevin Wolf 2154de110f8SKevin Wolf vm.launch() 216f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2174de110f8SKevin Wolf 'file': 'node0', 2184de110f8SKevin Wolf 'size': 67108864, 2194de110f8SKevin Wolf 'version': 'v1' }) 220f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2214de110f8SKevin Wolf 'file': 'node0', 2224de110f8SKevin Wolf 'size': 67108864, 2234de110f8SKevin Wolf 'version': 'v2', 2244de110f8SKevin Wolf 'lazy-refcounts': True }) 225f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2264de110f8SKevin Wolf 'file': 'node0', 2274de110f8SKevin Wolf 'size': 67108864, 2284de110f8SKevin Wolf 'version': 'v2', 2294de110f8SKevin Wolf 'refcount-bits': 8 }) 2304de110f8SKevin Wolf vm.shutdown() 23139218a77SKevin Wolf 2324de110f8SKevin Wolf # 2334de110f8SKevin Wolf # Invalid backing file options 2344de110f8SKevin Wolf # 2354de110f8SKevin Wolf iotests.log("=== Invalid backing file options ===") 23639218a77SKevin Wolf 2374de110f8SKevin Wolf vm.launch() 238f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2394de110f8SKevin Wolf 'file': 'node0', 2404de110f8SKevin Wolf 'size': 67108864, 2414de110f8SKevin Wolf 'backing-file': '/dev/null', 2424de110f8SKevin Wolf 'preallocation': 'full' }) 243f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2444de110f8SKevin Wolf 'file': 'node0', 2454de110f8SKevin Wolf 'size': 67108864, 2464de110f8SKevin Wolf 'backing-fmt': imgfmt }) 2474de110f8SKevin Wolf vm.shutdown() 24839218a77SKevin Wolf 2494de110f8SKevin Wolf # 2504de110f8SKevin Wolf # Invalid cluster size 2514de110f8SKevin Wolf # 2524de110f8SKevin Wolf iotests.log("=== Invalid cluster size ===") 25339218a77SKevin Wolf 2544de110f8SKevin Wolf vm.launch() 2554de110f8SKevin Wolf for csize in [ 1234, 128, 4194304, 0 ]: 256f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2574de110f8SKevin Wolf 'file': 'node0', 2584de110f8SKevin Wolf 'size': 67108864, 2594de110f8SKevin Wolf 'cluster-size': csize }) 260f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2614de110f8SKevin Wolf 'file': 'node0', 2624de110f8SKevin Wolf 'size': 281474976710656, 2634de110f8SKevin Wolf 'cluster-size': 512 }) 2644de110f8SKevin Wolf vm.shutdown() 26539218a77SKevin Wolf 2664de110f8SKevin Wolf # 2674de110f8SKevin Wolf # Invalid refcount width 2684de110f8SKevin Wolf # 2694de110f8SKevin Wolf iotests.log("=== Invalid refcount width ===") 27039218a77SKevin Wolf 2714de110f8SKevin Wolf vm.launch() 2724de110f8SKevin Wolf for refcount_bits in [ 128, 0, 7 ]: 273f6da1736SKevin Wolf vm.blockdev_create({ 'driver': imgfmt, 2744de110f8SKevin Wolf 'file': 'node0', 2754de110f8SKevin Wolf 'size': 67108864, 2764de110f8SKevin Wolf 'refcount-bits': refcount_bits }) 2774de110f8SKevin Wolf vm.shutdown() 278