From 74fbff88639891269f6a0752e70b78340cf87e9a Mon Sep 17 00:00:00 2001 From: Jay Pipes Date: Fri, 1 Apr 2016 16:03:47 -0700 Subject: [PATCH] pci: pass in instance PCI requests to claim Removes the calls to InstancePCIRequests.get_XXX() from within the claims.Claim and claims.MoveClaim constructors and instead has the resource tracker construct the PCI requests and pass them into the constructor. This allows us to remove the needlessly duplicative _test_pci() method in claims.MoveClaim and will allow the next patch in the series to remove the call in nova.pci.manager.PciDevTracker.claim_instance() that re-fetches PCI requests for the supplied instance. Change-Id: Ib2cc7c985839fbf88b5e6e437c4b395ab484b1b6 --- nova/compute/claims.py | 25 ++++++------------- nova/compute/resource_tracker.py | 10 ++++++-- nova/tests/unit/compute/test_claims.py | 18 ++++++------- .../unit/compute/test_resource_tracker.py | 3 ++- nova/tests/unit/compute/test_shelve.py | 7 ++++-- 5 files changed, 31 insertions(+), 32 deletions(-) diff --git a/nova/compute/claims.py b/nova/compute/claims.py index db28b5dc1d5f..361056b76037 100644 --- a/nova/compute/claims.py +++ b/nova/compute/claims.py @@ -75,13 +75,14 @@ class Claim(NopClaim): correct decisions with respect to host selection. """ - def __init__(self, context, instance, tracker, resources, overhead=None, - limits=None): + def __init__(self, context, instance, tracker, resources, pci_requests, + overhead=None, limits=None): super(Claim, self).__init__() # Stash a copy of the instance at the current point of time self.instance = instance.obj_clone() self._numa_topology_loaded = False self.tracker = tracker + self._pci_requests = pci_requests if not overhead: overhead = {'memory_mb': 0} @@ -185,9 +186,7 @@ class Claim(NopClaim): return self._test(type_, unit, total, used, requested, limit) def _test_pci(self): - pci_requests = objects.InstancePCIRequests.get_by_instance_uuid( - self.context, self.instance.uuid) - + pci_requests = self._pci_requests if pci_requests.requests: stats = self.tracker.pci_tracker.stats if not stats.support_requests(pci_requests.requests): @@ -261,15 +260,15 @@ class MoveClaim(Claim): Move can be either a migrate/resize, live-migrate or an evacuate operation. """ def __init__(self, context, instance, instance_type, image_meta, tracker, - resources, overhead=None, limits=None): + resources, pci_requests, overhead=None, limits=None): self.context = context self.instance_type = instance_type if isinstance(image_meta, dict): image_meta = objects.ImageMeta.from_dict(image_meta) self.image_meta = image_meta super(MoveClaim, self).__init__(context, instance, tracker, - resources, overhead=overhead, - limits=limits) + resources, pci_requests, + overhead=overhead, limits=limits) self.migration = None @property @@ -290,16 +289,6 @@ class MoveClaim(Claim): return hardware.numa_get_constraints(self.instance_type, self.image_meta) - def _test_pci(self): - pci_requests = objects.InstancePCIRequests.\ - get_by_instance_uuid_and_newness( - self.context, self.instance.uuid, True) - if pci_requests.requests: - claim = self.tracker.pci_tracker.stats.support_requests( - pci_requests.requests) - if not claim: - return _('Claim pci failed.') - def abort(self): """Compute operation requiring claimed resources has failed or been aborted. diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index d8480a0ae6f9..2f0dde3c1927 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -128,8 +128,10 @@ class ResourceTracker(object): "MB", {'flavor': instance_ref.memory_mb, 'overhead': overhead['memory_mb']}) + pci_requests = objects.InstancePCIRequests.get_by_instance_uuid( + context, instance_ref.uuid) claim = claims.Claim(context, instance_ref, self, self.compute_node, - overhead=overhead, limits=limits) + pci_requests, overhead=overhead, limits=limits) if self.pci_tracker: # NOTE(jaypipes): ComputeNode.pci_device_pools is set below @@ -207,9 +209,13 @@ class ResourceTracker(object): "MB", {'flavor': new_instance_type.memory_mb, 'overhead': overhead['memory_mb']}) + pci_requests = objects.InstancePCIRequests.\ + get_by_instance_uuid_and_newness( + context, instance.uuid, True) claim = claims.MoveClaim(context, instance, new_instance_type, image_meta, self, self.compute_node, - overhead=overhead, limits=limits) + pci_requests, overhead=overhead, + limits=limits) claim.migration = migration instance.migration_context = claim.create_migration_context() instance.save() diff --git a/nova/tests/unit/compute/test_claims.py b/nova/tests/unit/compute/test_claims.py index 3f8b4bddc25a..8b2f160644e8 100644 --- a/nova/tests/unit/compute/test_claims.py +++ b/nova/tests/unit/compute/test_claims.py @@ -84,13 +84,13 @@ class ClaimTestCase(test.NoDBTestCase): if overhead is None: overhead = {'memory_mb': 0} - @mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid', - return_value=requests or self.empty_requests) + requests = requests or self.empty_requests + @mock.patch('nova.db.instance_extra_get_by_instance_uuid', return_value=db_numa_topology) - def get_claim(mock_extra_get, mock_pci_get): + def get_claim(mock_extra_get): return claims.Claim(self.context, instance, self.tracker, - self.resources, overhead=overhead, + self.resources, requests, overhead=overhead, limits=limits) return get_claim() @@ -378,17 +378,17 @@ class MoveClaimTestCase(ClaimTestCase): if overhead is None: overhead = {'memory_mb': 0} - @mock.patch('nova.objects.InstancePCIRequests.' - 'get_by_instance_uuid_and_newness', - return_value=requests or self.empty_requests) + requests = requests or self.empty_requests + @mock.patch('nova.virt.hardware.numa_get_constraints', return_value=numa_topology) @mock.patch('nova.db.instance_extra_get_by_instance_uuid', return_value=self.db_numa_topology) - def get_claim(mock_extra_get, mock_numa_get, mock_pci_get): + def get_claim(mock_extra_get, mock_numa_get): return claims.MoveClaim(self.context, self.instance, instance_type, image_meta, self.tracker, self.resources, - overhead=overhead, limits=limits) + requests, overhead=overhead, + limits=limits) return get_claim() def test_abort(self): diff --git a/nova/tests/unit/compute/test_resource_tracker.py b/nova/tests/unit/compute/test_resource_tracker.py index 77f8dc5482aa..71df0565376d 100644 --- a/nova/tests/unit/compute/test_resource_tracker.py +++ b/nova/tests/unit/compute/test_resource_tracker.py @@ -1078,7 +1078,8 @@ class InstanceClaimTestCase(BaseTrackerTestCase): inst.obj_what_changed()) mock_save.side_effect = fake_save - inst = objects.Instance(host=None, node=None, memory_mb=1024) + inst = objects.Instance(host=None, node=None, memory_mb=1024, + uuid=uuidsentinel.instance1) inst.obj_reset_changes() numa = objects.InstanceNUMATopology() claim = mock.MagicMock() diff --git a/nova/tests/unit/compute/test_shelve.py b/nova/tests/unit/compute/test_shelve.py index 5fe7a65aa49c..635604f4d9b2 100644 --- a/nova/tests/unit/compute/test_shelve.py +++ b/nova/tests/unit/compute/test_shelve.py @@ -212,8 +212,10 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): def fake_claim(context, instance, limits): instance.host = self.compute.host + requests = objects.InstancePCIRequests(requests=[]) return claims.Claim(context, instance, - self.rt, _fake_resources()) + self.rt, _fake_resources(), + requests) tracking = { 'last_state': instance.task_state, @@ -319,7 +321,8 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): self.context, instance, self.compute.host) self.rt.instance_claim(self.context, instance, limits).AndReturn( claims.Claim(self.context, instance, self.rt, - _fake_resources())) + _fake_resources(), + objects.InstancePCIRequests(requests=[]))) self.compute.driver.spawn(self.context, instance, mox.IsA(objects.ImageMeta), injected_files=[], admin_password=None,