summaryrefslogtreecommitdiff
path: root/oslo_middleware/healthcheck
diff options
context:
space:
mode:
authorMehdi Abaakouk <mehdi.abaakouk@enovance.com>2014-11-27 18:05:24 +0100
committerMehdi Abaakouk <mehdi.abaakouk@enovance.com>2015-01-19 10:32:18 +0100
commitedabbd1619029c74c56134e1570736d1f71e1f21 (patch)
tree55ae002624e03425d0c3dc08ebc30f9e2100e44f /oslo_middleware/healthcheck
parent020fd92f2d789828cd7de06928c65233f4e6b87f (diff)
downloadoslo-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__.py74
-rw-r--r--oslo_middleware/healthcheck/disable_by_file.py38
-rw-r--r--oslo_middleware/healthcheck/pluginbase.py35
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
+ """