xref: /openbmc/qemu/tests/qemu-iotests/213 (revision 0c46a69a5eb8a061134719a0a85898854eb8e533)
1*0c46a69aSKevin Wolf#!/usr/bin/env python
20b7e7f66SKevin Wolf#
30b7e7f66SKevin Wolf# Test vhdx and file image creation
40b7e7f66SKevin Wolf#
50b7e7f66SKevin Wolf# Copyright (C) 2018 Red Hat, Inc.
60b7e7f66SKevin Wolf#
7*0c46a69aSKevin Wolf# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
8*0c46a69aSKevin Wolf#
90b7e7f66SKevin Wolf# This program is free software; you can redistribute it and/or modify
100b7e7f66SKevin Wolf# it under the terms of the GNU General Public License as published by
110b7e7f66SKevin Wolf# the Free Software Foundation; either version 2 of the License, or
120b7e7f66SKevin Wolf# (at your option) any later version.
130b7e7f66SKevin Wolf#
140b7e7f66SKevin Wolf# This program is distributed in the hope that it will be useful,
150b7e7f66SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of
160b7e7f66SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
170b7e7f66SKevin Wolf# GNU General Public License for more details.
180b7e7f66SKevin Wolf#
190b7e7f66SKevin Wolf# You should have received a copy of the GNU General Public License
200b7e7f66SKevin Wolf# along with this program.  If not, see <http://www.gnu.org/licenses/>.
210b7e7f66SKevin Wolf#
220b7e7f66SKevin Wolf
23*0c46a69aSKevin Wolfimport iotests
24*0c46a69aSKevin Wolffrom iotests import imgfmt
250b7e7f66SKevin Wolf
26*0c46a69aSKevin Wolfiotests.verify_image_format(supported_fmts=['vhdx'])
27*0c46a69aSKevin Wolfiotests.verify_protocol(supported=['file'])
280b7e7f66SKevin Wolf
29*0c46a69aSKevin Wolfdef blockdev_create(vm, options):
30*0c46a69aSKevin Wolf    result = vm.qmp_log('x-blockdev-create', job_id='job0', options=options)
310b7e7f66SKevin Wolf
32*0c46a69aSKevin Wolf    if 'return' in result:
33*0c46a69aSKevin Wolf        assert result['return'] == {}
34*0c46a69aSKevin Wolf        vm.run_job('job0')
35*0c46a69aSKevin Wolf    iotests.log("")
360b7e7f66SKevin Wolf
37*0c46a69aSKevin Wolfwith iotests.FilePath('t.vhdx') as disk_path, \
38*0c46a69aSKevin Wolf     iotests.VM() as vm:
390b7e7f66SKevin Wolf
40*0c46a69aSKevin Wolf    #
41*0c46a69aSKevin Wolf    # Successful image creation (defaults)
42*0c46a69aSKevin Wolf    #
43*0c46a69aSKevin Wolf    iotests.log("=== Successful image creation (defaults) ===")
44*0c46a69aSKevin Wolf    iotests.log("")
450b7e7f66SKevin Wolf
46*0c46a69aSKevin Wolf    size = 128 * 1024 * 1024
470b7e7f66SKevin Wolf
48*0c46a69aSKevin Wolf    vm.launch()
49*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': 'file',
50*0c46a69aSKevin Wolf                          'filename': disk_path,
51*0c46a69aSKevin Wolf                          'size': 0 })
520b7e7f66SKevin Wolf
53*0c46a69aSKevin Wolf    vm.qmp_log('blockdev-add', driver='file', filename=disk_path,
54*0c46a69aSKevin Wolf               node_name='imgfile')
550b7e7f66SKevin Wolf
56*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
57*0c46a69aSKevin Wolf                          'file': 'imgfile',
58*0c46a69aSKevin Wolf                          'size': size })
59*0c46a69aSKevin Wolf    vm.shutdown()
600b7e7f66SKevin Wolf
61*0c46a69aSKevin Wolf    iotests.img_info_log(disk_path)
620b7e7f66SKevin Wolf
63*0c46a69aSKevin Wolf    #
64*0c46a69aSKevin Wolf    # Successful image creation (explicit defaults)
65*0c46a69aSKevin Wolf    #
66*0c46a69aSKevin Wolf    iotests.log("=== Successful image creation (explicit defaults) ===")
67*0c46a69aSKevin Wolf    iotests.log("")
680b7e7f66SKevin Wolf
690b7e7f66SKevin Wolf    # Choose a different size to show that we got a new image
70*0c46a69aSKevin Wolf    size = 64 * 1024 * 1024
710b7e7f66SKevin Wolf
72*0c46a69aSKevin Wolf    vm.launch()
73*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': 'file',
74*0c46a69aSKevin Wolf                          'filename': disk_path,
75*0c46a69aSKevin Wolf                          'size': 0 })
76*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
77*0c46a69aSKevin Wolf                          'file': {
78*0c46a69aSKevin Wolf                              'driver': 'file',
79*0c46a69aSKevin Wolf                              'filename': disk_path,
800b7e7f66SKevin Wolf                          },
81*0c46a69aSKevin Wolf                          'size': size,
82*0c46a69aSKevin Wolf                          'log-size': 1048576,
83*0c46a69aSKevin Wolf                          'block-size': 8388608,
84*0c46a69aSKevin Wolf                          'subformat': 'dynamic',
85*0c46a69aSKevin Wolf                          'block-state-zero': True })
86*0c46a69aSKevin Wolf    vm.shutdown()
870b7e7f66SKevin Wolf
88*0c46a69aSKevin Wolf    iotests.img_info_log(disk_path)
890b7e7f66SKevin Wolf
90*0c46a69aSKevin Wolf    #
91*0c46a69aSKevin Wolf    # Successful image creation (with non-default options)
92*0c46a69aSKevin Wolf    #
93*0c46a69aSKevin Wolf    iotests.log("=== Successful image creation (with non-default options) ===")
94*0c46a69aSKevin Wolf    iotests.log("")
950b7e7f66SKevin Wolf
960b7e7f66SKevin Wolf    # Choose a different size to show that we got a new image
97*0c46a69aSKevin Wolf    size = 32 * 1024 * 1024
980b7e7f66SKevin Wolf
99*0c46a69aSKevin Wolf    vm.launch()
100*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': 'file',
101*0c46a69aSKevin Wolf                          'filename': disk_path,
102*0c46a69aSKevin Wolf                          'size': 0 })
103*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
104*0c46a69aSKevin Wolf                          'file': {
105*0c46a69aSKevin Wolf                              'driver': 'file',
106*0c46a69aSKevin Wolf                              'filename': disk_path,
1070b7e7f66SKevin Wolf                          },
108*0c46a69aSKevin Wolf                          'size': size,
109*0c46a69aSKevin Wolf                          'log-size': 8388608,
110*0c46a69aSKevin Wolf                          'block-size': 268435456,
111*0c46a69aSKevin Wolf                          'subformat': 'fixed',
112*0c46a69aSKevin Wolf                          'block-state-zero': False })
113*0c46a69aSKevin Wolf    vm.shutdown()
1140b7e7f66SKevin Wolf
115*0c46a69aSKevin Wolf    iotests.img_info_log(disk_path)
1160b7e7f66SKevin Wolf
117*0c46a69aSKevin Wolf    #
118*0c46a69aSKevin Wolf    # Invalid BlockdevRef
119*0c46a69aSKevin Wolf    #
120*0c46a69aSKevin Wolf    iotests.log("=== Invalid BlockdevRef ===")
121*0c46a69aSKevin Wolf    iotests.log("")
1220b7e7f66SKevin Wolf
123*0c46a69aSKevin Wolf    vm.launch()
124*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
125*0c46a69aSKevin Wolf                          'file': "this doesn't exist",
126*0c46a69aSKevin Wolf                          'size': size })
127*0c46a69aSKevin Wolf    vm.shutdown()
1280b7e7f66SKevin Wolf
129*0c46a69aSKevin Wolf    #
130*0c46a69aSKevin Wolf    # Zero size
131*0c46a69aSKevin Wolf    #
132*0c46a69aSKevin Wolf    iotests.log("=== Zero size ===")
133*0c46a69aSKevin Wolf    iotests.log("")
1340b7e7f66SKevin Wolf
135*0c46a69aSKevin Wolf    vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))
136*0c46a69aSKevin Wolf    vm.launch()
137*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
138*0c46a69aSKevin Wolf                          'file': 'node0',
139*0c46a69aSKevin Wolf                          'size': 0 })
140*0c46a69aSKevin Wolf    vm.shutdown()
1410b7e7f66SKevin Wolf
142*0c46a69aSKevin Wolf    iotests.img_info_log(disk_path)
1430b7e7f66SKevin Wolf
144*0c46a69aSKevin Wolf    #
145*0c46a69aSKevin Wolf    # Maximum size
146*0c46a69aSKevin Wolf    #
147*0c46a69aSKevin Wolf    iotests.log("=== Maximum size ===")
148*0c46a69aSKevin Wolf    iotests.log("")
1490b7e7f66SKevin Wolf
150*0c46a69aSKevin Wolf    vm.launch()
151*0c46a69aSKevin Wolf    blockdev_create(vm, { 'driver': imgfmt,
152*0c46a69aSKevin Wolf                          'file': 'node0',
153*0c46a69aSKevin Wolf                          'size': 70368744177664 })
154*0c46a69aSKevin Wolf    vm.shutdown()
1550b7e7f66SKevin Wolf
156*0c46a69aSKevin Wolf    iotests.img_info_log(disk_path)
1570b7e7f66SKevin Wolf
158*0c46a69aSKevin Wolf    #
159*0c46a69aSKevin Wolf    # Invalid sizes
160*0c46a69aSKevin Wolf    #
1610b7e7f66SKevin Wolf
1620b7e7f66SKevin Wolf    # TODO Negative image sizes aren't handled correctly, but this is a problem
163*0c46a69aSKevin Wolf    # with QAPI's implementation of the 'size' type and affects other commands
164*0c46a69aSKevin Wolf    # as well. Once this is fixed, we may want to add a test case here.
1650b7e7f66SKevin Wolf
1660b7e7f66SKevin Wolf    # 1. 2^64 - 512
1670b7e7f66SKevin Wolf    # 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
1680b7e7f66SKevin Wolf    # 3. 2^63 - 512 (generally valid, but with the image header the file will
1690b7e7f66SKevin Wolf    #                exceed 63 bits)
1700b7e7f66SKevin Wolf    # 4. 2^46 + 1 (one byte more than maximum image size)
1710b7e7f66SKevin Wolf
172*0c46a69aSKevin Wolf    iotests.log("=== Invalid sizes ===")
173*0c46a69aSKevin Wolf    iotests.log("")
1740b7e7f66SKevin Wolf
175*0c46a69aSKevin Wolf    vm.launch()
176*0c46a69aSKevin Wolf    for size in [ 18446744073709551104, 9223372036854775808,
177*0c46a69aSKevin Wolf                  9223372036854775296, 70368744177665 ]:
178*0c46a69aSKevin Wolf        blockdev_create(vm, { 'driver': imgfmt,
179*0c46a69aSKevin Wolf                              'file': 'node0',
180*0c46a69aSKevin Wolf                              'size': size })
181*0c46a69aSKevin Wolf    vm.shutdown()
1820b7e7f66SKevin Wolf
183*0c46a69aSKevin Wolf    #
184*0c46a69aSKevin Wolf    # Invalid block size
185*0c46a69aSKevin Wolf    #
186*0c46a69aSKevin Wolf    iotests.log("=== Invalid block size ===")
187*0c46a69aSKevin Wolf    iotests.log("")
1880b7e7f66SKevin Wolf
189*0c46a69aSKevin Wolf    vm.launch()
190*0c46a69aSKevin Wolf    for bsize in [ 1234567, 128, 3145728, 536870912, 0 ]:
191*0c46a69aSKevin Wolf        blockdev_create(vm, { 'driver': imgfmt,
192*0c46a69aSKevin Wolf                              'file': 'node0',
193*0c46a69aSKevin Wolf                              'size': 67108864,
194*0c46a69aSKevin Wolf                              'block-size': bsize })
195*0c46a69aSKevin Wolf    vm.shutdown()
1960b7e7f66SKevin Wolf
197*0c46a69aSKevin Wolf    #
198*0c46a69aSKevin Wolf    # Invalid log size
199*0c46a69aSKevin Wolf    #
200*0c46a69aSKevin Wolf    iotests.log("=== Invalid log size ===")
201*0c46a69aSKevin Wolf    iotests.log("")
2020b7e7f66SKevin Wolf
203*0c46a69aSKevin Wolf    vm.launch()
204*0c46a69aSKevin Wolf    for lsize in [ 1234567, 128, 4294967296, 0 ]:
205*0c46a69aSKevin Wolf        blockdev_create(vm, { 'driver': imgfmt,
206*0c46a69aSKevin Wolf                              'file': 'node0',
207*0c46a69aSKevin Wolf                              'size': 67108864,
208*0c46a69aSKevin Wolf                              'log-size': lsize })
209*0c46a69aSKevin Wolf    vm.shutdown()
210