index.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #-*- coding:utf-8 -*-
  2. import json
  3. import re
  4. from flask import request, abort, g, render_template
  5. from rrd import app, config
  6. from rrd import corelib
  7. def get_api_endpoints(q, tags, page=1, limit=100):
  8. if not q and not tags:
  9. raise Exception("no query params given")
  10. h = {"Content-type": "application/json"}
  11. r = corelib.auth_requests("GET", config.API_ADDR + "/graph/endpoint?q=%s&limit=%d&page=%d&tags=%s" %(q, limit, page, tags), headers=h)
  12. if r.status_code != 200:
  13. raise Exception(r.text)
  14. j = sorted(r.json(), key=lambda x:x["endpoint"])
  15. return j
  16. @app.route("/")
  17. def index():
  18. q = request.args.get("q") or "."
  19. raw_tag = request.args.get("tags") or ""
  20. tags = ','.join(re.split('\s*,\s*', raw_tag))
  21. limit = int(request.args.get("limit") or 50)
  22. page = int(request.args.get("page") or 1)
  23. endpoint_objs = get_api_endpoints(q, tags, page, limit)
  24. return render_template("index.html", **locals())
  25. @app.route("/api/endpoints")
  26. def api_endpoints():
  27. ret = {
  28. "ok": False,
  29. "msg": "",
  30. "data": [],
  31. }
  32. q = request.args.get("q") or "."
  33. raw_tag = request.args.get("tags") or ""
  34. tags = ','.join(re.split('\s*,\s*', raw_tag))
  35. limit = int(request.args.get("limit") or 100)
  36. page = int(request.args.get("page") or 1)
  37. try:
  38. data = get_api_endpoints(q, tags, page, limit)
  39. ret['data'] = data
  40. ret['ok'] = True
  41. return json.dumps(ret)
  42. except Exception as e:
  43. abort(400, str(ret))
  44. @app.route("/api/counters", methods=["POST"])
  45. def api_get_counters():
  46. ret = {
  47. "ok": False,
  48. "msg": "",
  49. "data": [],
  50. }
  51. q = request.form.get("q") or ""
  52. limit = int(request.form.get("limit") or 50)
  53. page = int(request.form.get("page") or 1)
  54. eids = request.form.get("eids") or ""
  55. eids = eids and json.loads(eids) or []
  56. if not (eids or q):
  57. ret['msg'] = "no endpoints or counter given"
  58. return json.dumps(ret)
  59. h = {"Content-type": "application/json"}
  60. 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)
  61. if r.status_code != 200:
  62. abort(400, r.text)
  63. j = r.json()
  64. counters_map = {}
  65. for x in j:
  66. counters_map[x['counter']] = [x['counter'], x['type'], x['step']]
  67. sorted_counters = sorted(counters_map.keys())
  68. sorted_values = [counters_map[x] for x in sorted_counters]
  69. ret['data'] = sorted_values
  70. ret['ok'] = True
  71. return json.dumps(ret)
  72. @app.route("/api/counters", methods=["DELETE"])
  73. def api_delete_counters():
  74. ret = {
  75. "ok": False,
  76. "msg": "",
  77. }
  78. endpoints = request.form.getlist("endpoints[]") or []
  79. counters = request.form.getlist("counters[]") or []
  80. if len(endpoints) == 0 or len(counters) == 0:
  81. ret['msg'] = "no endpoint and counter"
  82. return json.dumps(ret)
  83. h = {"Content-type": "application/json"}
  84. d = {
  85. "endpoints": endpoints,
  86. "counters": counters,
  87. }
  88. r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/counter", headers=h, data=json.dumps(d))
  89. if r.status_code != 200:
  90. abort(r.status_code, r.text)
  91. j = r.json()
  92. ret["ok"] = True
  93. ret["data"] = "%s counters affected" %j.get("affected_counter")
  94. return json.dumps(ret)
  95. @app.route("/api/endpoints", methods=["DELETE"])
  96. def api_delete_endpoints():
  97. ret = {
  98. "ok": False,
  99. "msg": "",
  100. }
  101. endpoints = request.form.getlist("endpoints[]") or []
  102. if len(endpoints) == 0:
  103. ret['msg'] = "no endpoint"
  104. return json.dumps(ret)
  105. h = {"Content-type": "application/json"}
  106. d = endpoints
  107. r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/endpoint", headers=h, data=json.dumps(d))
  108. if r.status_code != 200:
  109. abort(r.status_code, r.text)
  110. j = r.json()
  111. ret["ok"] = True
  112. ret["data"] = "%s counters affected, %s endpoints affected" %(j.get("affected_counter"), j.get("affected_endpoint"))
  113. return json.dumps(ret)