From 802c5633e064ad7d79ae7e5aa0ffb2e1df60f96b Mon Sep 17 00:00:00 2001 From: LisaLi Date: Mon, 29 Feb 2016 15:12:18 +0800 Subject: [PATCH] Fix exception during service update The function objects.Service.get_by_args raises HostBinaryNotFound exception, but in service update function, it catches ServiceNotFound exception by mistake. This patch is to remove HostBinaryNotFound and use ServiceNotFound to make things simple and consistent. Change-Id: Ic2ef79ca03393f3b1eb5bb89d4ffcf92d76460c6 Closes-bug: #1551101 --- cinder/cmd/manage.py | 2 +- cinder/db/sqlalchemy/api.py | 6 ++++-- cinder/exception.py | 13 ++++++++----- cinder/tests/unit/test_db_api.py | 4 ++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/cinder/cmd/manage.py b/cinder/cmd/manage.py index 5c8ab2bcb..2f25e1463 100644 --- a/cinder/cmd/manage.py +++ b/cinder/cmd/manage.py @@ -450,7 +450,7 @@ class ServiceCommands(object): try: svc = objects.Service.get_by_args(ctxt, host_name, binary) svc.destroy() - except exception.HostBinaryNotFound as e: + except exception.ServiceNotFound as e: print(_("Host not found. Failed to remove %(service)s" " on %(host)s.") % {'service': binary, 'host': host_name}) diff --git a/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py index 407c4999c..da554c249 100644 --- a/cinder/db/sqlalchemy/api.py +++ b/cinder/db/sqlalchemy/api.py @@ -426,7 +426,8 @@ def service_get_by_host_and_topic(context, host, topic): filter_by(topic=topic).\ first() if not result: - raise exception.ServiceNotFound(service_id=None) + raise exception.ServiceNotFound(service_id=topic, + host=host) return result @@ -441,7 +442,8 @@ def service_get_by_args(context, host, binary): if host == result['host']: return result - raise exception.HostBinaryNotFound(host=host, binary=binary) + raise exception.ServiceNotFound(service_id=binary, + host=host) @require_admin_context diff --git a/cinder/exception.py b/cinder/exception.py index 9f5a50e0b..75d071a56 100644 --- a/cinder/exception.py +++ b/cinder/exception.py @@ -362,7 +362,14 @@ class ImageNotFound(NotFound): class ServiceNotFound(NotFound): - message = _("Service %(service_id)s could not be found.") + + def __init__(self, message=None, **kwargs): + if kwargs.get('host', None): + self.message = _("Service %(service_id)s could not be " + "found on host %(host)s.") + else: + self.message = _("Service %(service_id)s could not be found.") + super(ServiceNotFound, self).__init__(None, **kwargs) class ServiceTooOld(Invalid): @@ -381,10 +388,6 @@ class SchedulerHostWeigherNotFound(NotFound): message = _("Scheduler Host Weigher %(weigher_name)s could not be found.") -class HostBinaryNotFound(NotFound): - message = _("Could not find binary %(binary)s on host %(host)s.") - - class InvalidReservationExpiration(Invalid): message = _("Invalid reservation expiration %(expire)s.") diff --git a/cinder/tests/unit/test_db_api.py b/cinder/tests/unit/test_db_api.py index daa3eaf0d..02f3359ef 100644 --- a/cinder/tests/unit/test_db_api.py +++ b/cinder/tests/unit/test_db_api.py @@ -240,7 +240,7 @@ class DBAPIServiceTestCase(BaseTest): self._assertEqualObjects(services[1], service2) def test_service_get_by_args_not_found_exception(self): - self.assertRaises(exception.HostBinaryNotFound, + self.assertRaises(exception.ServiceNotFound, db.service_get_by_args, self.ctxt, 'non-exists-host', 'a') @@ -282,7 +282,7 @@ class DBAPIServiceTestCase(BaseTest): service2 = db.service_get_by_args(self.ctxt, 'HOST', 'a') self._assertEqualObjects(services[1], service2) - self.assertRaises(exception.HostBinaryNotFound, + self.assertRaises(exception.ServiceNotFound, db.service_get_by_args, self.ctxt, 'Host', 'a') -- 2.45.2