]>
Commit | Line | Data |
---|---|---|
7c477526 | 1 | #!/usr/bin/env python3 |
7b14f231 HR |
2 | # |
3 | # Test json:{} filenames with qemu-internal BDSs | |
4 | # (the one of commit, to be precise) | |
5 | # | |
6 | # Copyright (C) 2018 Red Hat, Inc. | |
7 | # | |
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. | |
12 | # | |
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. | |
17 | # | |
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/>. | |
20 | # | |
21 | # Creator/Owner: Max Reitz <[email protected]> | |
22 | ||
23 | import iotests | |
24 | from iotests import log, qemu_img, qemu_io_silent, filter_qmp_testfiles, \ | |
25 | filter_qmp_imgfmt | |
26 | import json | |
27 | ||
28 | # Need backing file support (for arbitrary backing formats) | |
7d814059 JS |
29 | iotests.script_initialize(supported_fmts=['qcow2', 'qcow', 'qed'], |
30 | supported_platforms=['linux']) | |
7b14f231 HR |
31 | |
32 | ||
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. | |
37 | # | |
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('') | |
43 | ||
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: | |
48 | ||
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 | mid_img_path) == 0 | |
53 | assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path, | |
54 | top_img_path) == 0 | |
55 | ||
56 | # Something to commit | |
57 | assert qemu_io_silent(mid_img_path, '-c', 'write -P 1 0 1M') == 0 | |
58 | ||
59 | vm.launch() | |
60 | ||
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]) | |
90 | ||
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'] | |
95 | ||
96 | assert mid_name[:5] == 'json:' | |
97 | assert base_name[:5] == 'json:' | |
98 | ||
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]) | |
117 | ||
118 | vm.qmp_log('job-pause', id='commit') | |
119 | ||
120 | # Get and parse top's json:{} filename | |
121 | top_name = vm.node_info('top')['image']['filename'] | |
122 | ||
123 | vm.shutdown() | |
124 | ||
125 | assert top_name[:5] == 'json:' | |
126 | top_options = json.loads(top_name[5:]) | |
127 | ||
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'] | |
137 | ||
138 | assert mid_options['driver'] == iotests.imgfmt | |
139 | assert mid_options['file']['filename'] == mid_img_path |