diff options
author | Nikola Dipanov <ndipanov@redhat.com> | 2016-04-07 18:53:52 +0100 |
---|---|---|
committer | Sahid Orentino Ferdjaoui <sahid.ferdjaoui@redhat.com> | 2016-06-01 08:51:03 -0400 |
commit | b9858b2981fbdc52c0721d29cc15abce93371544 (patch) | |
tree | 088145ce6ccd8f855a730932f819c7f3a33afaa5 | |
parent | 0b85bb4b42ab8d47809ecb9244df88770de5d89b (diff) | |
download | nova-b9858b2981fbdc52c0721d29cc15abce93371544.tar.gz |
pci: Make sure PF is 'available' when last VF is freed
We were adding the PF back to the pools but not setting the status
properly.
The reason this was not caught by tests is because tests were broken as
well (we were using assertTrue instead of assertEqual which always
passes).
Change-Id: I62d4a810d8d7c4453865db0290029c269225c139
Closes-bug: #1567549
-rw-r--r-- | nova/objects/pci_device.py | 1 | ||||
-rw-r--r-- | nova/tests/unit/objects/test_pci_device.py | 26 |
2 files changed, 14 insertions, 13 deletions
diff --git a/nova/objects/pci_device.py b/nova/objects/pci_device.py index 87e55645e9..2e7c01538b 100644 --- a/nova/objects/pci_device.py +++ b/nova/objects/pci_device.py @@ -418,6 +418,7 @@ class PciDevice(base.NovaPersistentObject, base.NovaObject): vfs_list = parent.child_devices if all([vf.is_available() for vf in vfs_list if vf.id != self.id]): + parent.status = fields.PciDeviceStatus.AVAILABLE free_devs.append(parent) old_status = self.status self.status = fields.PciDeviceStatus.AVAILABLE diff --git a/nova/tests/unit/objects/test_pci_device.py b/nova/tests/unit/objects/test_pci_device.py index b56cb455fe..8d39d9b6a0 100644 --- a/nova/tests/unit/objects/test_pci_device.py +++ b/nova/tests/unit/objects/test_pci_device.py @@ -521,7 +521,7 @@ class _TestSRIOVPciDeviceObject(object): 'parent_addr': None, 'numa_node': 0} pci_dev_obj = objects.PciDevice.create(None, pci_dev) - pci_dev_obj.id = num_pfs + 81 + pci_dev_obj.id = dev + 81 pci_dev_obj.child_devices = [] self.sriov_pf_devices.append(pci_dev_obj) @@ -537,7 +537,7 @@ class _TestSRIOVPciDeviceObject(object): 'parent_addr': '0000:81:00.%d' % int(dev / 4), 'numa_node': 0} pci_dev_obj = objects.PciDevice.create(None, pci_dev) - pci_dev_obj.id = num_vfs + 1 + pci_dev_obj.id = dev + 1 pci_dev_obj.parent_device = self.sriov_pf_devices[int(dev / 4)] pci_dev_obj.parent_device.child_devices.append(pci_dev_obj) self.sriov_vf_devices.append(pci_dev_obj) @@ -596,7 +596,7 @@ class _TestSRIOVPciDeviceObject(object): # check if parent device status has been changed to UNCLAIMABLE parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.UNCLAIMABLE, parent.status) + self.assertEqual(fields.PciDeviceStatus.UNCLAIMABLE, parent.status) def test_allocate_PF(self): self._create_fake_instance() @@ -694,19 +694,19 @@ class _TestSRIOVPciDeviceObject(object): devobj.claim(self.inst.uuid) devobj.allocate(self.inst) self.assertEqual(devobj.status, - fields.PciDeviceStatus.ALLOCATED) - for devobj in dependents[:3]: + fields.PciDeviceStatus.ALLOCATED) + for devobj in dependents[:-1]: devobj.free(self.inst) # check if parent device status is still UNAVAILABLE parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.UNAVAILABLE, - parent.status) - for devobj in dependents[3:]: - devobj.free(self.inst) - # check if parent device status is now AVAILABLE - parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.AVAILABLE, - parent.status) + self.assertEqual(fields.PciDeviceStatus.UNAVAILABLE, + parent.status) + devobj = dependents[-1] + devobj.free(self.inst) + # check if parent device status is now AVAILABLE + parent = self._get_parent_by_address(devobj.parent_addr) + self.assertEqual(fields.PciDeviceStatus.AVAILABLE, + parent.status) class TestSRIOVPciDeviceListObject(test_objects._LocalTest, |