#!/usr/bin/env python

# Copyright 2021-present Open Networking Foundation
#
# SPDX-License-Identifier: Apache-2.0

# This implements a simple agent that polls the central Edge Monitoring Server
# to find out whether the local cluster is in a maintenance window, and exports
# the result as a Prometheus metric.  The metric can be used to inhibit alerts
# from the local cluster.

import os
import json
import time
import threading
import urllib.request
from flask import Flask, Response
import prometheus_client as prom

# URL of the Edge Monitoring Server where this edge's status can be fetched
# I.e., put /<edge-name> at the end of the URL
AETHER_EDGE_STATUS_URL = os.environ.get("AETHER_EDGE_STATUS_URL")

# Seconds to sleep at end of loop
SLEEP_INTERVAL = 60

app = Flask(__name__)
maint_window = prom.Gauge("aetheredge_in_maintenance_window", "Currently in a maintenance window")

def pull_maintenance_events():
    while True:
        # Pull latest status 
        print ("[INFO] Pulling edge status from %s" % AETHER_EDGE_STATUS_URL)
        try:
            response = urllib.request.urlopen(AETHER_EDGE_STATUS_URL)
            data = json.load(response)
            # print (" * Got: ", data)

            # Export metric to Prometheus
            in_window = data['edge']['maintenance']['in_window']
            print ("[INFO] In maintenance window: %s" % in_window)
            maint_window.set(int(in_window))
        except:
            print("[WARN] Could not retrieve edge status, will keep trying")
            pass

        time.sleep(SLEEP_INTERVAL)

@app.route('/metrics', methods=['GET'])
def get_prometheus_metrics():
    res = []
    res.append(prom.generate_latest(maint_window))
    return Response(res, mimetype="text/plain")

@app.route('/healthz', methods=['GET'])
def get_health():
    return {'message': 'healthy'}

if __name__ == '__main__':
    if not (AETHER_EDGE_STATUS_URL):
        print("[ERROR] AETHER_EDGE_STATUS_URL must be present in the local environment")
        exit(1)
    print(" * Starting maintenance window polling thread")
    print(" *   AETHER_EDGE_STATUS_URL: %s" % AETHER_EDGE_STATUS_URL)
    t = threading.Thread(target=pull_maintenance_events)
    t.start()
    app.run(debug=True, host='0.0.0.0', port=8080)
