|
|
@@ -17,22 +17,22 @@ 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)) |
|
|
|
targets = copy.deepcopy(app.config["TARGETS"]) |
|
|
|
random.shuffle(targets) |
|
|
|
prom = get_prom_client() |
|
|
|
for target in targets: |
|
|
|
app.logger.info(f"Considering target {target['url']}...") |
|
|
|
result = prom.custom_query(query=target["free_space"]["query"]) |
|
|
|
if len(result) != 1: |
|
|
|
continue |
|
|
|
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): |
|
|
|
continue |
|
|
|
return {"url": target["url"]} |
|
|
|
return "Unable to allocate target", 500 |
|
|
|
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"]} |