3 # Test json:{} filenames with qemu-internal BDSs
4 # (the one of commit, to be precise)
6 # Copyright (C) 2018 Red Hat, Inc.
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 # Creator/Owner: Max Reitz <mreitz@redhat.com>
24 from iotests
import log
, qemu_img
, qemu_io_silent
, filter_qmp_testfiles
, \
28 # Need backing file support (for arbitrary backing formats)
29 iotests
.verify_image_format(supported_fmts
=['qcow2', 'qcow', 'qed'])
30 iotests
.verify_platform(['linux'])
33 # There are two variations of this test:
34 # (1) We do not set filter_node_name. In that case, the commit_top
35 # driver should not appear anywhere.
36 # (2) We do set filter_node_name. In that case, it should appear.
38 # This for loop executes both.
39 for filter_node_name
in False, True:
41 log('--- filter_node_name: %s ---' % filter_node_name
)
44 with iotests
.FilePath('base.img') as base_img_path
, \
45 iotests
.FilePath('mid.img') as mid_img_path
, \
46 iotests
.FilePath('top.img') as top_img_path
, \
49 assert qemu_img('create', '-f', iotests
.imgfmt
,
50 base_img_path
, '64M') == 0
51 assert qemu_img('create', '-f', iotests
.imgfmt
, '-b', base_img_path
,
53 assert qemu_img('create', '-f', iotests
.imgfmt
, '-b', mid_img_path
,
57 assert qemu_io_silent(mid_img_path
, '-c', 'write -P 1 0 1M') == 0
61 # Change the bottom-most image's backing file (to null-co://)
62 # to enforce json:{} filenames
63 vm
.qmp_log('blockdev-add',
65 driver
=iotests
.imgfmt
,
68 'filename': top_img_path
72 'driver': iotests
.imgfmt
,
75 'filename': mid_img_path
79 'driver': iotests
.imgfmt
,
82 'filename': base_img_path
89 filters
=[filter_qmp_testfiles
, filter_qmp_imgfmt
])
91 # As long as block-commit does not accept node names, we have to
92 # get our mid/base filenames here
93 mid_name
= vm
.node_info('mid')['image']['filename']
94 base_name
= vm
.node_info('base')['image']['filename']
96 assert mid_name
[:5] == 'json:'
97 assert base_name
[:5] == 'json:'
101 vm
.qmp_log('block-commit',
104 filter_node_name
='filter_node',
108 filters
=[filter_qmp_testfiles
, filter_qmp_imgfmt
])
110 vm
.qmp_log('block-commit',
116 filters
=[filter_qmp_testfiles
, filter_qmp_imgfmt
])
118 vm
.qmp_log('job-pause', id='commit')
120 # Get and parse top's json:{} filename
121 top_name
= vm
.node_info('top')['image']['filename']
125 assert top_name
[:5] == 'json:'
126 top_options
= json
.loads(top_name
[5:])
129 # This should be present and set
130 assert top_options
['backing']['driver'] == 'commit_top'
131 # And the mid image is commit_top's backing image
132 mid_options
= top_options
['backing']['backing']
134 # The mid image should appear as the immediate backing BDS
136 mid_options
= top_options
['backing']
138 assert mid_options
['driver'] == iotests
.imgfmt
139 assert mid_options
['file']['filename'] == mid_img_path