|
- import copy
-
- from flask import Flask, request
- from prometheus_api_client import PrometheusConnect
- import random
-
- app = Flask(__name__)
- app.config.from_envvar('DISPATCHER_SETTINGS')
-
-
- def get_prom_client():
- return PrometheusConnect(**app.config["PROMETHEUS"])
-
-
- @app.route("/")
- def hello_world():
- return "Target offload dispatcher"
-
-
- prom = get_prom_client()
-
-
- @app.route("/offload_target")
- def offload_target():
- expected_size = int(request.args.get("SIZE_HINT", 20*1024*1024*1024))
- weights = [x.get("weight", 100) for x in app.config["TARGETS"]]
- target = random.choices(app.config["TARGETS"], weights=weights)[0]
- app.logger.info(f"Considering target {target['url']}...")
- result = prom.custom_query(query=target["free_space"]["query"])
- if len(result) != 1:
- return "Unable to allocate target. Can't get space info.", 500
- result = result[0]
- target_free_space = int(result['value'][1])
- expected_free_space = target_free_space - expected_size
- app.logger.info(f"Available space: {target_free_space} Expected size: {expected_size}")
- if expected_free_space < target["free_space"].get("minimum", 1024 * 1024 * 1024 * 500):
- return "Unable to allocate target. Not enough space on selected machine.", 507
- return {"url": target["url"]}
|