diff --git a/nova/db/api.py b/nova/db/api.py index 7f97bd75cc2d..f9134075d8a9 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -769,6 +769,11 @@ def instance_get_all(context, columns_to_join=None): return IMPL.instance_get_all(context, columns_to_join=columns_to_join) +def instance_get_all_uuids_by_host(context, host): + """Get a list of instance uuids on host.""" + return IMPL.instance_get_all_uuids_by_host(context, host) + + def instance_get_all_by_filters(context, filters, sort_key='created_at', sort_dir='desc', limit=None, marker=None, columns_to_join=None): diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 054c299c24f5..2a4ae0116528 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2607,6 +2607,11 @@ def _instance_get_all_uuids_by_host(context, host): return uuids +@pick_context_manager_reader +def instance_get_all_uuids_by_host(context, host): + return _instance_get_all_uuids_by_host(context, host) + + @pick_context_manager_reader def instance_get_all_by_host_and_node(context, host, node, columns_to_join=None): diff --git a/nova/objects/instance.py b/nova/objects/instance.py index 91eeb4675117..83409a6e59fe 100644 --- a/nova/objects/instance.py +++ b/nova/objects/instance.py @@ -1453,11 +1453,7 @@ class InstanceList(base.ObjectListBase, base.NovaObject): @base.remotable_classmethod def get_uuids_by_host(cls, context, host): - # NOTE(danms): We could potentially do this a little more efficiently - # but for now just pull all the instances and scrape the uuids. - db_instances = db.instance_get_all_by_host(context, host, - columns_to_join=[]) - return [inst['uuid'] for inst in db_instances] + return db.instance_get_all_uuids_by_host(context, host) @staticmethod @db_api.pick_context_manager_reader diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index d9371042c828..85e404d69082 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -306,6 +306,15 @@ class UnsupportedDbRegexpTestCase(DbTestCase): self.context, {'display_name': '%test%'}, marker=uuidsentinel.uuid1) + def test_instance_get_all_uuids_by_host(self, mock_get_regexp): + test1 = self.create_instance_with_args(display_name='test1') + test2 = self.create_instance_with_args(display_name='test2') + test3 = self.create_instance_with_args(display_name='test3') + uuids = [i.uuid for i in (test1, test2, test3)] + found_uuids = db.instance_get_all_uuids_by_host(self.context, + test1.host) + self.assertEqual(sorted(uuids), sorted(found_uuids)) + def _assert_equals_inst_order(self, correct_order, filters, sort_keys=None, sort_dirs=None, limit=None, marker=None, diff --git a/nova/tests/unit/objects/test_instance.py b/nova/tests/unit/objects/test_instance.py index da84738bad26..876dc9defbf2 100644 --- a/nova/tests/unit/objects/test_instance.py +++ b/nova/tests/unit/objects/test_instance.py @@ -1968,19 +1968,14 @@ class _TestInstanceListObject(object): self.assertEqual(2, len(instances)) self.assertEqual([1, 2], [x.id for x in instances]) - @mock.patch('nova.db.instance_get_all_by_host') + @mock.patch('nova.db.instance_get_all_uuids_by_host') def test_get_uuids_by_host(self, mock_get_all): - fake_instances = [ - fake_instance.fake_db_instance(id=1), - fake_instance.fake_db_instance(id=2), - ] + fake_instances = [uuids.inst1, uuids.inst2] mock_get_all.return_value = fake_instances - expected_uuids = [inst['uuid'] for inst in fake_instances] actual_uuids = objects.InstanceList.get_uuids_by_host( self.context, 'b') - self.assertEqual(expected_uuids, actual_uuids) - mock_get_all.assert_called_once_with(self.context, 'b', - columns_to_join=[]) + self.assertEqual(fake_instances, actual_uuids) + mock_get_all.assert_called_once_with(self.context, 'b') class TestInstanceListObject(test_objects._LocalTest,