def test_q_base_device(self): """ QBaseDevice tests """ qdevice = qdevices.QBaseDevice('MyType', { 'ParamA': 'ValueA', 'AUTOREMOVE': None }, 'Object1', {'type': 'pci'}) self.assertEqual( qdevice['ParamA'], 'ValueA', 'Param added during ' '__init__ is corrupted %s != %s' % (qdevice['ParamA'], 'ValueA')) qdevice['ParamA'] = 'ValueB' qdevice.set_param('BoolTrue', True) qdevice.set_param('BoolFalse', 'off', bool) qdevice['Empty'] = 'EMPTY_STRING' out = """MyType aid = None aobject = Object1 parent_bus = {'type': 'pci'} child_bus = [] params: ParamA = ValueB BoolTrue = on BoolFalse = off Empty = "" """ self.assertEqual( qdevice.str_long(), out, "Device output doesn't match" "\n%s\n\n%s" % (qdevice.str_long(), out))
def device_add_nic(pci_model, netdev, device_id): """ call device_add command, with param device_id, driver and netdev :param pci_model: drivers for virtual device :param netdev: netdev id for virtual device :param device_id: device id for virtual device """ pci_add_cmd = "device_add id=%s, driver=%s, netdev=%s" % (device_id, pci_model, netdev) bus = vm.devices.get_buses({'aobject': 'pci.0'})[0] if isinstance(bus, qdevices.QPCIEBus): root_port_id = bus.get_free_root_port() if root_port_id: pci_add_cmd += ",bus=%s" % root_port_id if used_sameid != "yes": root_port = vm.devices.get_buses({"aobject": root_port_id})[0] root_port.insert(qdevices.QBaseDevice(pci_model, aobject=device_id)) else: test.error("No free root port for device %s to plug." % device_id) add_output = vm.monitor.send_args_cmd(pci_add_cmd) return add_output
def test_qdev_hotplug(self): """ Test the hotplug/unplug functionality """ qdev = self.create_qdev('vm1', False, True) devs = qdev.machine_by_params(ParamsDict({'machine_type': 'pc'})) for dev in devs: qdev.insert(dev) monitor = MockHMPMonitor() out = qdev.get_state() assert out == -1, ("Status after init is not -1" " (%s)" % out) out = len(qdev) assert out == 6, "Number of devices of this VM is not 5 (%s)" % out dev1, dev2 = qdev.images_define_by_variables('disk', '/tmp/a', {'aobject': 'pci.0'}, fmt="virtio") out = dev1.hotplug_hmp() exp = "drive_add auto id=drive_disk,if=none,file=/tmp/a" assert out == exp, ("Hotplug command of drive is incorrect:\n%s\n%s" % (exp, out)) # hotplug of drive will return " OK" (pass) dev1.hotplug = lambda _monitor: "OK" dev1.verify_hotplug = lambda _out, _monitor: True out, ver_out = qdev.simple_hotplug(dev1, monitor) assert out == "OK", "Return value of hotplug is not OK (%s)" % out assert ver_out is True, ("Return value of hotplug" " is not True (%s)" % ver_out) out = qdev.get_state() assert out == 0, ("Status after verified hotplug is not 0 (%s)" % out) # hotplug of virtio-blk-pci will return "" out = dev2.hotplug_hmp() exp = "device_add virtio-blk-pci,id=disk,drive=drive_disk" assert out == exp, ("Hotplug command of device is incorrect:\n%s\n%s" % (exp, out)) dev2.hotplug = lambda _monitor: "" dev2.verify_hotplug = lambda _out, _monitor: "" out, ver_out = qdev.simple_hotplug(dev2, monitor) # automatic verification is not supported, hotplug returns the original # monitor message ("") assert ver_out == "", ("Return value of hotplug is" " not " " (%s)" % ver_out) assert out == "", 'Return value of hotplug is not "" (%s)' % out out = qdev.get_state() assert out == 1, ("Status after verified hotplug is not 1 (%s)" % out) qdev.hotplug_verified() out = qdev.get_state() assert out == 0, ("Status after verified hotplug is not 0 (%s)" % out) out = len(qdev) assert out == 8, "Number of devices of this VM is not 8 (%s)" % out # Hotplug is expected to pass but monitor reports failure dev3 = qdevices.QDrive('a_dev1') dev3.hotplug = lambda _monitor: ("could not open disk image /tmp/qqq: " "No such file or directory") out, ver_out = qdev.simple_hotplug(dev3, monitor) exp = "could not open disk image /tmp/qqq: No such file or directory" assert out, "Return value of hotplug is incorrect:\n%s\n%s" % (out, exp) out = qdev.get_state() assert out == 1, ("Status after failed hotplug is not 1 (%s)" % out) # device is still in qdev, but is not in qemu, we should remove it qdev.remove(dev3, recursive=False) out = qdev.get_state() assert out == 1, ("Status after verified hotplug is not 1 (%s)" % out) qdev.hotplug_verified() out = qdev.get_state() assert out == 0, ("Status after verified hotplug is not 0 (%s)" % out) # Hotplug is expected to fail (missing bus XXX) dev4 = qdevices.QBaseDevice("bad_dev", parent_bus={'type': "XXX"}) dev4.hotplug = lambda _monitor: ("") dev4.cmdline = lambda: "-device bad_device,id=fooBarBaz" self.assertRaises(qcontainer.DeviceHotplugError, qdev.simple_hotplug, dev4, True) out = qdev.get_state() assert out == 1, "Status after impossible hotplug is not 0 (%s)" % out # We should check the DeviceHotplugError.ver_out if it failed, let's # say it did failed so we can set the qdev.set_clean() qdev.set_clean() # Unplug # Unplug used drive (automatic verification not supported) out = dev1.unplug_hmp() exp = "drive_del drive_disk" assert out == exp, ("Hotplug command of device is incorrect:\n%s\n%s" % (exp, out)) dev1.unplug = lambda _monitor: "" dev1.verify_unplug = lambda _monitor, _out: "" out, ver_out = qdev.simple_unplug(dev1, monitor) # I verified, that device was unplugged successfully qdev.hotplug_verified() out = qdev.get_state() assert out == 0, ("Status after verified hotplug is not 0 (%s)" % out) out = len(qdev) assert out == 7, "Number of devices of this VM is not 7 (%s)" % out # Removal of drive should also set drive of the disk device to None out = dev2.get_param('drive') assert out is None, "Drive was not removed from disk device"