]>
Commit | Line | Data |
---|---|---|
1c4e7b64 KW |
1 | #!/usr/bin/env python |
2 | # | |
3 | # Test vmdk and file image creation | |
4 | # | |
5 | # Copyright (C) 2018 Red Hat, Inc. | |
6 | # | |
7 | # Creator/Owner: Kevin Wolf <[email protected]> | |
8 | # | |
9 | # This program is free software; you can redistribute it and/or modify | |
10 | # it under the terms of the GNU General Public License as published by | |
11 | # the Free Software Foundation; either version 2 of the License, or | |
12 | # (at your option) any later version. | |
13 | # | |
14 | # This program is distributed in the hope that it will be useful, | |
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | # GNU General Public License for more details. | |
18 | # | |
19 | # You should have received a copy of the GNU General Public License | |
20 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | # | |
22 | ||
4a960ece | 23 | import math |
1c4e7b64 KW |
24 | import iotests |
25 | from iotests import imgfmt | |
26 | ||
27 | iotests.verify_image_format(supported_fmts=['vmdk']) | |
28 | ||
29 | def blockdev_create(vm, options): | |
250c04f5 HR |
30 | result = vm.qmp_log('blockdev-create', job_id='job0', options=options, |
31 | filters=[iotests.filter_qmp_testfiles]) | |
1c4e7b64 KW |
32 | |
33 | if 'return' in result: | |
34 | assert result['return'] == {} | |
35 | vm.run_job('job0') | |
36 | iotests.log("") | |
37 | ||
38 | with iotests.FilePath('t.vmdk') as disk_path, \ | |
39 | iotests.FilePath('t.vmdk.1') as extent1_path, \ | |
40 | iotests.FilePath('t.vmdk.2') as extent2_path, \ | |
41 | iotests.FilePath('t.vmdk.3') as extent3_path, \ | |
42 | iotests.VM() as vm: | |
43 | ||
44 | # | |
45 | # Successful image creation (defaults) | |
46 | # | |
47 | iotests.log("=== Successful image creation (defaults) ===") | |
48 | iotests.log("") | |
49 | ||
50 | size = 5 * 1024 * 1024 * 1024 | |
51 | ||
52 | vm.launch() | |
53 | blockdev_create(vm, { 'driver': 'file', | |
54 | 'filename': disk_path, | |
55 | 'size': 0 }) | |
56 | ||
57 | vm.qmp_log('blockdev-add', driver='file', filename=disk_path, | |
250c04f5 | 58 | node_name='imgfile', filters=[iotests.filter_qmp_testfiles]) |
1c4e7b64 KW |
59 | |
60 | blockdev_create(vm, { 'driver': imgfmt, | |
61 | 'file': 'imgfile', | |
62 | 'size': size }) | |
63 | vm.shutdown() | |
64 | ||
65 | iotests.img_info_log(disk_path) | |
66 | ||
67 | # | |
68 | # Successful image creation (inline blockdev-add, explicit defaults) | |
69 | # | |
70 | iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===") | |
71 | iotests.log("") | |
72 | ||
73 | # Choose a different size to show that we got a new image | |
74 | size = 64 * 1024 * 1024 | |
75 | ||
76 | vm.launch() | |
77 | blockdev_create(vm, { 'driver': 'file', | |
78 | 'filename': disk_path, | |
79 | 'size': 0 }) | |
80 | ||
81 | blockdev_create(vm, { 'driver': imgfmt, | |
82 | 'file': { | |
83 | 'driver': 'file', | |
84 | 'filename': disk_path, | |
85 | }, | |
86 | 'size': size, | |
87 | 'extents': [], | |
88 | 'subformat': 'monolithicSparse', | |
89 | 'adapter-type': 'ide', | |
90 | 'hwversion': '4', | |
91 | 'zeroed-grain': False }) | |
92 | vm.shutdown() | |
93 | ||
94 | iotests.img_info_log(disk_path) | |
95 | ||
96 | # | |
97 | # Successful image creation (non-default options) | |
98 | # | |
99 | iotests.log("=== Successful image creation (with non-default options) ===") | |
100 | iotests.log("") | |
101 | ||
102 | # Choose a different size to show that we got a new image | |
103 | size = 32 * 1024 * 1024 | |
104 | ||
105 | vm.launch() | |
106 | blockdev_create(vm, { 'driver': 'file', | |
107 | 'filename': disk_path, | |
108 | 'size': 0 }) | |
109 | ||
110 | blockdev_create(vm, { 'driver': imgfmt, | |
111 | 'file': { | |
112 | 'driver': 'file', | |
113 | 'filename': disk_path, | |
114 | }, | |
115 | 'size': size, | |
116 | 'extents': [], | |
117 | 'subformat': 'monolithicSparse', | |
118 | 'adapter-type': 'buslogic', | |
119 | 'zeroed-grain': True }) | |
120 | vm.shutdown() | |
121 | ||
122 | iotests.img_info_log(disk_path) | |
123 | ||
124 | # | |
125 | # Invalid BlockdevRef | |
126 | # | |
127 | iotests.log("=== Invalid BlockdevRef ===") | |
128 | iotests.log("") | |
129 | ||
130 | vm.launch() | |
131 | blockdev_create(vm, { 'driver': imgfmt, | |
132 | 'file': "this doesn't exist", | |
133 | 'size': size }) | |
134 | vm.shutdown() | |
135 | ||
136 | # | |
137 | # Adapter types | |
138 | # | |
139 | ||
140 | iotests.log("=== Adapter types ===") | |
141 | iotests.log("") | |
142 | ||
143 | vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path)) | |
144 | ||
145 | # Valid | |
146 | iotests.log("== Valid adapter types ==") | |
147 | iotests.log("") | |
148 | ||
149 | vm.launch() | |
150 | for adapter_type in [ 'ide', 'buslogic', 'lsilogic', 'legacyESX' ]: | |
151 | blockdev_create(vm, { 'driver': imgfmt, | |
152 | 'file': 'node0', | |
153 | 'size': size, | |
154 | 'adapter-type': adapter_type }) | |
155 | vm.shutdown() | |
156 | ||
157 | # Invalid | |
158 | iotests.log("== Invalid adapter types ==") | |
159 | iotests.log("") | |
160 | ||
161 | vm.launch() | |
162 | for adapter_type in [ 'foo', 'IDE', 'legacyesx', 1 ]: | |
163 | blockdev_create(vm, { 'driver': imgfmt, | |
164 | 'file': 'node0', | |
165 | 'size': size, | |
166 | 'adapter-type': adapter_type }) | |
167 | vm.shutdown() | |
168 | ||
169 | # | |
170 | # Other subformats | |
171 | # | |
172 | iotests.log("=== Other subformats ===") | |
173 | iotests.log("") | |
174 | ||
175 | for path in [ extent1_path, extent2_path, extent3_path ]: | |
176 | msg = iotests.qemu_img_pipe('create', '-f', imgfmt, path, '0') | |
177 | iotests.log(msg, [iotests.filter_testfiles]) | |
178 | ||
179 | vm.add_blockdev('driver=file,filename=%s,node-name=ext1' % (extent1_path)) | |
180 | vm.add_blockdev('driver=file,filename=%s,node-name=ext2' % (extent2_path)) | |
181 | vm.add_blockdev('driver=file,filename=%s,node-name=ext3' % (extent3_path)) | |
182 | ||
183 | # Missing extent | |
184 | iotests.log("== Missing extent ==") | |
185 | iotests.log("") | |
186 | ||
187 | vm.launch() | |
188 | blockdev_create(vm, { 'driver': imgfmt, | |
189 | 'file': 'node0', | |
190 | 'size': size, | |
191 | 'subformat': 'monolithicFlat' }) | |
192 | vm.shutdown() | |
193 | ||
194 | # Correct extent | |
195 | iotests.log("== Correct extent ==") | |
196 | iotests.log("") | |
197 | ||
198 | vm.launch() | |
199 | blockdev_create(vm, { 'driver': imgfmt, | |
200 | 'file': 'node0', | |
201 | 'size': size, | |
202 | 'subformat': 'monolithicFlat', | |
203 | 'extents': ['ext1'] }) | |
204 | vm.shutdown() | |
205 | ||
206 | # Extra extent | |
207 | iotests.log("== Extra extent ==") | |
208 | iotests.log("") | |
209 | ||
210 | vm.launch() | |
211 | blockdev_create(vm, { 'driver': imgfmt, | |
212 | 'file': 'node0', | |
213 | 'size': 512, | |
214 | 'subformat': 'monolithicFlat', | |
215 | 'extents': ['ext1', 'ext2', 'ext3'] }) | |
216 | vm.shutdown() | |
217 | ||
218 | # Split formats | |
219 | iotests.log("== Split formats ==") | |
220 | iotests.log("") | |
221 | ||
222 | for size in [ 512, 1073741824, 2147483648, 5368709120 ]: | |
223 | for subfmt in [ 'twoGbMaxExtentFlat', 'twoGbMaxExtentSparse' ]: | |
224 | iotests.log("= %s %d =" % (subfmt, size)) | |
225 | iotests.log("") | |
226 | ||
10ba68d1 | 227 | num_extents = int(math.ceil(size / 2.0**31)) |
4a960ece KW |
228 | extents = [ "ext%d" % (i) for i in range(1, num_extents + 1) ] |
229 | ||
1c4e7b64 KW |
230 | vm.launch() |
231 | blockdev_create(vm, { 'driver': imgfmt, | |
232 | 'file': 'node0', | |
233 | 'size': size, | |
234 | 'subformat': subfmt, | |
4a960ece | 235 | 'extents': extents }) |
1c4e7b64 KW |
236 | vm.shutdown() |
237 | ||
238 | iotests.img_info_log(disk_path) |