summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikola Dipanov <ndipanov@redhat.com>2016-04-07 18:53:52 +0100
committerSahid Orentino Ferdjaoui <sahid.ferdjaoui@redhat.com>2016-06-01 08:51:03 -0400
commitb9858b2981fbdc52c0721d29cc15abce93371544 (patch)
tree088145ce6ccd8f855a730932f819c7f3a33afaa5
parent0b85bb4b42ab8d47809ecb9244df88770de5d89b (diff)
downloadnova-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.py1
-rw-r--r--nova/tests/unit/objects/test_pci_device.py26
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,