From: Benjamin Diaz Date: Mon, 27 May 2019 17:57:51 +0000 (-0300) Subject: Adds basic healthcheck to Dockerfile X-Git-Tag: v6.0.0~2 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FPOL.git;a=commitdiff_plain;h=6d8a34f0584eac025fa0d56a49ba965432da0b4c Adds basic healthcheck to Dockerfile Change-Id: Ia69f49dbfb6e1ff479548d19327d5f26e1a291ed Signed-off-by: Benjamin Diaz --- diff --git a/docker/Dockerfile b/docker/Dockerfile index 60dbeae..a3cb316 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -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 index 0000000..e10776f --- /dev/null +++ b/osm_policy_module/cmd/policy_module_healthcheck.py @@ -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()