1#!/usr/bin/env python3 2# group: quick 3 4# Test hot plugging and unplugging with iothreads 5# 6# Copyright (C) 2019 Igalia, S.L. 7# Author: Alberto Garcia <berto@igalia.com> 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 22import iotests 23import os 24 25nbd_sock = iotests.file_path('nbd.sock', base_dir=iotests.sock_dir) 26 27class TestCase(iotests.QMPTestCase): 28 test_driver = "null-co" 29 30 def required_drivers(self): 31 return [self.test_driver] 32 33 @iotests.skip_if_unsupported(required_drivers) 34 def setUp(self): 35 self.vm = iotests.VM() 36 self.vm.launch() 37 38 def tearDown(self): 39 self.vm.shutdown() 40 41 def test1(self): 42 iotests.log('==Unplug a SCSI disk and then plug it again==') 43 self.vm.qmp_log('blockdev-add', driver='null-co', read_zeroes=True, node_name='hd0') 44 self.vm.qmp_log('object-add', qom_type='iothread', id="iothread0") 45 self.vm.qmp_log('device_add', id='scsi0', driver=iotests.get_virtio_scsi_device(), iothread='iothread0', filters=[iotests.filter_qmp_virtio_scsi]) 46 self.vm.qmp_log('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0') 47 self.vm.qmp_log('device_del', id='scsi-hd0') 48 self.vm.event_wait('DEVICE_DELETED') 49 self.vm.qmp_log('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0') 50 self.vm.qmp_log('device_del', id='scsi-hd0') 51 self.vm.event_wait('DEVICE_DELETED') 52 self.vm.qmp_log('blockdev-del', node_name='hd0') 53 54 def test2(self): 55 iotests.log('==Attach two SCSI disks using the same block device and the same iothread==') 56 self.vm.qmp_log('blockdev-add', driver='null-co', read_zeroes=True, node_name='hd0', read_only=True) 57 self.vm.qmp_log('object-add', qom_type='iothread', id="iothread0") 58 self.vm.qmp_log('device_add', id='scsi0', driver=iotests.get_virtio_scsi_device(), iothread='iothread0', filters=[iotests.filter_qmp_virtio_scsi]) 59 60 self.vm.qmp_log('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0') 61 self.vm.qmp_log('device_add', id='scsi-hd1', driver='scsi-hd', drive='hd0') 62 self.vm.qmp_log('device_del', id='scsi-hd0') 63 self.vm.event_wait('DEVICE_DELETED') 64 self.vm.qmp_log('device_del', id='scsi-hd1') 65 self.vm.event_wait('DEVICE_DELETED') 66 self.vm.qmp_log('blockdev-del', node_name='hd0') 67 68 def test3(self): 69 iotests.log('==Attach two SCSI disks using the same block device but different iothreads==') 70 71 self.vm.qmp_log('blockdev-add', driver='null-co', read_zeroes=True, node_name='hd0', read_only=True) 72 73 self.vm.qmp_log('object-add', qom_type='iothread', id="iothread0") 74 self.vm.qmp_log('object-add', qom_type='iothread', id="iothread1") 75 76 self.vm.qmp_log('device_add', id='scsi0', driver=iotests.get_virtio_scsi_device(), iothread='iothread0', filters=[iotests.filter_qmp_virtio_scsi]) 77 self.vm.qmp_log('device_add', id='scsi1', driver=iotests.get_virtio_scsi_device(), iothread='iothread1', filters=[iotests.filter_qmp_virtio_scsi]) 78 79 self.vm.qmp_log('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0', bus="scsi0.0") 80 self.vm.qmp_log('device_add', id='scsi-hd1', driver='scsi-hd', drive='hd0', bus="scsi1.0") 81 82 self.vm.qmp_log('device_del', id='scsi-hd0') 83 self.vm.event_wait('DEVICE_DELETED') 84 self.vm.qmp_log('device_add', id='scsi-hd1', driver='scsi-hd', drive='hd0', bus="scsi1.0") 85 86 self.vm.qmp_log('device_del', id='scsi-hd1') 87 self.vm.event_wait('DEVICE_DELETED') 88 self.vm.qmp_log('blockdev-del', node_name='hd0') 89 90 def test4(self): 91 iotests.log('==Attach a SCSI disks using the same block device as a NBD server==') 92 93 self.vm.qmp_log('blockdev-add', driver='null-co', read_zeroes=True, node_name='hd0', read_only=True) 94 95 self.vm.qmp_log('nbd-server-start', 96 filters=[iotests.filter_qmp_testfiles], 97 addr={'type':'unix', 'data':{'path':nbd_sock}}) 98 99 self.vm.qmp_log('nbd-server-add', device='hd0') 100 101 self.vm.qmp_log('object-add', qom_type='iothread', id="iothread0") 102 self.vm.qmp_log('device_add', id='scsi0', driver=iotests.get_virtio_scsi_device(), iothread='iothread0', filters=[iotests.filter_qmp_virtio_scsi]) 103 self.vm.qmp_log('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0') 104 105if __name__ == '__main__': 106 iotests.activate_logging() 107 iotests.main() 108