diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py index 274e261149f0..c8410441e479 100644 --- a/nova/tests/unit/virt/libvirt/test_config.py +++ b/nova/tests/unit/virt/libvirt/test_config.py @@ -1002,6 +1002,42 @@ class LibvirtConfigGuestDiskTest(LibvirtConfigBaseTest): obj.device_addr.unit)) self.assertIsNone(obj.device_addr.format_address()) + def test_config_disk_device_address_type_virtio_mmio(self): + xml = """ + + + + +
+ """ + + obj = config.LibvirtConfigGuestDisk() + obj.parse_str(xml) + + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressPCI) + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressDrive) + + def test_config_disk_device_address_type_ccw(self): + xml = """ + + + + + + +
+ """ + + obj = config.LibvirtConfigGuestDisk() + obj.parse_str(xml) + + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressPCI) + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressDrive) + class LibvirtConfigGuestSnapshotDiskTest(LibvirtConfigBaseTest): @@ -1686,6 +1722,42 @@ class LibvirtConfigGuestInterfaceTest(LibvirtConfigBaseTest): config.LibvirtConfigGuestDeviceAddressPCI) self.assertEqual('0000:00:03.0', obj.device_addr.format_address()) + def test_config_interface_address_type_virtio_mmio(self): + xml = """ + + + + +
+ """ + + obj = config.LibvirtConfigGuestInterface() + obj.parse_str(xml) + + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressPCI) + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressDrive) + + def test_config_interface_address_type_ccw(self): + xml = """ + + + + + + +
+ """ + + obj = config.LibvirtConfigGuestInterface() + obj.parse_str(xml) + + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressPCI) + self.assertNotIsInstance(obj.device_addr, + config.LibvirtConfigGuestDeviceAddressDrive) + class LibvirtConfigGuestFeatureTest(LibvirtConfigBaseTest): diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 23f8b49a3787..07078b2b812d 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -1611,6 +1611,20 @@ class LibvirtConnTestCase(test.NoDBTestCase):
+ + + + +
+ + + + + + + +
+ @@ -1625,6 +1639,20 @@ class LibvirtConnTestCase(test.NoDBTestCase):
+ + + + +
+ + + + + + + +
+ """ @@ -1655,6 +1683,14 @@ class LibvirtConnTestCase(test.NoDBTestCase): {'id': 5, 'source_type': 'volume', 'destination_type': 'volume', 'device_name': '/dev/vda', 'tag': "nfvfunc3"}), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 6, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/vdb', 'tag': "nfvfunc4"}), + fake_block_device.FakeDbBlockDeviceDict( + {'id': 7, + 'source_type': 'volume', 'destination_type': 'volume', + 'device_name': '/dev/vdc', 'tag': "nfvfunc5"}), ] ) vif = obj_vif.VirtualInterface(context=self.context) @@ -1669,7 +1705,19 @@ class LibvirtConnTestCase(test.NoDBTestCase): vif1.instance_uuid = '32dfcb37-5af1-552b-357c-be8c3aa38310' vif1.uuid = 'abec4b21-ef22-6c21-534b-ba3e3ab3a312' vif1.tag = None - vifs = [vif, vif1] + vif2 = obj_vif.VirtualInterface(context=self.context) + vif2.address = 'fa:16:3e:d1:28:e4' + vif2.network_id = 123 + vif2.instance_uuid = '32dfcb37-5af1-552b-357c-be8c3aa38310' + vif2.uuid = '645686e4-7086-4eab-8c2f-c41f017a1b16' + vif2.tag = 'mytag2' + vif3 = obj_vif.VirtualInterface(context=self.context) + vif3.address = '52:54:00:14:6f:50' + vif3.network_id = 123 + vif3.instance_uuid = '32dfcb37-5af1-552b-357c-be8c3aa38310' + vif3.uuid = '99cc3604-782d-4a32-a27c-bc33ac56ce86' + vif3.tag = 'mytag3' + vifs = [vif, vif1, vif2, vif3] with test.nested( mock.patch('nova.objects.VirtualInterfaceList' @@ -1683,7 +1731,7 @@ class LibvirtConnTestCase(test.NoDBTestCase): metadata_obj = drvr._build_device_metadata(self.context, instance_ref) metadata = metadata_obj.devices - self.assertEqual(5, len(metadata)) + self.assertEqual(9, len(metadata)) self.assertIsInstance(metadata[0], objects.DiskMetadata) self.assertIsInstance(metadata[0].bus, @@ -1710,11 +1758,23 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.assertEqual(['nfvfunc3'], metadata[3].tags) self.assertEqual('0000:00:09.0', metadata[3].bus.address) self.assertIsInstance(metadata[4], + objects.DiskMetadata) + self.assertEqual(['nfvfunc4'], metadata[4].tags) + self.assertIsInstance(metadata[5], + objects.DiskMetadata) + self.assertEqual(['nfvfunc5'], metadata[5].tags) + self.assertIsInstance(metadata[6], objects.NetworkInterfaceMetadata) - self.assertIsInstance(metadata[4].bus, + self.assertIsInstance(metadata[6].bus, objects.PCIDeviceBus) - self.assertEqual(['mytag1'], metadata[4].tags) - self.assertEqual('0000:00:03.0', metadata[4].bus.address) + self.assertEqual(['mytag1'], metadata[6].tags) + self.assertEqual('0000:00:03.0', metadata[6].bus.address) + self.assertIsInstance(metadata[7], + objects.NetworkInterfaceMetadata) + self.assertEqual(['mytag2'], metadata[7].tags) + self.assertIsInstance(metadata[8], + objects.NetworkInterfaceMetadata) + self.assertEqual(['mytag3'], metadata[8].tags) @mock.patch.object(host.Host, 'get_connection') @mock.patch.object(nova.virt.libvirt.guest.Guest, 'get_xml_desc') diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index 281f42f72926..be18b82528b2 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -892,8 +892,7 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): elif c.tag == 'shareable': self.shareable = True elif c.tag == 'address': - obj = LibvirtConfigGuestDeviceAddress.factory(c) - obj.parse_dom(c) + obj = LibvirtConfigGuestDeviceAddress.parse_dom(c) self.device_addr = obj elif c.tag == 'boot': self.boot_order = c.get('order') @@ -1146,12 +1145,16 @@ class LibvirtConfigGuestDeviceAddress(LibvirtConfigObject): self.type = type @staticmethod - def factory(xmldoc): + def parse_dom(xmldoc): addr_type = xmldoc.get('type') if addr_type == 'pci': - return LibvirtConfigGuestDeviceAddressPCI() + obj = LibvirtConfigGuestDeviceAddressPCI() elif addr_type == 'drive': - return LibvirtConfigGuestDeviceAddressDrive() + obj = LibvirtConfigGuestDeviceAddressDrive() + else: + return None + obj.parse_dom(xmldoc) + return obj class LibvirtConfigGuestDeviceAddressDrive(LibvirtConfigGuestDeviceAddress): @@ -1398,8 +1401,7 @@ class LibvirtConfigGuestInterface(LibvirtConfigGuestDevice): if sub.get('peak'): self.vif_outbound_peak = int(sub.get('peak')) elif c.tag == 'address': - obj = LibvirtConfigGuestDeviceAddress.factory(c) - obj.parse_dom(c) + obj = LibvirtConfigGuestDeviceAddress.parse_dom(c) self.device_addr = obj def add_filter_param(self, key, value): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 89088027936e..518d6fdbc89d 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -7521,18 +7521,20 @@ class LibvirtDriver(driver.ComputeDriver): def _prepare_device_bus(dev): """Determins the device bus and it's hypervisor assigned address """ + bus = None address = (dev.device_addr.format_address() if dev.device_addr else None) if isinstance(dev.device_addr, vconfig.LibvirtConfigGuestDeviceAddressPCI): bus = objects.PCIDeviceBus() - elif dev.target_bus == 'scsi': - bus = objects.SCSIDeviceBus() - elif dev.target_bus == 'ide': - bus = objects.IDEDeviceBus() - elif dev.target_bus == 'usb': - bus = objects.USBDeviceBus() - if address is not None: + elif isinstance(dev, vconfig.LibvirtConfigGuestDisk): + if dev.target_bus == 'scsi': + bus = objects.SCSIDeviceBus() + elif dev.target_bus == 'ide': + bus = objects.IDEDeviceBus() + elif dev.target_bus == 'usb': + bus = objects.USBDeviceBus() + if address is not None and bus is not None: bus.address = address return bus @@ -7569,9 +7571,10 @@ class LibvirtDriver(driver.ComputeDriver): bus = self._prepare_device_bus(dev) device = objects.NetworkInterfaceMetadata( mac=vif.address, - bus=bus, tags=[vif.tag] ) + if bus: + device.bus = bus devices.append(device) # Build disks related metedata @@ -7580,7 +7583,9 @@ class LibvirtDriver(driver.ComputeDriver): if not bdm: continue bus = self._prepare_device_bus(dev) - device = objects.DiskMetadata(bus=bus, tags=[bdm.tag]) + device = objects.DiskMetadata(tags=[bdm.tag]) + if bus: + device.bus = bus devices.append(device) if devices: dev_meta = objects.InstanceDeviceMetadata(devices=devices)