Adds basic healthcheck to Dockerfile 57/7557/1
authorBenjamin Diaz <bdiaz@whitestack.com>
Mon, 27 May 2019 17:57:51 +0000 (14:57 -0300)
committerBenjamin Diaz <bdiaz@whitestack.com>
Mon, 27 May 2019 17:57:51 +0000 (14:57 -0300)
Change-Id: Ia69f49dbfb6e1ff479548d19327d5f26e1a291ed
Signed-off-by: Benjamin Diaz <bdiaz@whitestack.com>
docker/Dockerfile
osm_policy_module/cmd/policy_module_healthcheck.py [new file with mode: 0644]

index 60dbeae..a3cb316 100644 (file)
@@ -47,4 +47,7 @@ ENV OSMPOL_SQL_DATABASE_URI sqlite:///policy_module.db
 
 ENV OSMPOL_GLOBAL_LOGLEVEL INFO
 
+HEALTHCHECK --interval=5s --timeout=2s --retries=12 \
+  CMD osm-pol-healthcheck || exit 1
+
 CMD /bin/bash /policy_module/docker/scripts/start.sh
\ No newline at end of file
diff --git a/osm_policy_module/cmd/policy_module_healthcheck.py b/osm_policy_module/cmd/policy_module_healthcheck.py
new file mode 100644 (file)
index 0000000..e10776f
--- /dev/null
@@ -0,0 +1,82 @@
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# 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.
+
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
+import argparse
+import asyncio
+import logging
+import subprocess
+import sys
+
+from aiokafka import AIOKafkaConsumer
+
+from osm_policy_module.core.config import Config
+
+log = logging.getLogger(__name__)
+
+
+def main():
+    parser = argparse.ArgumentParser(prog='osm-policy-healthcheck')
+    parser.add_argument('--config-file', nargs='?', help='POL configuration file')
+    args = parser.parse_args()
+    cfg = Config(args.config_file)
+
+    if not _processes_running():
+        sys.exit(1)
+    if not _is_kafka_ok(cfg.get('message', 'host'), cfg.get('message', 'port')):
+        sys.exit(1)
+    sys.exit(0)
+
+
+def _processes_running():
+    def _contains_process(processes, process_name):
+        for row in processes:
+            if process_name in row:
+                return True
+        return False
+
+    processes_to_check = ['osm-policy-agent']
+    ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
+    processes_running = ps.decode().split('\n')
+    for p in processes_to_check:
+        if not _contains_process(processes_running, p):
+            return False
+    return True
+
+
+def _is_kafka_ok(host, port):
+    async def _test_kafka(loop):
+        consumer = AIOKafkaConsumer(
+            'healthcheck',
+            loop=loop, bootstrap_servers='{}:{}'.format(host, port))
+        await consumer.start()
+        await consumer.stop()
+
+    try:
+        loop = asyncio.get_event_loop()
+        loop.run_until_complete(_test_kafka(loop))
+        return True
+    except Exception:
+        log.exception("POL can not connect to Kafka")
+        return False
+
+
+if __name__ == '__main__':
+    main()