Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 

39 řádky
1.2 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. @app.route("/offload_target")
  13. def offload_target():
  14. expected_size = int(request.args.get("SIZE_HINT", 20*1024*1024*1024))
  15. targets = copy.deepcopy(app.config["TARGETS"])
  16. random.shuffle(targets)
  17. prom = get_prom_client()
  18. for target in targets:
  19. app.logger.info(f"Considering target {target['url']}...")
  20. result = prom.custom_query(query=target["free_space"]["query"])
  21. if len(result) != 1:
  22. continue
  23. result = result[0]
  24. target_free_space = int(result['value'][1])
  25. expected_free_space = target_free_space - expected_size
  26. app.logger.info(f"Available space: {target_free_space} Expected size: {expected_size}")
  27. if expected_free_space < target["free_space"].get("minimum", 1024 * 1024 * 1024 * 500):
  28. continue
  29. return {"url": target["url"]}
  30. return "Unable to allocate target", 500