diff --git a/k8s.py b/k8s.py index 5744059..fd9159a 100755 --- a/k8s.py +++ b/k8s.py @@ -2,6 +2,8 @@ import base64 import json import yaml import logging +import threading +import time from kubernetes import client, config as kube_config from kubernetes.client.rest import ApiException @@ -45,12 +47,19 @@ def write_config(config): ) log.info("Updated config in Kubernetes ConfigMap [config-outfleet]") - NAMESPACE = False SERVERS = list() CONFIG = None V1 = None +def reload_config(): + global CONFIG + while True: + CONFIG = yaml.safe_load(V1.read_namespaced_config_map(name="config-outfleet", namespace=NAMESPACE).data['config.yaml']) + log.debug(f"Synced system config with ConfigMap [config-outfleet].") + time.sleep(30) + + try: kube_config.load_incluster_config() V1 = client.CoreV1Api() @@ -60,15 +69,18 @@ try: log.info(f"Found Kubernetes environment. Deployed to namespace '{NAMESPACE}'") try: CONFIG = yaml.safe_load(V1.read_namespaced_config_map(name="config-outfleet", namespace=NAMESPACE).data['config.yaml']) - log.info(f"ConfigMap loaded from Kubernetes API. Servers: {len(CONFIG['servers'])}, Clients: {len(CONFIG['clients'])}") + log.info(f"ConfigMap loaded from Kubernetes API. Servers: {len(CONFIG['servers'])}, Clients: {len(CONFIG['clients'])}. Started monitoring for changes every minute.") except Exception as e: try: write_config({"clients": [], "servers": {}, "ui_hostname": "accessible-address.com"}) CONFIG = yaml.safe_load(V1.read_namespaced_config_map(name="config-outfleet", namespace=NAMESPACE).data['config.yaml']) - log.info("Created new ConfigMap [config-outfleet]") + log.info("Created new ConfigMap [config-outfleet]. Started monitoring for changes every minute.") except Exception as e: log.info(f"Failed to create new ConfigMap [config-outfleet] {e}") + thread = threading.Thread(target=reload_config) + thread.start() except: log.info("Kubernetes environment not detected") except: log.info("Kubernetes environment not detected") + diff --git a/main.py b/main.py index bf6ba58..571866d 100755 --- a/main.py +++ b/main.py @@ -1,3 +1,5 @@ +import threading +import time import yaml import logging from datetime import datetime @@ -54,42 +56,44 @@ def random_string(length=64): def update_state(): - global SERVERS - global CLIENTS - global BROKEN_SERVERS - global HOSTNAME + while True: + global SERVERS + global CLIENTS + global BROKEN_SERVERS + global HOSTNAME - SERVERS = list() - BROKEN_SERVERS = list() - CLIENTS = dict() - config = get_config() + SERVERS = list() + BROKEN_SERVERS = list() + CLIENTS = dict() + config = get_config() - if config: - HOSTNAME = config.get("ui_hostname", "my-own-SSL-ENABLED-domain.com") - servers = config.get("servers", dict()) - for local_server_id, server_config in servers.items(): - try: - server = Server( - url=server_config["url"], - cert=server_config["cert"], - comment=server_config["comment"], - local_server_id=local_server_id, - ) - SERVERS.append(server) - log.info( - "Server state updated: %s, [%s]", - server.info()["name"], - local_server_id, - ) - except Exception as e: - BROKEN_SERVERS.append({ - "config": server_config, - "error": e, - "id": local_server_id - }) - log.warning("Can't access server: %s - %s", server_config["url"], e) + if config: + HOSTNAME = config.get("ui_hostname", "my-own-SSL-ENABLED-domain.com") + servers = config.get("servers", dict()) + for local_server_id, server_config in servers.items(): + try: + server = Server( + url=server_config["url"], + cert=server_config["cert"], + comment=server_config["comment"], + local_server_id=local_server_id, + ) + SERVERS.append(server) + log.debug( + "Server state updated: %s, [%s]", + server.info()["name"], + local_server_id, + ) + except Exception as e: + BROKEN_SERVERS.append({ + "config": server_config, + "error": e, + "id": local_server_id + }) + log.warning("Can't access server: %s - %s", server_config["url"], e) - CLIENTS = config.get("clients", dict()) + CLIENTS = config.get("clients", dict()) + time.sleep(40) @app.route("/", methods=["GET", "POST"]) @@ -396,5 +400,6 @@ def sync(): if __name__ == "__main__": - update_state() + thread = threading.Thread(target=update_state) + thread.start() app.run(host="0.0.0.0")