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,