Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

39 righe
1.3 KiB

  1. import copy
  2. from flask import Flask, request
  3. from prometheus_api_client import PrometheusConnect
  4. import random
  5. app = Flask(__name__)
  6. app.config.from_envvar('DISPATCHER_SETTINGS')
  7. def get_prom_client():
  8. return PrometheusConnect(**app.config["PROMETHEUS"])
  9. @app.route("/")
  10. def hello_world():
  11. return "Target offload dispatcher"
  12. prom = get_prom_client()
  13. @app.route("/offload_target")
  14. def offload_target():
  15. expected_size = int(request.args.get("SIZE_HINT", 20*1024*1024*1024))
  16. weights = [x.get("weight", 100) for x in app.config["TARGETS"]]
  17. target = random.choices(app.config["TARGETS"], weights=weights)[0]
  18. app.logger.info(f"Considering target {target['url']}...")
  19. result = prom.custom_query(query=target["free_space"]["query"])
  20. if len(result) != 1:
  21. return "Unable to allocate target. Can't get space info.", 500
  22. result = result[0]
  23. target_free_space = int(result['value'][1])
  24. expected_free_space = target_free_space - expected_size
  25. app.logger.info(f"Available space: {target_free_space} Expected size: {expected_size}")
  26. if expected_free_space < target["free_space"].get("minimum", 1024 * 1024 * 1024 * 500):
  27. return "Unable to allocate target. Not enough space on selected machine.", 507
  28. return {"url": target["url"]}