From 4ebd05d660ebece06ccb7872310127c46b24cb5d Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Mon, 1 May 2017 11:25:13 -0400 Subject: [PATCH] db api: add service_get_by_uuid This is going to be used by the Service.get_by_uuid method which will later be used by the HostAPI to uniquely lookup a service within a cell. Part of blueprint service-hyper-uuid-in-api Change-Id: Iff58296d5b05670116d4e0dc7846a260c48d84ed --- nova/db/api.py | 7 +++++++ nova/db/sqlalchemy/api.py | 11 +++++++++++ nova/tests/unit/db/test_db_api.py | 16 ++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/nova/db/api.py b/nova/db/api.py index 83d7b10b1846..e0e01321f7a3 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -112,6 +112,13 @@ def service_get(context, service_id): return IMPL.service_get(context, service_id) +def service_get_by_uuid(context, service_uuid): + """Get a service by it's uuid or raise ServiceNotFound if it does not + exist. + """ + return IMPL.service_get_by_uuid(context, service_uuid) + + def service_get_minimum_version(context, binary): """Get the minimum service version in the database.""" return IMPL.service_get_minimum_version(context, binary) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index a5c0720d1769..f3bb21cd02de 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -475,6 +475,17 @@ def service_get(context, service_id): return result +@pick_context_manager_reader +def service_get_by_uuid(context, service_uuid): + query = model_query(context, models.Service).filter_by(uuid=service_uuid) + + result = query.first() + if not result: + raise exception.ServiceNotFound(service_id=service_uuid) + + return result + + @pick_context_manager_reader_allow_async def service_get_minimum_version(context, binaries): min_versions = context.session.query( diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index 33af2d768472..cd13d1a684b9 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -3572,6 +3572,22 @@ class ServiceTestCase(test.TestCase, ModelsObjectComparatorMixin): self._assertEqualObjects(service1, real_service1, ignored_keys=['compute_node']) + def test_service_get_by_uuid(self): + service1 = self._create_service({'uuid': uuidsentinel.service1_uuid}) + self._create_service({'host': 'some_other_fake_host', + 'uuid': uuidsentinel.other_uuid}) + real_service1 = db.service_get_by_uuid( + self.ctxt, uuidsentinel.service1_uuid) + self._assertEqualObjects(service1, real_service1, + ignored_keys=['compute_node']) + + def test_service_get_by_uuid_not_found(self): + """Asserts that ServiceNotFound is raised if a service is not found by + a given uuid. + """ + self.assertRaises(exception.ServiceNotFound, db.service_get_by_uuid, + self.ctxt, uuidsentinel.service_not_found) + def test_service_get_minimum_version(self): self._create_service({'version': 1, 'host': 'host3',