Lines Matching refs:self

48     def setUp(self):  argument
56 self.vm = iotests.VM()
57 self.vm.launch()
59 def tearDown(self): argument
60 self.vm.shutdown()
61 self.check_qemu_io_errors()
70 def run_qemu_io(self, img, cmd): argument
71 result = self.vm.hmp_qemu_io(img, cmd)
72 self.assert_qmp(result, 'return', '')
73 self.total_io_cmds += 1
77 def check_qemu_io_errors(self): argument
78 self.assertFalse(self.vm.is_running())
80 log = self.vm.get_log()
86 self.assertEqual(found, self.total_io_cmds,
88 (found, self.total_io_cmds))
91 def reopenMultiple(self, opts, errmsg = None): argument
92 result = self.vm.qmp('blockdev-reopen', conv_keys=False, options=opts)
94 self.assert_qmp(result, 'error/class', 'GenericError')
95 self.assert_qmp(result, 'error/desc', errmsg)
97 self.assert_qmp(result, 'return', {})
102 def reopen(self, opts, newopts = {}, errmsg = None): argument
116 self.reopenMultiple([ opts ], errmsg)
120 def get_node(self, node_name): argument
121 result = self.vm.qmp('query-named-block-nodes')
129 def check_node_graph(self, graph): argument
130 result = self.vm.qmp('query-named-block-nodes')
131 self.assertEqual(json.dumps(graph, sort_keys=True),
136 def test_incorrect_parameters_single_file(self): argument
139 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
140 original_graph = self.vm.qmp('query-named-block-nodes')
143 self.reopen(opts)
146 self.reopen(opts, {'file': 'hd0-file'})
149self.reopen(opts, {'node-name': 'not-found'}, "Failed to find node with node-name='not-found'")
150 self.reopen(opts, {'node-name': ''}, "Failed to find node with node-name=''")
151self.reopen(opts, {'node-name': None}, "Invalid parameter type for 'options[0].node-name', expecte…
152 self.reopen(opts, {'driver': 'raw'}, "Cannot change the option 'driver'")
153 self.reopen(opts, {'driver': ''}, "Parameter 'driver' does not accept value ''")
154self.reopen(opts, {'driver': None}, "Invalid parameter type for 'options[0].driver', expected: str…
155 self.reopen(opts, {'file': 'not-found'}, "Cannot find device='' nor node-name='not-found'")
156 self.reopen(opts, {'file': ''}, "Cannot find device='' nor node-name=''")
157self.reopen(opts, {'file': None}, "Invalid parameter type for 'file', expected: BlockdevRef")
158 self.reopen(opts, {'file.node-name': 'newname'}, "Cannot change the option 'node-name'")
159 self.reopen(opts, {'file.driver': 'host_device'}, "Cannot change the option 'driver'")
160 self.reopen(opts, {'file.filename': hd_path[1]}, "Cannot change the option 'filename'")
161 self.reopen(opts, {'file.aio': 'native'}, "Cannot change the option 'aio'")
162 self.reopen(opts, {'file.locking': 'off'}, "Cannot change the option 'locking'")
163self.reopen(opts, {'file.filename': None}, "Invalid parameter type for 'options[0].file.filename',…
167 self.reopen(opts, {}, "node-name not specified")
170 self.check_node_graph(original_graph)
173 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
177 def test_incorrect_parameters_backing_file(self): argument
181 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
182 original_graph = self.vm.qmp('query-named-block-nodes')
185 self.reopen(opts, {}, "backing is missing for 'hd1'")
191 self.reopen(opts, {'backing': backing_node_name})
194self.reopen(opts, {'backing': 'not-found'}, "Cannot find device=\'\' nor node-name=\'not-found\'")
195 self.reopen(opts, {'backing': ''}, "Cannot find device=\'\' nor node-name=\'\'")
201 self.reopen(opts)
204 self.reopen(opts, {'backing.node-name': 'newname'}, "Cannot change the option 'node-name'")
205 self.reopen(opts, {'backing.driver': 'raw'}, "Cannot change the option 'driver'")
206self.reopen(opts, {'backing.file.node-name': 'newname'}, "Cannot change the option 'node-name'")
207self.reopen(opts, {'backing.file.driver': 'host_device'}, "Cannot change the option 'driver'")
210 self.check_node_graph(original_graph)
213 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd1')
216 def test_reopen(self): argument
229 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
230 original_graph = self.vm.qmp('query-named-block-nodes')
233 self.reopen(opts)
236 self.assert_qmp(self.get_node('hd1'), 'ro', False)
238 self.reopen(opts, {'read-only': True})
239 self.assert_qmp(self.get_node('hd1'), 'ro', True)
240 self.reopen(opts)
241 self.assert_qmp(self.get_node('hd1'), 'ro', False)
244 self.assert_qmp(self.get_node('hd1'), 'cache/writeback', True)
245 self.assert_qmp(self.get_node('hd1'), 'cache/direct', False)
246 self.assert_qmp(self.get_node('hd1'), 'cache/no-flush', False)
247 self.reopen(opts, {'cache': { 'direct': supports_direct, 'no-flush': True }})
248 self.assert_qmp(self.get_node('hd1'), 'cache/writeback', True)
249 self.assert_qmp(self.get_node('hd1'), 'cache/direct', supports_direct)
250 self.assert_qmp(self.get_node('hd1'), 'cache/no-flush', True)
253 self.reopen(opts)
254 self.assert_qmp(self.get_node('hd1'), 'cache/writeback', True)
255 self.assert_qmp(self.get_node('hd1'), 'cache/direct', False)
256 self.assert_qmp(self.get_node('hd1'), 'cache/no-flush', False)
259 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'off')
260 self.reopen(opts, {'detect-zeroes': 'on'})
261 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'on')
262 self.reopen(opts, {'detect-zeroes': 'unmap'},
265 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'on')
266 self.reopen(opts, {'detect-zeroes': 'unmap', 'discard': 'unmap'})
267 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'unmap')
268 self.reopen(opts)
269 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'off')
272 self.reopen(opts, {'force-share': True}, "Cannot change the option 'force-share'")
277 self.reopen(opts, {'l2-cache-entry-size': 128 * 1024},
280 self.reopen(opts, {'l2-cache-size': 1024 * 1024,
283 self.reopen(opts, {'l2-cache-size': 4 * 1024 * 1024,
286 self.reopen(opts, {'pass-discard-request': True})
290 self.check_node_graph(original_graph)
296 self.reopen(opts)
297 self.check_node_graph(original_graph)
300 self.reopen(opts, {'backing': None})
301 self.assert_qmp_absent(self.get_node('hd1'), 'image/backing-image')
304 self.vm.cmd('blockdev-add', conv_keys = False, **hd_opts(0))
307 self.reopen(opts, {'backing': 'hd0'})
308 self.assert_qmp(self.get_node('hd1'), 'image/backing-image/filename', hd_path[0])
311 self.reopen(hd_opts(0), {'read-only': True})
312 self.check_node_graph(original_graph)
315 self.reopen(opts, {}, "Cannot change the option 'backing.driver'")
318 result = self.vm.qmp('blockdev-del', conv_keys = True, node_name = 'hd0')
319 self.assert_qmp(result, 'error/class', 'GenericError')
320self.assert_qmp(result, 'error/desc', "Node 'hd0' is busy: node is used as backing hd of 'hd1'")
323 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd1')
324 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
327 def test_reopen_raw(self): argument
340 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
343 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
347 self.reopen(opts, {'offset': 1024*1024})
348 self.run_qemu_io("hd0", "read -P 0xa1 0 1M")
352 self.reopen(opts)
353 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
356 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
361 def test_reset_default_values(self): argument
370 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
373 self.reopen(opts, { 'file.x-check-cache-dropped': False })
376 self.reopen(opts)
379 self.reopen(opts, { 'file.locking': 'on' }, "Cannot change the option 'locking'")
381 self.reopen(opts, {}, "Option 'locking' cannot be reset to its default value")
383 self.reopen(opts, { 'file.locking': 'off' })
386 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
391 def test_io_with_graph_changes(self): argument
398 self.vm.cmd('blockdev-add', conv_keys = False, **opts[i])
401 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
402 self.run_qemu_io("hd0", "read -P 0 1M 1M")
403 self.run_qemu_io("hd0", "read -P 0 2M 1M")
406 self.reopen(opts[0], {'backing': 'hd1'})
408 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
409 self.run_qemu_io("hd0", "read -P 0xa1 1M 1M")
410 self.run_qemu_io("hd0", "read -P 0 2M 1M")
413 self.reopen(opts[2], {'backing': 'hd1'})
415 self.run_qemu_io("hd2", "read -P 0 0 1M")
416 self.run_qemu_io("hd2", "read -P 0xa1 1M 1M")
417 self.run_qemu_io("hd2", "read -P 0xa2 2M 1M")
420 self.reopen(opts[0], {'backing': 'hd2'})
422 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
423 self.run_qemu_io("hd0", "read -P 0xa1 1M 1M")
424 self.run_qemu_io("hd0", "read -P 0xa2 2M 1M")
427 self.reopen(opts[2], {'backing': None})
429 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
430 self.run_qemu_io("hd0", "read -P 0 1M 1M")
431 self.run_qemu_io("hd0", "read -P 0xa2 2M 1M")
434 self.reopen(opts[1], {'backing': 'hd2'})
435 self.reopen(opts[0], {'backing': 'hd1'})
437 self.run_qemu_io("hd0", "read -P 0xa0 0 1M")
438 self.run_qemu_io("hd0", "read -P 0xa1 1M 1M")
439 self.run_qemu_io("hd0", "read -P 0xa2 2M 1M")
442 self.reopen(opts[2], {'backing': 'hd1'},
446 self.reopen(opts[0], {'backing': 'hd2'})
448 self.run_qemu_io("hd1", "read -P 0 0 1M")
449 self.run_qemu_io("hd1", "read -P 0xa1 1M 1M")
450 self.run_qemu_io("hd1", "read -P 0xa2 2M 1M")
453 self.reopen(opts[2], {'backing': 'hd1'},
455 self.reopen(opts[2], {'file': 'hd0-file'},
458 result = self.vm.qmp('blockdev-del', conv_keys = True, node_name = 'hd2')
459 self.assert_qmp(result, 'error/class', 'GenericError')
460self.assert_qmp(result, 'error/desc', "Node 'hd2' is busy: node is used as backing hd of 'hd0'")
463 self.reopen(opts[1], {'backing': None})
465 self.run_qemu_io("hd1", "read -P 0 0 1M")
466 self.run_qemu_io("hd1", "read -P 0xa1 1M 1M")
467 self.run_qemu_io("hd1", "read -P 0 2M 1M")
472 self.reopen(opts[1], {}, "backing is missing for 'hd1'")
474 self.run_qemu_io("hd1", "read -P 0 0 1M")
475 self.run_qemu_io("hd1", "read -P 0xa1 1M 1M")
476 self.run_qemu_io("hd1", "read -P 0 2M 1M")
482 def test_graph_cycles(self): argument
489 self.vm.cmd('blockdev-add', conv_keys = False, **opts[i])
492 self.reopen(opts[0], {'backing': 'hd1'})
493 self.reopen(opts[2], {'backing': 'hd1'})
496 self.reopen(opts[1], {'backing': 'hd2'},
500 self.reopen(opts[2], {'backing': 'hd0'})
503 self.reopen(opts[1], {'backing': 'hd2'},
507 self.reopen(opts[1], {'backing': 'hd1'},
511 self.reopen(opts[0])
512 self.reopen(opts[2])
521 self.vm.cmd('blockdev-add', conv_keys = False, **bvopts)
524 self.reopen(bvopts, {}, "Block format 'blkverify' used by node 'bv'" +
528 self.reopen(opts[0], {'backing': 'bv'},
532 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'bv')
535 def test_replace_file(self): argument
543 self.vm.cmd('blockdev-add', conv_keys = False, **hd0_opts)
544 self.vm.cmd('blockdev-add', conv_keys = False, **hd1_opts)
549 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
552 self.run_qemu_io("hd", "read -P 0 0 10k")
553 self.run_qemu_io("hd", "write -P 0xa0 0 10k")
556 self.reopen(opts, {'file': 'hd1-file'})
557 self.run_qemu_io("hd", "read -P 0 0 10k")
558 self.run_qemu_io("hd", "write -P 0xa1 0 10k")
561 self.reopen(opts, {'file': 'hd0-file'})
562 self.run_qemu_io("hd", "read -P 0xa0 0 10k")
565 self.reopen(opts, {'file': 'hd1-file'})
566 self.run_qemu_io("hd", "read -P 0xa1 0 10k")
569 def test_insert_throttle_filter(self): argument
572 self.vm.cmd('blockdev-add', conv_keys = False, **hd0_opts)
577 self.vm.cmd('object-add', conv_keys = False, **opts)
583 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
586 self.reopen(hd0_opts, {'file': 'throttle0'})
589 self.reopen(hd0_opts, {'file': 'hd0-file'})
593 def test_insert_compress_filter(self): argument
596 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
602 self.vm.cmd('blockdev-add', conv_keys = False, **filter_opts)
606 self.run_qemu_io("hd", "write -z -u 0 128k")
609 self.run_qemu_io("hd", "write -P 0xa0 0 64k")
613 self.reopen(opts, {'file': 'compress0'})
614 self.run_qemu_io("hd", "write -P 0xa1 64k 64k")
618 self.reopen(opts, {'file': 'hd0'})
619 self.run_qemu_io("hd", "write -P 0xa2 128k 64k")
622 self.run_qemu_io("hd", "read -P 0xa0 0 64k")
623 self.run_qemu_io("hd", "read -P 0xa1 64k 64k")
624 self.run_qemu_io("hd", "read -P 0xa2 128k 64k")
626 self.vm.shutdown()
635 def test_swap_files(self): argument
638 self.vm.cmd('blockdev-add', conv_keys = False, **opts0)
641 self.vm.cmd('blockdev-add', conv_keys = False, **opts2)
644 self.run_qemu_io("hd0", "write -P 0xa0 0 1k")
645 self.run_qemu_io("hd2", "write -P 0xa2 0 1k")
648 self.run_qemu_io("hd0", "read -P 0xa0 0 1k")
649 self.run_qemu_io("hd2", "read -P 0xa2 0 1k")
653 self.reopen(opts0, {'file': 'hd2-file'},
658 self.reopen(opts2, {'file': 'hd0-file'},
668 self.reopenMultiple([opts0, opts2])
669 self.run_qemu_io("hd0", "read -P 0xa2 0 1k")
670 self.run_qemu_io("hd2", "read -P 0xa0 0 1k")
675 self.reopenMultiple([opts0, opts2])
676 self.run_qemu_io("hd0", "read -P 0xa0 0 1k")
677 self.run_qemu_io("hd2", "read -P 0xa2 0 1k")
681 def test_misc_drivers(self): argument
689 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
695 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
698 self.reopen(opts, {}, "Block format 'quorum' used by node 'quorum0'" +
703 self.reopen(hd_opts(0), {'backing': 'quorum0'},
707 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'quorum0')
711 self.vm.cmd('blockdev-del', conv_keys = True,
721 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
724 self.reopen(opts)
727 self.reopen(opts, {'image': 'hd1'}, "Cannot change the option 'image'")
728 self.reopen(opts, {'align': 33554432}, "Cannot change the option 'align'")
729 self.reopen(opts, {'config': '/non/existent'}, "Cannot change the option 'config'")
731 self.reopen(opts, {}, "Option 'config' cannot be reset to its default value")
734 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'bd')
741 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
744 self.reopen(opts, {'size': (1 << 30)}, "Cannot change the option 'size'")
748 self.reopen(opts, {}, "Option 'size' cannot be reset to its default value")
750 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'root')
757 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
761 self.reopen(opts, {'file.locking': 'on'})
762 self.reopen(opts, {'file.locking': 'off'}, "Cannot change the option 'locking'")
763 self.reopen(opts, {}, "Option 'locking' cannot be reset to its default value")
767 self.reopen(opts, {'locking': 'on'})
768 self.reopen(opts, {'locking': 'off'}, "Cannot change the option 'locking'")
769 self.reopen(opts, {}, "Option 'locking' cannot be reset to its default value")
771 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
778 self.vm.cmd('object-add', conv_keys = False, **opts)
782 self.vm.cmd('object-add', conv_keys = False, **opts)
787 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
790 self.reopen(opts)
793 self.reopen(opts, {'file': 'hd0'})
796self.reopen(opts, {'throttle-group': 'notfound'}, "Throttle group 'notfound' does not exist")
799 self.reopen(opts, {'throttle-group': 'group1'})
802 result = self.vm.qmp('object-del', id = 'group1')
803 self.assert_qmp(result, 'error/class', 'GenericError')
804 self.assert_qmp(result, 'error/desc', "object 'group1' is in use, can not be deleted")
807 self.reopen(opts)
810 result = self.vm.qmp('object-del', id = 'group0')
811 self.assert_qmp(result, 'error/class', 'GenericError')
812 self.assert_qmp(result, 'error/desc', "object 'group0' is in use, can not be deleted")
815 self.vm.cmd('object-del', id = 'group1')
818 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'throttle0')
821 self.vm.cmd('object-del', id = 'group0')
826 def test_missing_backing_options_1(self): argument
829 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
833 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
836 self.reopen(opts)
839 self.reopen(opts, {'backing': 'hd2'})
842 self.reopen(opts, {}, "backing is missing for 'hd0'")
845 result = self.vm.qmp('blockdev-del', conv_keys = True, node_name = 'hd2')
846 self.assert_qmp(result, 'error/class', 'GenericError')
847self.assert_qmp(result, 'error/desc', "Node 'hd2' is busy: node is used as backing hd of 'hd0'")
850 self.reopen(opts, {'backing': None})
853 self.reopen(opts)
856 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
858 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd2')
864 def test_missing_backing_options_2(self): argument
868 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
871 self.reopen(opts, {}, "backing is missing for 'hd1'")
874 self.reopen(opts, {'backing': None})
877 self.reopen(opts, {}, "backing is missing for 'hd1'")
879 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd1')
883 def test_backing_reference(self): argument
892 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
901 self.reopen(opts)
904 self.assert_qmp(self.get_node('hd0'), 'detect_zeroes', 'off')
905 self.assert_qmp(self.get_node('hd1'), 'detect_zeroes', 'on')
906 self.assert_qmp(self.get_node('hd2'), 'detect_zeroes', 'on')
910 def test_block_stream_1(self): argument
915 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
918 self.vm.cmd('block-stream', conv_keys = True, job_id = 'stream0', device = 'hd0')
919 self.wait_until_completed(drive = 'stream0')
922 self.assertEqual(self.get_node('hd1'), None)
925 self.reopen(opts, {}, "Cannot change the option 'backing.driver'")
929 self.reopen(opts)
932 self.reopen(opts, {'backing': None})
934 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
937 def test_block_stream_2(self): argument
942 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
945 self.vm.cmd('block-stream', conv_keys = True, job_id = 'stream0',
947 self.wait_until_completed(drive = 'stream0')
950 self.assertEqual(self.get_node('hd1'), None)
954 self.reopen(opts, {}, "Cannot change the option 'backing.driver'")
958 self.reopen(opts)
961 self.reopen(opts, {'backing': 'hd2'})
965 self.reopen(opts, {}, "backing is missing for 'hd0'")
968 self.vm.cmd('blockdev-del', conv_keys = True, node_name = 'hd0')
969 self.assertEqual(self.get_node('hd2'), None)
972 def test_block_stream_3(self): argument
977 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
980 self.vm.cmd('block-stream', conv_keys = True, job_id = 'stream0',
986 self.reopen(opts, {})
990 self.reopen(opts, {}, "Cannot change frozen 'backing' link from 'hd0' to 'hd1'")
992 self.vm.run_job('stream0', auto_finalize = False, auto_dismiss = True)
995 def test_block_stream_4(self): argument
1000 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
1003 self.vm.cmd('block-stream', conv_keys = True, job_id = 'stream0',
1009 self.reopen(opts, {},
1014 self.reopen(opts['backing'], {'read-only': True},
1019 self.reopen(opts['backing'], {'read-only': False},
1024 self.reopen(opts)
1026 self.vm.run_job('stream0', auto_finalize = False, auto_dismiss = True)
1029 def test_block_commit_1(self): argument
1034 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
1036 self.vm.cmd('block-commit', conv_keys = True, job_id = 'commit0',
1041 self.reopen(opts, {}, "Cannot change frozen 'backing' link from 'hd1' to 'hd2'")
1045 self.reopen(opts, {}, "Cannot change frozen 'backing' link from 'hd0' to 'hd1'")
1047 event = self.vm.event_wait(name='BLOCK_JOB_READY')
1048 self.assert_qmp(event, 'data/device', 'commit0')
1049 self.assert_qmp(event, 'data/type', 'commit')
1050 self.assert_qmp_absent(event, 'data/error')
1052 self.vm.cmd('block-job-complete', device='commit0')
1054 self.wait_until_completed(drive = 'commit0')
1057 def test_block_commit_2(self): argument
1062 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
1064 self.vm.cmd('block-commit', conv_keys = True, job_id = 'commit0',
1070 self.reopen(opts, {}, "Cannot change the option 'backing.driver'")
1074 self.reopen(opts, {}, "Cannot replace implicit backing child of hd0")
1077 self.vm.run_job('commit0', auto_finalize = False, auto_dismiss = True)
1079 self.assert_qmp(self.get_node('hd0'), 'ro', False)
1080 self.assertEqual(self.get_node('hd1'), None)
1081 self.assert_qmp(self.get_node('hd2'), 'ro', True)
1083 def run_test_iothreads(self, iothread_a, iothread_b, errmsg = None, argument
1086 self.vm.cmd('blockdev-add', conv_keys = False, **opts)
1089 self.vm.cmd('blockdev-add', conv_keys = False, **opts2)
1091 self.vm.cmd('object-add', qom_type='iothread', id='iothread0')
1093 self.vm.cmd('object-add', qom_type='iothread', id='iothread1')
1095 self.vm.cmd('device_add', driver='virtio-scsi', id='scsi0',
1098 self.vm.cmd('device_add', driver='virtio-scsi', id='scsi1',
1102 self.vm.cmd('device_add', driver='scsi-hd', drive='hd0',
1106 self.vm.cmd('device_add', driver='scsi-hd', drive='hd2',
1110 self.reopen(opts, {'backing': 'hd2'}, errmsg)
1113 self.reopen(opts, {'backing': None})
1115 self.vm.shutdown()
1119 def test_iothreads_error(self): argument
1120 self.run_test_iothreads('iothread0', 'iothread1',
1123 def test_iothreads_compatible_users(self): argument
1124 self.run_test_iothreads('iothread0', 'iothread0')
1126 def test_iothreads_switch_backing(self): argument
1127 self.run_test_iothreads('iothread0', '')
1129 def test_iothreads_switch_overlay(self): argument
1130 self.run_test_iothreads('', 'iothread0')
1132 def test_iothreads_with_throttling(self): argument
1136 self.vm.cmd('object-add', conv_keys = False, **opts)
1157 self.run_test_iothreads('iothread0', 'iothread0', None,