diff options
-rwxr-xr-x | nova/compute/manager.py | 27 | ||||
-rw-r--r-- | nova/tests/compute/test_compute.py | 17 |
2 files changed, 19 insertions, 25 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index ed95ff8df..c875c50e1 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -379,21 +379,14 @@ class ComputeManager(manager.SchedulerDependentManager): """Return a list of instance records that match the instances found on the hypervisor. """ - local_instances = [] try: - # Try to find all local instances by uuid. - # FIXME(comstud): Would be nice to consolidate this into - # a single query to nova-conductor. - for uuid in self.driver.list_instance_uuids(): - try: - instance = self.conductor_api.instance_get_by_uuid( - context, uuid) - local_instances.append(instance) - except exception.InstanceNotFound as e: - LOG.error(_('Instance %(uuid)s found in the ' - 'hypervisor, but not in the database'), - locals()) - continue + driver_uuids = self.driver.list_instance_uuids() + local_instances = self.conductor_api.instance_get_all_by_filters( + context, {'uuid': driver_uuids}) + local_instance_uuids = [inst['uuid'] for inst in local_instances] + for uuid in set(driver_uuids) - set(local_instance_uuids): + LOG.error(_('Instance %(uuid)s found in the hypervisor, but ' + 'not in the database'), locals()) return local_instances except NotImplementedError: pass @@ -401,9 +394,9 @@ class ComputeManager(manager.SchedulerDependentManager): # The driver doesn't support uuids listing, so we'll have # to brute force. driver_instances = self.driver.list_instances() - all_instances = self.conductor_api.instance_get_all(context) - name_map = dict([(instance['name'], instance) - for instance in all_instances]) + instances = self.conductor_api.instance_get_all_by_host(context, + self.host) + name_map = dict((instance['name'], instance) for instance in instances) local_instances = [] for driver_instance in driver_instances: instance = name_map.get(driver_instance) diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 6eb5feb85..d6c9d23a8 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -3571,14 +3571,14 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute.driver, 'list_instance_uuids') self.mox.StubOutWithMock(self.compute.conductor_api, - 'instance_get_by_uuid') + 'instance_get_all_by_filters') self.compute.driver.list_instance_uuids().AndReturn( [inst['uuid'] for inst in driver_instances]) - for x in xrange(len(driver_instances)): - self.compute.conductor_api.instance_get_by_uuid(fake_context, - driver_instances[x]['uuid']).AndReturn( - driver_instances[x]) + self.compute.conductor_api.instance_get_all_by_filters( + fake_context, {'uuid': [inst['uuid'] for + inst in driver_instances]}).AndReturn( + driver_instances) self.mox.ReplayAll() @@ -3588,6 +3588,7 @@ class ComputeTestCase(BaseTestCase): def test_get_instances_on_driver_fallback(self): # Test getting instances when driver doesn't support # 'list_instance_uuids' + self.compute.host = 'host' fake_context = context.get_admin_context() all_instances = [] @@ -3603,14 +3604,14 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(self.compute.driver, 'list_instances') self.mox.StubOutWithMock(self.compute.conductor_api, - 'instance_get_all') + 'instance_get_all_by_host') self.compute.driver.list_instance_uuids().AndRaise( NotImplementedError()) self.compute.driver.list_instances().AndReturn( [inst['name'] for inst in driver_instances]) - self.compute.conductor_api.instance_get_all( - fake_context).AndReturn(all_instances) + self.compute.conductor_api.instance_get_all_by_host( + fake_context, self.compute.host).AndReturn(all_instances) self.mox.ReplayAll() |