summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-06-01 16:07:12 +0000
committerGerrit Code Review <review@openstack.org>2016-06-01 16:07:14 +0000
commit4e767d8fc7c7b762fdf58af4f29b496d55f1f80c (patch)
tree72bc7659f9469abd0ff42e94ada3414c0c6f83a7
parent9e8a403001dbbf0438bf9be33caec9c3c8960dd6 (diff)
parentb9858b2981fbdc52c0721d29cc15abce93371544 (diff)
downloadnova-4e767d8fc7c7b762fdf58af4f29b496d55f1f80c.tar.gz
Merge "pci: Make sure PF is 'available' when last VF is freed"
-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,