qapi/error: Check format string argument in error_*prepend()
[qemu/armbru.git] / tests / qemu-iotests / 224
blob017b0685ba15bc98262771513a49173da4ffa416
1 #!/usr/bin/env python3
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>
23 import iotests
24 from iotests import log, qemu_img, qemu_io_silent, filter_qmp_testfiles, \
25                     filter_qmp_imgfmt
26 import json
28 # Need backing file support (for arbitrary backing formats)
29 iotests.script_initialize(supported_fmts=['qcow2', 'qcow', 'qed'],
30                           supported_platforms=['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:
40     log('')
41     log('--- filter_node_name: %s ---' % filter_node_name)
42     log('')
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, \
47          iotests.VM() as vm:
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,
52                         '-F', iotests.imgfmt, mid_img_path) == 0
53         assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
54                         '-F', iotests.imgfmt, top_img_path) == 0
56         # Something to commit
57         assert qemu_io_silent(mid_img_path, '-c', 'write -P 1 0 1M') == 0
59         vm.launch()
61         # Change the bottom-most image's backing file (to null-co://)
62         # to enforce json:{} filenames
63         vm.qmp_log('blockdev-add',
64                     node_name='top',
65                     driver=iotests.imgfmt,
66                     file={
67                         'driver': 'file',
68                         'filename': top_img_path
69                     },
70                     backing={
71                         'node-name': 'mid',
72                         'driver': iotests.imgfmt,
73                         'file': {
74                             'driver': 'file',
75                             'filename': mid_img_path
76                         },
77                         'backing': {
78                             'node-name': 'base',
79                             'driver': iotests.imgfmt,
80                             'file': {
81                                 'driver': 'file',
82                                 'filename': base_img_path
83                             },
84                             'backing': {
85                                 'driver': 'null-co'
86                             }
87                         }
88                     },
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:'
99         # Start the block job
100         if filter_node_name:
101             vm.qmp_log('block-commit',
102                         job_id='commit',
103                         device='top',
104                         filter_node_name='filter_node',
105                         top=mid_name,
106                         base=base_name,
107                         speed=1,
108                         filters=[filter_qmp_testfiles, filter_qmp_imgfmt])
109         else:
110             vm.qmp_log('block-commit',
111                         job_id='commit',
112                         device='top',
113                         top=mid_name,
114                         base=base_name,
115                         speed=1,
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']
123         vm.shutdown()
125         assert top_name[:5] == 'json:'
126         top_options = json.loads(top_name[5:])
128         if filter_node_name:
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']
133         else:
134             # The mid image should appear as the immediate backing BDS
135             # of top
136             mid_options = top_options['backing']
138         assert mid_options['driver'] == iotests.imgfmt
139         assert mid_options['file']['filename'] == mid_img_path