blob: 25be92c33bde5e10cffb4ccc59c620bf16164287 [file] [log] [blame]
tierno94f06112020-02-11 12:38:19 +00001#!/usr/bin/python3
2# -*- coding: utf-8 -*-
3
4##
5# Copyright 2018 Telefonica S.A.
6#
7# Licensed under the Apache License, Version 2.0 (the "License"); you may
8# not use this file except in compliance with the License. You may obtain
9# a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16# License for the specific language governing permissions and limitations
17# under the License.
18##
19
tierno94f06112020-02-11 12:38:19 +000020from time import time, sleep
21from sys import stderr
22
aticig56b86c22022-06-29 10:43:05 +030023from osm_lcm.lcm_utils import LcmException
24import yaml
25
26""" This module is used for health check. A file called time_last_ping is used
tierno94f06112020-02-11 12:38:19 +000027This contains the last time where something is received from kafka
28"""
29
30
aticig56b86c22022-06-29 10:43:05 +030031def get_health_check_file(config_file=None):
32 try:
33 health_check_file = "/app/storage/time_last_ping"
34 if not config_file:
35 return health_check_file
36 # If config_input is dictionary
37 if isinstance(config_file, dict) and config_file.get("storage"):
38 health_check_file = config_file["storage"]["path"] + "/time_last_ping"
39 # If config_input is file
40 elif isinstance(config_file, str):
41 with open(config_file) as f:
42 # read file as yaml format
43 conf = yaml.safe_load(f)
44 # Ensure all sections are not empty
45 if conf.get("storage"):
46 health_check_file = conf["storage"]["path"] + "/time_last_ping"
47
48 return health_check_file
49 except (IOError, FileNotFoundError, TypeError, AttributeError, KeyError) as error:
50 raise LcmException(
51 f"Error occured while getting the health check file location: {error}"
52 )
53
54
55def health_check(config_file=None, ping_interval_pace=120):
56 health_check_file = get_health_check_file(config_file)
tierno94f06112020-02-11 12:38:19 +000057 retry = 2
58 while retry:
59 retry -= 1
60 try:
61 with open(health_check_file, "r") as f:
62 last_received_ping = f.read()
63
garciadeblas5697b8b2021-03-24 09:17:02 +010064 if (
65 time() - float(last_received_ping) < 2 * ping_interval_pace
66 ): # allow one ping not received every two
tierno94f06112020-02-11 12:38:19 +000067 exit(0)
68 except Exception as e:
69 print(e, file=stderr)
70 if retry:
71 sleep(6)
72 exit(1)
73
74
garciadeblas5697b8b2021-03-24 09:17:02 +010075if __name__ == "__main__":
tierno94f06112020-02-11 12:38:19 +000076 health_check()