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)