3 # Test case for the QMP 'change' command and all other associated
6 # Copyright (C) 2015 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/>.
26 from iotests
import qemu_img
28 old_img
= os
.path
.join(iotests
.test_dir
, 'test0.img')
29 new_img
= os
.path
.join(iotests
.test_dir
, 'test1.img')
31 class ChangeBaseClass(iotests
.QMPTestCase
):
35 def process_events(self
):
36 for event
in self
.vm
.get_qmp_events(wait
=False):
37 if (event
['event'] == 'DEVICE_TRAY_MOVED' and
38 event
['data']['device'] == 'drive0'):
39 if event
['data']['tray-open'] == False:
40 self
.has_closed
= True
42 self
.has_opened
= True
44 def wait_for_open(self
):
45 timeout
= time
.clock() + 3
46 while not self
.has_opened
and time
.clock() < timeout
:
48 if not self
.has_opened
:
49 self
.fail('Timeout while waiting for the tray to open')
51 def wait_for_close(self
):
52 timeout
= time
.clock() + 3
53 while not self
.has_closed
and time
.clock() < timeout
:
55 if not self
.has_opened
:
56 self
.fail('Timeout while waiting for the tray to close')
58 class GeneralChangeTestsBaseClass(ChangeBaseClass
):
59 def test_change(self
):
60 result
= self
.vm
.qmp('change', device
='drive0', target
=new_img
,
62 self
.assert_qmp(result
, 'return', {})
67 result
= self
.vm
.qmp('query-block')
68 self
.assert_qmp(result
, 'return[0]/tray_open', False)
69 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
71 def test_blockdev_change_medium(self
):
72 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
74 format
=iotests
.imgfmt
)
75 self
.assert_qmp(result
, 'return', {})
80 result
= self
.vm
.qmp('query-block')
81 self
.assert_qmp(result
, 'return[0]/tray_open', False)
82 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
85 result
= self
.vm
.qmp('eject', device
='drive0', force
=True)
86 self
.assert_qmp(result
, 'return', {})
90 result
= self
.vm
.qmp('query-block')
91 self
.assert_qmp(result
, 'return[0]/tray_open', True)
92 self
.assert_qmp_absent(result
, 'return[0]/inserted')
94 def test_tray_eject_change(self
):
95 result
= self
.vm
.qmp('eject', device
='drive0', force
=True)
96 self
.assert_qmp(result
, 'return', {})
100 result
= self
.vm
.qmp('query-block')
101 self
.assert_qmp(result
, 'return[0]/tray_open', True)
102 self
.assert_qmp_absent(result
, 'return[0]/inserted')
104 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
106 format
=iotests
.imgfmt
)
107 self
.assert_qmp(result
, 'return', {})
109 self
.wait_for_close()
111 result
= self
.vm
.qmp('query-block')
112 self
.assert_qmp(result
, 'return[0]/tray_open', False)
113 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
115 def test_tray_open_close(self
):
116 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0', force
=True)
117 self
.assert_qmp(result
, 'return', {})
121 result
= self
.vm
.qmp('query-block')
122 self
.assert_qmp(result
, 'return[0]/tray_open', True)
123 if self
.was_empty
== True:
124 self
.assert_qmp_absent(result
, 'return[0]/inserted')
126 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
128 result
= self
.vm
.qmp('blockdev-close-tray', device
='drive0')
129 self
.assert_qmp(result
, 'return', {})
131 if self
.has_real_tray
or not self
.was_empty
:
132 self
.wait_for_close()
134 result
= self
.vm
.qmp('query-block')
135 if self
.has_real_tray
or not self
.was_empty
:
136 self
.assert_qmp(result
, 'return[0]/tray_open', False)
138 self
.assert_qmp(result
, 'return[0]/tray_open', True)
139 if self
.was_empty
== True:
140 self
.assert_qmp_absent(result
, 'return[0]/inserted')
142 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
144 def test_tray_eject_close(self
):
145 result
= self
.vm
.qmp('eject', device
='drive0', force
=True)
146 self
.assert_qmp(result
, 'return', {})
150 result
= self
.vm
.qmp('query-block')
151 self
.assert_qmp(result
, 'return[0]/tray_open', True)
152 self
.assert_qmp_absent(result
, 'return[0]/inserted')
154 result
= self
.vm
.qmp('blockdev-close-tray', device
='drive0')
155 self
.assert_qmp(result
, 'return', {})
157 if self
.has_real_tray
:
158 self
.wait_for_close()
160 result
= self
.vm
.qmp('query-block')
161 if self
.has_real_tray
:
162 self
.assert_qmp(result
, 'return[0]/tray_open', False)
164 self
.assert_qmp(result
, 'return[0]/tray_open', True)
165 self
.assert_qmp_absent(result
, 'return[0]/inserted')
167 def test_tray_open_change(self
):
168 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0', force
=True)
169 self
.assert_qmp(result
, 'return', {})
173 result
= self
.vm
.qmp('query-block')
174 self
.assert_qmp(result
, 'return[0]/tray_open', True)
175 if self
.was_empty
== True:
176 self
.assert_qmp_absent(result
, 'return[0]/inserted')
178 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
180 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
182 format
=iotests
.imgfmt
)
183 self
.assert_qmp(result
, 'return', {})
185 self
.wait_for_close()
187 result
= self
.vm
.qmp('query-block')
188 self
.assert_qmp(result
, 'return[0]/tray_open', False)
189 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
191 def test_cycle(self
):
192 result
= self
.vm
.qmp('blockdev-add',
193 options
={'node-name': 'new',
194 'driver': iotests
.imgfmt
,
195 'file': {'filename': new_img
,
197 self
.assert_qmp(result
, 'return', {})
199 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0', force
=True)
200 self
.assert_qmp(result
, 'return', {})
204 result
= self
.vm
.qmp('query-block')
205 self
.assert_qmp(result
, 'return[0]/tray_open', True)
206 if self
.was_empty
== True:
207 self
.assert_qmp_absent(result
, 'return[0]/inserted')
209 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
211 result
= self
.vm
.qmp('x-blockdev-remove-medium', device
='drive0')
212 self
.assert_qmp(result
, 'return', {})
214 result
= self
.vm
.qmp('query-block')
215 self
.assert_qmp(result
, 'return[0]/tray_open', True)
216 self
.assert_qmp_absent(result
, 'return[0]/inserted')
218 result
= self
.vm
.qmp('x-blockdev-insert-medium', device
='drive0',
220 self
.assert_qmp(result
, 'return', {})
222 result
= self
.vm
.qmp('query-block')
223 self
.assert_qmp(result
, 'return[0]/tray_open', True)
224 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
226 result
= self
.vm
.qmp('blockdev-close-tray', device
='drive0')
227 self
.assert_qmp(result
, 'return', {})
229 self
.wait_for_close()
231 result
= self
.vm
.qmp('query-block')
232 self
.assert_qmp(result
, 'return[0]/tray_open', False)
233 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
235 def test_close_on_closed(self
):
236 result
= self
.vm
.qmp('blockdev-close-tray', device
='drive0')
238 self
.assert_qmp(result
, 'return', {})
239 self
.assertEquals(self
.vm
.get_qmp_events(wait
=False), [])
241 def test_remove_on_closed(self
):
246 result
= self
.vm
.qmp('x-blockdev-remove-medium', device
='drive0')
247 self
.assert_qmp(result
, 'error/class', 'GenericError')
249 def test_insert_on_closed(self
):
254 result
= self
.vm
.qmp('blockdev-add',
255 options
={'node-name': 'new',
256 'driver': iotests
.imgfmt
,
257 'file': {'filename': new_img
,
259 self
.assert_qmp(result
, 'return', {})
261 result
= self
.vm
.qmp('x-blockdev-insert-medium', device
='drive0',
263 self
.assert_qmp(result
, 'error/class', 'GenericError')
265 class TestInitiallyFilled(GeneralChangeTestsBaseClass
):
268 def setUp(self
, media
, interface
):
269 qemu_img('create', '-f', iotests
.imgfmt
, old_img
, '1440k')
270 qemu_img('create', '-f', iotests
.imgfmt
, new_img
, '1440k')
271 self
.vm
= iotests
.VM().add_drive(old_img
, 'media=%s' % media
, interface
)
279 def test_insert_on_filled(self
):
280 result
= self
.vm
.qmp('blockdev-add',
281 options
={'node-name': 'new',
282 'driver': iotests
.imgfmt
,
283 'file': {'filename': new_img
,
285 self
.assert_qmp(result
, 'return', {})
287 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0')
288 self
.assert_qmp(result
, 'return', {})
292 result
= self
.vm
.qmp('x-blockdev-insert-medium', device
='drive0',
294 self
.assert_qmp(result
, 'error/class', 'GenericError')
296 class TestInitiallyEmpty(GeneralChangeTestsBaseClass
):
299 def setUp(self
, media
, interface
):
300 qemu_img('create', '-f', iotests
.imgfmt
, new_img
, '1440k')
301 self
.vm
= iotests
.VM().add_drive(None, 'media=%s' % media
, interface
)
308 def test_remove_on_empty(self
):
309 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0')
310 self
.assert_qmp(result
, 'return', {})
314 result
= self
.vm
.qmp('x-blockdev-remove-medium', device
='drive0')
316 self
.assert_qmp(result
, 'return', {})
318 class TestCDInitiallyFilled(TestInitiallyFilled
):
319 TestInitiallyFilled
= TestInitiallyFilled
323 self
.TestInitiallyFilled
.setUp(self
, 'cdrom', 'ide')
325 class TestCDInitiallyEmpty(TestInitiallyEmpty
):
326 TestInitiallyEmpty
= TestInitiallyEmpty
330 self
.TestInitiallyEmpty
.setUp(self
, 'cdrom', 'ide')
332 class TestFloppyInitiallyFilled(TestInitiallyFilled
):
333 TestInitiallyFilled
= TestInitiallyFilled
334 has_real_tray
= False
337 self
.TestInitiallyFilled
.setUp(self
, 'disk', 'floppy')
339 class TestFloppyInitiallyEmpty(TestInitiallyEmpty
):
340 TestInitiallyEmpty
= TestInitiallyEmpty
341 has_real_tray
= False
344 self
.TestInitiallyEmpty
.setUp(self
, 'disk', 'floppy')
345 # FDDs not having a real tray and there not being a medium inside the
346 # tray at startup means the tray will be considered open
347 self
.has_opened
= True
349 class TestChangeReadOnly(ChangeBaseClass
):
351 qemu_img('create', '-f', iotests
.imgfmt
, old_img
, '1440k')
352 qemu_img('create', '-f', iotests
.imgfmt
, new_img
, '1440k')
353 self
.vm
= iotests
.VM()
357 os
.chmod(old_img
, 0666)
358 os
.chmod(new_img
, 0666)
362 def test_ro_ro_retain(self
):
363 os
.chmod(old_img
, 0444)
364 os
.chmod(new_img
, 0444)
365 self
.vm
.add_drive(old_img
, 'media=disk,read-only=on', 'floppy')
368 result
= self
.vm
.qmp('query-block')
369 self
.assert_qmp(result
, 'return[0]/tray_open', False)
370 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
371 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
373 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
375 format
=iotests
.imgfmt
,
376 read_only_mode
='retain')
377 self
.assert_qmp(result
, 'return', {})
380 self
.wait_for_close()
382 result
= self
.vm
.qmp('query-block')
383 self
.assert_qmp(result
, 'return[0]/tray_open', False)
384 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
385 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
387 def test_ro_rw_retain(self
):
388 os
.chmod(old_img
, 0444)
389 self
.vm
.add_drive(old_img
, 'media=disk,read-only=on', 'floppy')
392 result
= self
.vm
.qmp('query-block')
393 self
.assert_qmp(result
, 'return[0]/tray_open', False)
394 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
395 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
397 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
399 format
=iotests
.imgfmt
,
400 read_only_mode
='retain')
401 self
.assert_qmp(result
, 'return', {})
404 self
.wait_for_close()
406 result
= self
.vm
.qmp('query-block')
407 self
.assert_qmp(result
, 'return[0]/tray_open', False)
408 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
409 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
411 def test_rw_ro_retain(self
):
412 os
.chmod(new_img
, 0444)
413 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
416 result
= self
.vm
.qmp('query-block')
417 self
.assert_qmp(result
, 'return[0]/tray_open', False)
418 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
419 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
421 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
423 format
=iotests
.imgfmt
,
424 read_only_mode
='retain')
425 self
.assert_qmp(result
, 'error/class', 'GenericError')
427 self
.assertEquals(self
.vm
.get_qmp_events(wait
=False), [])
429 result
= self
.vm
.qmp('query-block')
430 self
.assert_qmp(result
, 'return[0]/tray_open', False)
431 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
432 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
434 def test_ro_rw(self
):
435 os
.chmod(old_img
, 0444)
436 self
.vm
.add_drive(old_img
, 'media=disk,read-only=on', 'floppy')
439 result
= self
.vm
.qmp('query-block')
440 self
.assert_qmp(result
, 'return[0]/tray_open', False)
441 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
442 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
444 result
= self
.vm
.qmp('blockdev-change-medium',
447 format
=iotests
.imgfmt
,
448 read_only_mode
='read-write')
449 self
.assert_qmp(result
, 'return', {})
452 self
.wait_for_close()
454 result
= self
.vm
.qmp('query-block')
455 self
.assert_qmp(result
, 'return[0]/tray_open', False)
456 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
457 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
459 def test_rw_ro(self
):
460 os
.chmod(new_img
, 0444)
461 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
464 result
= self
.vm
.qmp('query-block')
465 self
.assert_qmp(result
, 'return[0]/tray_open', False)
466 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
467 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
469 result
= self
.vm
.qmp('blockdev-change-medium',
472 format
=iotests
.imgfmt
,
473 read_only_mode
='read-only')
474 self
.assert_qmp(result
, 'return', {})
477 self
.wait_for_close()
479 result
= self
.vm
.qmp('query-block')
480 self
.assert_qmp(result
, 'return[0]/tray_open', False)
481 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
482 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
484 def test_make_rw_ro(self
):
485 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
488 result
= self
.vm
.qmp('query-block')
489 self
.assert_qmp(result
, 'return[0]/tray_open', False)
490 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
491 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
493 result
= self
.vm
.qmp('blockdev-change-medium',
496 format
=iotests
.imgfmt
,
497 read_only_mode
='read-only')
498 self
.assert_qmp(result
, 'return', {})
501 self
.wait_for_close()
503 result
= self
.vm
.qmp('query-block')
504 self
.assert_qmp(result
, 'return[0]/tray_open', False)
505 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
506 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
508 def test_make_ro_rw(self
):
509 os
.chmod(new_img
, 0444)
510 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
513 result
= self
.vm
.qmp('query-block')
514 self
.assert_qmp(result
, 'return[0]/tray_open', False)
515 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
516 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
518 result
= self
.vm
.qmp('blockdev-change-medium',
521 format
=iotests
.imgfmt
,
522 read_only_mode
='read-write')
523 self
.assert_qmp(result
, 'error/class', 'GenericError')
525 self
.assertEquals(self
.vm
.get_qmp_events(wait
=False), [])
527 result
= self
.vm
.qmp('query-block')
528 self
.assert_qmp(result
, 'return[0]/tray_open', False)
529 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
530 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
532 def test_make_rw_ro_by_retain(self
):
533 os
.chmod(old_img
, 0444)
534 self
.vm
.add_drive(old_img
, 'media=disk,read-only=on', 'floppy')
537 result
= self
.vm
.qmp('query-block')
538 self
.assert_qmp(result
, 'return[0]/tray_open', False)
539 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
540 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
542 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
544 format
=iotests
.imgfmt
,
545 read_only_mode
='retain')
546 self
.assert_qmp(result
, 'return', {})
549 self
.wait_for_close()
551 result
= self
.vm
.qmp('query-block')
552 self
.assert_qmp(result
, 'return[0]/tray_open', False)
553 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
554 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
556 def test_make_ro_rw_by_retain(self
):
557 os
.chmod(new_img
, 0444)
558 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
561 result
= self
.vm
.qmp('query-block')
562 self
.assert_qmp(result
, 'return[0]/tray_open', False)
563 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
564 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
566 result
= self
.vm
.qmp('blockdev-change-medium', device
='drive0',
568 format
=iotests
.imgfmt
,
569 read_only_mode
='retain')
570 self
.assert_qmp(result
, 'error/class', 'GenericError')
572 self
.assertEquals(self
.vm
.get_qmp_events(wait
=False), [])
574 result
= self
.vm
.qmp('query-block')
575 self
.assert_qmp(result
, 'return[0]/tray_open', False)
576 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
577 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
579 def test_rw_ro_cycle(self
):
580 os
.chmod(new_img
, 0444)
581 self
.vm
.add_drive(old_img
, 'media=disk', 'floppy')
584 result
= self
.vm
.qmp('query-block')
585 self
.assert_qmp(result
, 'return[0]/tray_open', False)
586 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
587 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
589 result
= self
.vm
.qmp('blockdev-add',
590 options
={'node-name': 'new',
591 'driver': iotests
.imgfmt
,
593 'file': {'filename': new_img
,
595 self
.assert_qmp(result
, 'return', {})
597 result
= self
.vm
.qmp('blockdev-open-tray', device
='drive0', force
=True)
598 self
.assert_qmp(result
, 'return', {})
602 result
= self
.vm
.qmp('query-block')
603 self
.assert_qmp(result
, 'return[0]/tray_open', True)
604 self
.assert_qmp(result
, 'return[0]/inserted/ro', False)
605 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
607 result
= self
.vm
.qmp('x-blockdev-remove-medium', device
='drive0')
608 self
.assert_qmp(result
, 'return', {})
610 result
= self
.vm
.qmp('query-block')
611 self
.assert_qmp(result
, 'return[0]/tray_open', True)
612 self
.assert_qmp_absent(result
, 'return[0]/inserted')
614 result
= self
.vm
.qmp('x-blockdev-insert-medium', device
='drive0',
616 self
.assert_qmp(result
, 'return', {})
618 result
= self
.vm
.qmp('query-block')
619 self
.assert_qmp(result
, 'return[0]/tray_open', True)
620 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
621 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
623 result
= self
.vm
.qmp('blockdev-close-tray', device
='drive0')
624 self
.assert_qmp(result
, 'return', {})
626 self
.wait_for_close()
628 result
= self
.vm
.qmp('query-block')
629 self
.assert_qmp(result
, 'return[0]/tray_open', False)
630 self
.assert_qmp(result
, 'return[0]/inserted/ro', True)
631 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
633 GeneralChangeTestsBaseClass
= None
634 TestInitiallyFilled
= None
635 TestInitiallyEmpty
= None
638 class TestBlockJobsAfterCycle(ChangeBaseClass
):
640 qemu_img('create', '-f', iotests
.imgfmt
, old_img
, '1M')
642 self
.vm
= iotests
.VM()
645 result
= self
.vm
.qmp('blockdev-add',
646 options
={'id': 'drive0',
647 'driver': 'null-co'})
648 self
.assert_qmp(result
, 'return', {})
650 result
= self
.vm
.qmp('query-block')
651 self
.assert_qmp(result
, 'return[0]/tray_open', False)
652 self
.assert_qmp(result
, 'return[0]/inserted/image/format', 'null-co')
654 # For device-less BBs, calling blockdev-open-tray or blockdev-close-tray
656 result
= self
.vm
.qmp('x-blockdev-remove-medium', device
='drive0')
657 self
.assert_qmp(result
, 'return', {})
659 result
= self
.vm
.qmp('query-block')
660 self
.assert_qmp_absent(result
, 'return[0]/inserted')
662 result
= self
.vm
.qmp('blockdev-add',
663 options
={'node-name': 'node0',
664 'driver': iotests
.imgfmt
,
665 'file': {'filename': old_img
,
667 self
.assert_qmp(result
, 'return', {})
669 result
= self
.vm
.qmp('x-blockdev-insert-medium', device
='drive0',
671 self
.assert_qmp(result
, 'return', {})
673 result
= self
.vm
.qmp('query-block')
674 self
.assert_qmp(result
, 'return[0]/tray_open', False)
675 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', old_img
)
685 def test_snapshot_and_commit(self
):
686 # We need backing file support
687 if iotests
.imgfmt
!= 'qcow2' and iotests
.imgfmt
!= 'qed':
690 result
= self
.vm
.qmp('blockdev-snapshot-sync', device
='drive0',
691 snapshot_file
=new_img
,
692 format
=iotests
.imgfmt
)
693 self
.assert_qmp(result
, 'return', {})
695 result
= self
.vm
.qmp('query-block')
696 self
.assert_qmp(result
, 'return[0]/inserted/image/filename', new_img
)
697 self
.assert_qmp(result
,
698 'return[0]/inserted/image/backing-image/filename',
701 result
= self
.vm
.qmp('block-commit', device
='drive0')
702 self
.assert_qmp(result
, 'return', {})
704 self
.vm
.event_wait(name
='BLOCK_JOB_READY')
706 result
= self
.vm
.qmp('query-block-jobs')
707 self
.assert_qmp(result
, 'return[0]/device', 'drive0')
709 result
= self
.vm
.qmp('block-job-complete', device
='drive0')
710 self
.assert_qmp(result
, 'return', {})
712 self
.vm
.event_wait(name
='BLOCK_JOB_COMPLETED')
715 if __name__
== '__main__':
716 if iotests
.qemu_default_machine
!= 'pc':
717 # We need floppy and IDE CD-ROM
718 iotests
.notrun('not suitable for this machine type: %s' %
719 iotests
.qemu_default_machine
)