api.py 3.5 KB

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