blob: 41ed6752f317fe6f6d354105e091c403dd1baa81 [file] [log] [blame]
Hyunsun Moonf32ae9a2020-05-28 13:17:45 -07001#!/usr/bin/env python
2
3# Copyright 2020-present Open Networking Foundation
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import time
Andy Bavier4021a2f2020-07-29 12:39:47 -070018from flask import Flask, jsonify, abort, request, Response
19import prometheus_client as prom
20
21NO_RESULT_THRESHOLD = 720
Hyunsun Moonf32ae9a2020-05-28 13:17:45 -070022
23app = Flask(__name__)
24edges = [
25 {
26 'name': 'production-edge-example',
27 'status': {
28 'control_plane': 'connected',
29 'user_plane': 'connected'
30 },
31 'last_update': time.time()
32 }
33]
34
Andy Bavier4021a2f2020-07-29 12:39:47 -070035status_codes = {
36 "no result": -2,
37 "error": -1,
38 "disconnected": 0,
39 "connecting": 1,
40 "connected": 2
41}
42
43cp_status = prom.Gauge("aetheredge_status_control_plane", "Control plane status code", ["name"])
44up_status = prom.Gauge("aetheredge_status_user_plane", "User plane status code", ["name"])
45last_update = prom.Gauge("aetheredge_last_update", "Last reported test result", ["name"])
46
47def time_out_stale_results():
48 for edge in edges:
49 time_elapsed = time.time() - edge["last_update"]
50 if time_elapsed > NO_RESULT_THRESHOLD:
51 edge['status']['control_plane'] = "no result"
52 edge['status']['user_plane'] = "no result"
53
54
55@app.route('/edges/metrics', methods=['GET'])
56def get_prometheus_metrics():
57 res = []
58 time_out_stale_results()
59 for edge in edges:
60 if edge['name'] == "production-edge-example":
61 continue
62
63 cp_status.labels(edge['name']).set(status_codes[edge['status']['control_plane']])
64 up_status.labels(edge['name']).set(status_codes[edge['status']['user_plane']])
65 last_update.labels(edge['name']).set(edge['last_update'])
66
67 res.append(prom.generate_latest(cp_status))
68 res.append(prom.generate_latest(up_status))
69 res.append(prom.generate_latest(last_update))
70 return Response(res, mimetype="text/plain")
71
Hyunsun Moonf32ae9a2020-05-28 13:17:45 -070072
73@app.route('/edges/healthz', methods=['GET'])
74def get_health():
75 return {'message': 'healthy'}
76
77
78@app.route('/edges', methods=['GET'])
79def get_edges():
Andy Bavier4021a2f2020-07-29 12:39:47 -070080 time_out_stale_results()
Hyunsun Moonf32ae9a2020-05-28 13:17:45 -070081 return jsonify({'edges': edges})
82
83
84@app.route('/edges/<string:name>', methods=['GET'])
85def get_edge(name):
Andy Bavier4021a2f2020-07-29 12:39:47 -070086 time_out_stale_results()
Hyunsun Moonf32ae9a2020-05-28 13:17:45 -070087 edge = [edge for edge in edges if edge['name'] == name]
88 if len(edge) == 0:
89 abort(404)
90 return jsonify({'edge': edge[0]})
91
92
93@app.route('/edges', methods=['POST'])
94def create_or_update_edge():
95 if not request.json:
96 abort(400)
97 if 'name' not in request.json:
98 abort(400)
99 if 'status' not in request.json:
100 abort(400)
101
102 req_edge = {
103 'name': request.json['name'],
104 'status': {
105 'control_plane': request.json['status']['control_plane'],
106 'user_plane': request.json['status']['user_plane']
107 },
108 'last_update': time.time()
109 }
110
111 edge = [edge for edge in edges if edge['name'] == req_edge['name']]
112 if len(edge) == 0:
113 print("new edge request " + req_edge['name'])
114 edges.append(req_edge)
115 else:
116 edge[0]['status']['control_plane'] = req_edge['status']['control_plane']
117 edge[0]['status']['user_plane'] = req_edge['status']['user_plane']
118 edge[0]['last_update'] = req_edge['last_update']
119
120 return jsonify({'edge': req_edge}), 201
121
122
123if __name__ == '__main__':
124 app.run(debug=True, host='0.0.0.0', port=80)