diff --git a/nova/tests/unit/virt/libvirt/fakelibvirt.py b/nova/tests/unit/virt/libvirt/fakelibvirt.py index 42661680a0..04d59809a9 100644 --- a/nova/tests/unit/virt/libvirt/fakelibvirt.py +++ b/nova/tests/unit/virt/libvirt/fakelibvirt.py @@ -134,6 +134,7 @@ VIR_FROM_DOMAIN = 200 VIR_FROM_NWFILTER = 330 VIR_FROM_REMOTE = 340 VIR_FROM_RPC = 345 +VIR_FROM_NODEDEV = 666 VIR_ERR_NO_SUPPORT = 3 VIR_ERR_XML_DETAIL = 350 VIR_ERR_NO_DOMAIN = 420 @@ -143,6 +144,7 @@ VIR_ERR_NO_NWFILTER = 620 VIR_ERR_SYSTEM_ERROR = 900 VIR_ERR_INTERNAL_ERROR = 950 VIR_ERR_CONFIG_UNSUPPORTED = 951 +VIR_ERR_NO_NODE_DEVICE = 667 # Readonly VIR_CONNECT_RO = 1 @@ -280,6 +282,30 @@ class NWFilter(object): self._connection._remove_filter(self) +class NodeDevice(object): + + def __init__(self, connection, xml=None): + self._connection = connection + + self._xml = xml + if xml is not None: + self._parse_xml(xml) + + def _parse_xml(self, xml): + tree = etree.fromstring(xml) + root = tree.find('.') + self._name = root.get('name') + + def attach(self): + pass + + def dettach(self): + pass + + def reset(self): + pass + + class Domain(object): def __init__(self, connection, xml, running=False, transient=False): self._connection = connection @@ -643,6 +669,7 @@ class Connection(object): self._running_vms = {} self._id_counter = 1 # libvirt reserves 0 for the hypervisor. self._nwfilters = {} + self._nodedevs = {} self._event_callbacks = {} self.fakeLibVersion = version self.fakeVersion = version @@ -653,6 +680,12 @@ class Connection(object): def _remove_filter(self, nwfilter): del self._nwfilters[nwfilter._name] + def _add_nodedev(self, nodedev): + self._nodedevs[nodedev._name] = nodedev + + def _remove_nodedev(self, nodedev): + del self._nodedevs[nodedev._name] + def _mark_running(self, dom): self._running_vms[self._id_counter] = dom self._emit_lifecycle(dom, VIR_DOMAIN_EVENT_STARTED, 0) @@ -1040,6 +1073,16 @@ class Connection(object): nwfilter = NWFilter(self, xml) self._add_filter(nwfilter) + def nodeDeviceLookupByName(self, name): + try: + return self._nodedevs[name] + except KeyError: + raise make_libvirtError( + libvirtError, + "no nodedev with matching name %s" % name, + error_code=VIR_ERR_NO_NODE_DEVICE, + error_domain=VIR_FROM_NODEDEV) + def listDefinedDomains(self): return [] @@ -1115,7 +1158,7 @@ def make_libvirtError(error_class, msg, error_code=None, virDomain = Domain - +virNodeDevice = NodeDevice virConnect = Connection diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index ab175a0bdf..3c19a36f6a 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -471,74 +471,7 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.stubs.Set(imagebackend.Image, 'resolve_driver_format', imagebackend.Image._get_driver_format) - class FakeConn(object): - def baselineCPU(self, cpu, flag): - """Add new libvirt API.""" - return """ - Westmere - Intel - - - """ - - def getCapabilities(self): - """Ensure standard capabilities being returned.""" - return """ - x86_64 - - - """ - - def getVersion(self): - return 1005001 - - def getLibVersion(self): - return (0 * 1000 * 1000) + (9 * 1000) + 11 - - def domainEventRegisterAny(self, *args, **kwargs): - pass - - def registerCloseCallback(self, cb, opaque): - pass - - def nwfilterDefineXML(self, *args, **kwargs): - pass - - def nodeDeviceLookupByName(self, x): - pass - - def listDevices(self, cap, flags): - return [] - - def lookupByName(self, name): - pass - - def lookupByID(self, id): - pass - - def getHostname(self): - return "mustard" - - def getType(self): - return "QEMU" - - def numOfDomains(self): - return 0 - - def listDomainsID(self): - return [] - - def listDefinedDomains(self): - return [] - - def getInfo(self): - return [arch.X86_64, 123456, 2, 2000, - 2, 1, 1, 1] - - self.conn = FakeConn() - self.stubs.Set(host.Host, - 'get_connection', - lambda h: self.conn) + self.useFixture(fakelibvirt.FakeLibvirtFixture()) sys_meta = { 'instance_type_memory_mb': 2048, @@ -710,54 +643,36 @@ class LibvirtConnTestCase(test.NoDBTestCase): db_mock.side_effect = exception.NovaException conn._set_host_enabled(False) - def test_prepare_pci_device(self): + @mock.patch.object(fakelibvirt.virConnect, "nodeDeviceLookupByName") + def test_prepare_pci_device(self, mock_lookup): pci_devices = [dict(hypervisor_name='xxx')] self.flags(virt_type='xen', group='libvirt') - conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + conn = drvr._host.get_connection() - class FakeDev(object): - def attach(self): - pass + mock_lookup.side_effect = lambda x: fakelibvirt.NodeDevice(conn) + drvr._prepare_pci_devices_for_use(pci_devices) - def dettach(self): - pass - - def reset(self): - pass - - self.mox.StubOutWithMock(self.conn, 'nodeDeviceLookupByName') - self.conn.nodeDeviceLookupByName('xxx').AndReturn(FakeDev()) - self.conn.nodeDeviceLookupByName('xxx').AndReturn(FakeDev()) - self.mox.ReplayAll() - conn._prepare_pci_devices_for_use(pci_devices) - - def test_prepare_pci_device_exception(self): + @mock.patch.object(fakelibvirt.virConnect, "nodeDeviceLookupByName") + @mock.patch.object(fakelibvirt.virNodeDevice, "dettach") + def test_prepare_pci_device_exception(self, mock_detach, mock_lookup): pci_devices = [dict(hypervisor_name='xxx', id='id1', instance_uuid='uuid')] self.flags(virt_type='xen', group='libvirt') - conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + conn = drvr._host.get_connection() - class FakeDev(object): + mock_lookup.side_effect = lambda x: fakelibvirt.NodeDevice(conn) + mock_detach.side_effect = libvirt.libvirtError("xxxx") - def attach(self): - pass - - def dettach(self): - raise libvirt.libvirtError("xxxxx") - - def reset(self): - pass - - self.stubs.Set(self.conn, 'nodeDeviceLookupByName', - lambda x: FakeDev()) self.assertRaises(exception.PciDevicePrepareFailed, - conn._prepare_pci_devices_for_use, pci_devices) + drvr._prepare_pci_devices_for_use, pci_devices) def test_detach_pci_devices_exception(self): @@ -3724,12 +3639,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): cpu_mode=None, group='libvirt') - def get_lib_version_stub(): - return (0 * 1000 * 1000) + (9 * 1000) + 11 - - self.stubs.Set(self.conn, - "getLibVersion", - get_lib_version_stub) conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) instance_ref = objects.Instance(**self.test_instance) flavor = instance_ref.get_flavor() @@ -5065,9 +4974,9 @@ class LibvirtConnTestCase(test.NoDBTestCase): instance, "/dev/sda") - def test_attach_blockio_invalid_version(self): - def get_lib_version_stub(): - return (0 * 1000 * 1000) + (9 * 1000) + 8 + @mock.patch.object(fakelibvirt.virConnect, "getLibVersion") + def test_attach_blockio_invalid_version(self, mock_version): + mock_version.return_value = (0 * 1000 * 1000) + (9 * 1000) + 8 self.flags(virt_type='qemu', group='libvirt') self.create_fake_libvirt_mock() libvirt_driver.LibvirtDriver._conn.lookupByName = self.fake_lookup @@ -5075,7 +4984,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.context, **self.test_instance) self.mox.ReplayAll() conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - self.stubs.Set(self.conn, "getLibVersion", get_lib_version_stub) self.assertRaises(exception.Invalid, conn.attach_volume, None, {"driver_volume_type": "fake",