diff options
author | Mehdi Abaakouk <mehdi.abaakouk@enovance.com> | 2014-11-27 18:05:24 +0100 |
---|---|---|
committer | Mehdi Abaakouk <mehdi.abaakouk@enovance.com> | 2015-01-19 10:32:18 +0100 |
commit | edabbd1619029c74c56134e1570736d1f71e1f21 (patch) | |
tree | 55ae002624e03425d0c3dc08ebc30f9e2100e44f /oslo_middleware/healthcheck | |
parent | 020fd92f2d789828cd7de06928c65233f4e6b87f (diff) | |
download | oslo-middleware-edabbd1619029c74c56134e1570736d1f71e1f21.tar.gz |
Add healthcheck middleware
Implements blueprint oslo-middleware-healthcheck
Change-Id: Id19a47c07ff4fbf954ab188b7186361ed9ef213a
Diffstat (limited to 'oslo_middleware/healthcheck')
-rw-r--r-- | oslo_middleware/healthcheck/__init__.py | 74 | ||||
-rw-r--r-- | oslo_middleware/healthcheck/disable_by_file.py | 38 | ||||
-rw-r--r-- | oslo_middleware/healthcheck/pluginbase.py | 35 |
3 files changed, 147 insertions, 0 deletions
diff --git a/oslo_middleware/healthcheck/__init__.py b/oslo_middleware/healthcheck/__init__.py new file mode 100644 index 0000000..559770a --- /dev/null +++ b/oslo_middleware/healthcheck/__init__.py @@ -0,0 +1,74 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import stevedore +import webob.dec +import webob.exc +import webob.response + +from oslo_middleware import base + + +class Healthcheck(base.Middleware): + """Helper class that returns debug information. + + Can be inserted into any WSGI application chain to get information about + the request and response. + """ + + NAMESPACE = "oslo.middleware.healthcheck" + + @classmethod + def factory(cls, global_conf, **local_conf): + """Factory method for paste.deploy.""" + conf = global_conf.copy() + conf.update(local_conf) + + def healthcheck_filter(app): + return cls(app, conf) + return cls + + def __init__(self, application, conf): + super(Healthcheck, self).__init__(application) + self._path = conf.get('path', '/healthcheck') + self._backend_names = [] + backends = conf.get('backends') + if backends: + self._backend_names = backends.split(',') + + self._backends = stevedore.NamedExtensionManager( + self.NAMESPACE, self._backend_names, + name_order=True, invoke_on_load=True, + invoke_args=(conf,)) + + @webob.dec.wsgify + def process_request(self, req): + if req.path != self._path: + return None + + healthy = True + reasons = [] + for ext in self._backends: + result = ext.obj.healthcheck() + healthy &= result.available + if result.reason: + reasons.append(result.reason) + + return webob.response.Response( + status=(webob.exc.HTTPOk.code if healthy + else webob.exc.HTTPServiceUnavailable.code), + body='\n'.join(reasons), + content_type="text/plain", + ) diff --git a/oslo_middleware/healthcheck/disable_by_file.py b/oslo_middleware/healthcheck/disable_by_file.py new file mode 100644 index 0000000..7e964a4 --- /dev/null +++ b/oslo_middleware/healthcheck/disable_by_file.py @@ -0,0 +1,38 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import os + +from oslo_middleware.healthcheck import pluginbase +from oslo_middleware.i18n import _LW + +LOG = logging.getLogger(__name__) + + +class DisableByFileHealthcheck(pluginbase.HealthcheckBaseExtension): + def healthcheck(self): + path = self.conf.get('disable_by_file_path') + if path is None: + LOG.warning(_LW('DisableByFile healthcheck middleware enabled ' + 'without disable_by_file_path set')) + return pluginbase.HealthcheckResult(available=True, + reason="") + elif not os.path.exists(path): + return pluginbase.HealthcheckResult(available=True, + reason="") + else: + return pluginbase.HealthcheckResult(available=False, + reason="DISABLED BY FILE") diff --git a/oslo_middleware/healthcheck/pluginbase.py b/oslo_middleware/healthcheck/pluginbase.py new file mode 100644 index 0000000..8c6e9d4 --- /dev/null +++ b/oslo_middleware/healthcheck/pluginbase.py @@ -0,0 +1,35 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import abc +import collections + +import six + +HealthcheckResult = collections.namedtuple( + 'HealthcheckResult', ['available', 'reason'], verbose=True) + + +@six.add_metaclass(abc.ABCMeta) +class HealthcheckBaseExtension(object): + def __init__(self, conf): + self.conf = conf + + @abc.abstractmethod + def healthcheck(): + """method called by the healthcheck middleware + + return: HealthcheckResult object + """ |