diff --git a/nova/tests/unit/virt/libvirt/fakelibvirt.py b/nova/tests/unit/virt/libvirt/fakelibvirt.py index c257081df472..96b752788f90 100644 --- a/nova/tests/unit/virt/libvirt/fakelibvirt.py +++ b/nova/tests/unit/virt/libvirt/fakelibvirt.py @@ -171,8 +171,8 @@ PF_SLOT = '00' class FakePciDevice(object): pci_dev_template = """ - pci_0000_81_%(slot)s_%(dev)d - /sys/devices/pci0000:80/0000:80:01.0/0000:81:%(slot)s.%(dev)d + pci_0000_81_%(slot)02x_%(dev)d + /sys/devices/pci0000:80/0000:80:01.0/0000:81:%(slot)02x.%(dev)d pci_0000_80_01_0 %(driver)s @@ -180,7 +180,7 @@ class FakePciDevice(object): 0 129 - 0 + %(slot)d %(dev)d %(prod_name)s Intel Corporation @@ -188,7 +188,7 @@ class FakePciDevice(object): %(functions)s -
+
@@ -216,17 +216,19 @@ class FakePciDevice(object): pf_caps = [addr_templ % {'dev': x, 'slot': VF_SLOT} for x in range(dev * vf_ratio, (dev + 1) * vf_ratio)] + slot = int(str(PF_SLOT), 16) self.pci_dev = self.pci_dev_template % {'dev': dev, 'prod': product_id, 'group_id': group, - 'functions': '\n'.join(pf_caps), 'slot': 0, + 'functions': '\n'.join(pf_caps), 'slot': slot, 'cap_type': PF_CAP_TYPE, 'prod_name': PF_PROD_NAME, 'driver': PF_DRIVER_NAME, 'numa_node': numa_node} elif dev_type == 'VF': vf_caps = [addr_templ % {'dev': int(dev / vf_ratio), 'slot': PF_SLOT}] + slot = int(str(VF_SLOT), 16) self.pci_dev = self.pci_dev_template % {'dev': dev, 'prod': product_id, 'group_id': group, - 'functions': '\n'.join(vf_caps), 'slot': VF_SLOT, + 'functions': '\n'.join(vf_caps), 'slot': slot, 'cap_type': VF_CAP_TYPE, 'prod_name': VF_PROD_NAME, 'driver': VF_DRIVER_NAME, 'numa_node': numa_node} @@ -256,7 +258,7 @@ class HostPciSRIOVDevicesInfo(object): def _calc_numa_node(dev): return dev % total_numa_nodes if numa_node is None else numa_node - vf_ratio = num_vfs / num_pfs + vf_ratio = num_vfs // num_pfs # Generate PFs for dev in range(num_pfs): diff --git a/nova/tests/unit/virt/libvirt/test_fakelibvirt.py b/nova/tests/unit/virt/libvirt/test_fakelibvirt.py index f00f0ff1c9ba..b637fe837860 100644 --- a/nova/tests/unit/virt/libvirt/test_fakelibvirt.py +++ b/nova/tests/unit/virt/libvirt/test_fakelibvirt.py @@ -18,6 +18,7 @@ import six from nova.objects import fields as obj_fields from nova import test import nova.tests.unit.virt.libvirt.fakelibvirt as libvirt +from nova.virt.libvirt import config as vconfig def get_vm_xml(name="testname", uuid=None, source_type='file', @@ -418,3 +419,86 @@ class FakeLibvirtTests(test.NoDBTestCase): kb_mem=15740000) self.assertEqual(host_topology.to_xml(), topology) + + def test_pci_devices_generation(self): + def _cmp_pci_dev_addr(dev_xml, cmp_addr): + cfgdev = vconfig.LibvirtConfigNodeDevice() + cfgdev.parse_str(dev_xml) + + address = "%04x:%02x:%02x.%1x" % ( + cfgdev.pci_capability.domain, + cfgdev.pci_capability.bus, + cfgdev.pci_capability.slot, + cfgdev.pci_capability.function) + self.assertEqual(cmp_addr, address) + + pf_xml = """ + pci_0000_81_00_0 + /sys/devices/pci0000:80/0000:80:01.0/0000:81:00.0 + pci_0000_80_01_0 + + ixgbe + + + 0 + 129 + 0 + 0 + Ethernet Controller 10-Gigabit X540-AT2 + Intel Corporation + +
+ + +
+ + + + + + + +""" + vf_xml = """ + pci_0000_81_10_0 + /sys/devices/pci0000:80/0000:80:01.0/0000:81:10.0 + pci_0000_80_01_0 + + ixgbevf + + + 0 + 129 + 16 + 0 + X540 Ethernet Controller Virtual Function + Intel Corporation + +
+ + +
+ + + + + + + +""" + + # create fake pci devices + pci_info = libvirt.HostPciSRIOVDevicesInfo() + pci_info.create_pci_devices(num_pfs=1, num_vfs=1) + + # generate xml for the created pci devices + gen_pf = pci_info.get_device_by_name('pci_0000_81_00_0') + gen_vf = pci_info.get_device_by_name('pci_0000_81_10_0') + + self.assertEqual(gen_pf.XMLDesc(0), pf_xml) + self.assertEqual(gen_vf.XMLDesc(0), vf_xml) + + # parse the generated xml with a libvirt config class and compare + # device address + _cmp_pci_dev_addr(pf_xml, '0000:81:00.0') + _cmp_pci_dev_addr(vf_xml, '0000:81:10.0')