From 8c590cb3e493c92a355d4b50e3761309bd69baf7 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Wed, 4 Sep 2019 18:22:09 +0100 Subject: [PATCH] objects: Add 'InstanceNUMATopology.cpu_pinning' property Provide an easy way to extract all pinned CPUs from an instance's 'InstanceNUMATopology' object Change-Id: I4b6fb4e239af6d73a07e48339fcbb316aa35cb66 Signed-off-by: Stephen Finucane --- nova/objects/instance_numa.py | 9 +++++++++ nova/tests/unit/objects/test_instance_numa.py | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/nova/objects/instance_numa.py b/nova/objects/instance_numa.py index 8b398a9cff0e..806919e59928 100644 --- a/nova/objects/instance_numa.py +++ b/nova/objects/instance_numa.py @@ -12,6 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. +import itertools + from oslo_serialization import jsonutils from oslo_utils import versionutils @@ -217,6 +219,13 @@ class InstanceNUMATopology(base.NovaObject, InstanceNUMACell._from_dict(cell_dict) for cell_dict in data_dict.get('cells', [])]) + @property + def cpu_pinning(self): + """Return a set of all host CPUs this NUMATopology is pinned to.""" + return set(itertools.chain.from_iterable([ + cell.cpu_pinning.values() for cell in self.cells + if cell.cpu_pinning])) + @property def cpu_pinning_requested(self): return all(cell.cpu_pinning_requested for cell in self.cells) diff --git a/nova/tests/unit/objects/test_instance_numa.py b/nova/tests/unit/objects/test_instance_numa.py index 8f56ceac9eaa..33a679fb6aeb 100644 --- a/nova/tests/unit/objects/test_instance_numa.py +++ b/nova/tests/unit/objects/test_instance_numa.py @@ -137,6 +137,19 @@ class _TestInstanceNUMATopology(object): inst_cell.cpu_policy = fields.CPUAllocationPolicy.DEDICATED self.assertTrue(inst_cell.cpu_pinning_requested) + def test_cpu_pinning(self): + topo_obj = get_fake_obj_numa_topology(self.context) + + self.assertEqual(set(), topo_obj.cpu_pinning) + + topo_obj.cells[0].pin_vcpus((1, 10), (2, 11)) + + self.assertEqual(set([10, 11]), topo_obj.cpu_pinning) + + topo_obj.cells[1].pin_vcpus((3, 0), (4, 1)) + + self.assertEqual(set([0, 1, 10, 11]), topo_obj.cpu_pinning) + def test_cpu_pinning_requested(self): fake_topo_obj = copy.deepcopy(fake_obj_numa_topology) self.assertFalse(fake_topo_obj.cpu_pinning_requested)