|
@@ -1,7 +1,143 @@
|
|
|
#-*- coding:utf-8 -*-
|
|
|
-from flask import render_template
|
|
|
-from rrd import app
|
|
|
+import json
|
|
|
+import re
|
|
|
+from flask import request, abort, g, render_template
|
|
|
+from rrd import app, config
|
|
|
+from rrd import corelib
|
|
|
+
|
|
|
+
|
|
|
+def get_api_endpoints(q, tags, page=1, limit=100):
|
|
|
+ if not q and not tags:
|
|
|
+ raise Exception("no query params given")
|
|
|
+
|
|
|
+ h = {"Content-type": "application/json"}
|
|
|
+ r = corelib.auth_requests("GET", config.API_ADDR + "/graph/endpoint?q=%s&limit=%d&page=%d&tags=%s" %(q, limit, page, tags), headers=h)
|
|
|
+ if r.status_code != 200:
|
|
|
+ raise Exception(r.text)
|
|
|
+
|
|
|
+ j = sorted(r.json(), key=lambda x:x["endpoint"])
|
|
|
+
|
|
|
+ return j
|
|
|
+
|
|
|
|
|
|
@app.route("/")
|
|
|
def index():
|
|
|
+ q = request.args.get("q") or "."
|
|
|
+ raw_tag = request.args.get("tags") or ""
|
|
|
+ tags = ','.join(re.split('\s*,\s*', raw_tag))
|
|
|
+ limit = int(request.args.get("limit") or 50)
|
|
|
+ page = int(request.args.get("page") or 1)
|
|
|
+
|
|
|
+ endpoint_objs = get_api_endpoints(q, tags, page, limit)
|
|
|
return render_template("index.html", **locals())
|
|
|
+
|
|
|
+@app.route("/api/endpoints")
|
|
|
+def api_endpoints():
|
|
|
+ ret = {
|
|
|
+ "ok": False,
|
|
|
+ "msg": "",
|
|
|
+ "data": [],
|
|
|
+ }
|
|
|
+
|
|
|
+ q = request.args.get("q") or "."
|
|
|
+ raw_tag = request.args.get("tags") or ""
|
|
|
+ tags = ','.join(re.split('\s*,\s*', raw_tag))
|
|
|
+ limit = int(request.args.get("limit") or 100)
|
|
|
+ page = int(request.args.get("page") or 1)
|
|
|
+
|
|
|
+ try:
|
|
|
+ data = get_api_endpoints(q, tags, page, limit)
|
|
|
+ ret['data'] = data
|
|
|
+ ret['ok'] = True
|
|
|
+ return json.dumps(ret)
|
|
|
+ except Exception as e:
|
|
|
+ abort(400, str(ret))
|
|
|
+
|
|
|
+@app.route("/api/counters", methods=["POST"])
|
|
|
+def api_get_counters():
|
|
|
+ ret = {
|
|
|
+ "ok": False,
|
|
|
+ "msg": "",
|
|
|
+ "data": [],
|
|
|
+ }
|
|
|
+
|
|
|
+ q = request.form.get("q") or ""
|
|
|
+ limit = int(request.form.get("limit") or 50)
|
|
|
+ page = int(request.form.get("page") or 1)
|
|
|
+ eids = request.form.get("eids") or ""
|
|
|
+ eids = eids and json.loads(eids) or []
|
|
|
+
|
|
|
+ if not (eids or q):
|
|
|
+ ret['msg'] = "no endpoints or counter given"
|
|
|
+ return json.dumps(ret)
|
|
|
+
|
|
|
+
|
|
|
+ h = {"Content-type": "application/json"}
|
|
|
+ r = corelib.auth_requests("GET", config.API_ADDR + "/graph/endpoint_counter?eid=%s&metricQuery=%s&limit=%d&page=%d" %(",".join(eids), q, limit, page), headers=h)
|
|
|
+ if r.status_code != 200:
|
|
|
+ abort(400, r.text)
|
|
|
+ j = r.json()
|
|
|
+
|
|
|
+ counters_map = {}
|
|
|
+ for x in j:
|
|
|
+ counters_map[x['counter']] = [x['counter'], x['type'], x['step']]
|
|
|
+ sorted_counters = sorted(counters_map.keys())
|
|
|
+ sorted_values = [counters_map[x] for x in sorted_counters]
|
|
|
+
|
|
|
+ ret['data'] = sorted_values
|
|
|
+ ret['ok'] = True
|
|
|
+
|
|
|
+ return json.dumps(ret)
|
|
|
+
|
|
|
+
|
|
|
+@app.route("/api/counters", methods=["DELETE"])
|
|
|
+def api_delete_counters():
|
|
|
+ ret = {
|
|
|
+ "ok": False,
|
|
|
+ "msg": "",
|
|
|
+ }
|
|
|
+
|
|
|
+ endpoints = request.form.getlist("endpoints[]") or []
|
|
|
+ counters = request.form.getlist("counters[]") or []
|
|
|
+ if len(endpoints) == 0 or len(counters) == 0:
|
|
|
+ ret['msg'] = "no endpoint and counter"
|
|
|
+ return json.dumps(ret)
|
|
|
+
|
|
|
+ h = {"Content-type": "application/json"}
|
|
|
+ d = {
|
|
|
+ "endpoints": endpoints,
|
|
|
+ "counters": counters,
|
|
|
+ }
|
|
|
+ r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/counter", headers=h, data=json.dumps(d))
|
|
|
+ if r.status_code != 200:
|
|
|
+ abort(r.status_code, r.text)
|
|
|
+ j = r.json()
|
|
|
+
|
|
|
+ ret["ok"] = True
|
|
|
+ ret["data"] = "%s counters affected" %j.get("affected_counter")
|
|
|
+ return json.dumps(ret)
|
|
|
+
|
|
|
+
|
|
|
+@app.route("/api/endpoints", methods=["DELETE"])
|
|
|
+def api_delete_endpoints():
|
|
|
+ ret = {
|
|
|
+ "ok": False,
|
|
|
+ "msg": "",
|
|
|
+ }
|
|
|
+
|
|
|
+ endpoints = request.form.getlist("endpoints[]") or []
|
|
|
+ if len(endpoints) == 0:
|
|
|
+ ret['msg'] = "no endpoint"
|
|
|
+ return json.dumps(ret)
|
|
|
+
|
|
|
+ h = {"Content-type": "application/json"}
|
|
|
+ d = endpoints
|
|
|
+
|
|
|
+ r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/endpoint", headers=h, data=json.dumps(d))
|
|
|
+ if r.status_code != 200:
|
|
|
+ abort(r.status_code, r.text)
|
|
|
+ j = r.json()
|
|
|
+
|
|
|
+ ret["ok"] = True
|
|
|
+ ret["data"] = "%s counters affected, %s endpoints affected" %(j.get("affected_counter"), j.get("affected_endpoint"))
|
|
|
+ return json.dumps(ret)
|