v1.1.47: fix scenario UUID extraction — _find_uid + _uid_from_location fallback

This commit is contained in:
2026-07-30 13:57:34 +04:00
parent 7eeb1131b3
commit 566a6da8d9
2 changed files with 26 additions and 9 deletions
+25 -8
View File
@@ -27,13 +27,31 @@ import uuid
from runner import load_config
from operations.get_services import get_service_detail
from operations.get_instances import get_instances
from db.pool import get_conn, put_conn
from db.save_run import save_run
AUTOTEST_PREFIX = "autotest-scenario-"
def _find_uid(resp):
"""Extract UUID from nested response (e.g. {instanceOperation: {instanceOperationUid: ...}})."""
if isinstance(resp, dict):
for v in resp.values():
if isinstance(v, dict):
uid = v.get("instanceOperationUid") or v.get("instanceUid")
if uid:
return uid
return None
def _uid_from_location(loc):
"""Extract UUID from Location header."""
if not loc:
return None
parts = str(loc).rstrip("/").split("/")
return parts[-1] if parts[-1] else None
def load_scenarios():
"""Загрузить словарь сценариев из config.yaml."""
cfg = load_config() or {}
@@ -162,9 +180,9 @@ def run_scenario(client, scenario_name, client_id, stand, user_email, app_versio
descr = f"scenario {scenario_name} step {step_num}"
payload = {"serviceId": svc_id, "displayName": display_name, "descr": descr}
resp = client.post("/instances", payload)
instance_uid = resp.get("instanceUid")
instance_uid = resp.get("instanceUid") or _find_uid(resp) or _uid_from_location(resp.get("_location", ""))
if not instance_uid:
raise RuntimeError("CREATE: no instanceUid in response")
raise RuntimeError(f"CREATE: no instanceUid in response: {json.dumps(resp)[:200]}")
instance_map[svc_name] = instance_uid
else:
instance_uid = instance_map.get(svc_name)
@@ -176,12 +194,11 @@ def run_scenario(client, scenario_name, client_id, stand, user_email, app_versio
op_resp = client.post("/instanceOperations", op_payload)
op_uid = op_resp.get("instanceOperationUid") or op_resp.get("instanceOperation", {}).get("instanceOperationUid")
if not op_uid:
op_uid = next((v for k, v in op_resp.items() if "Uid" in k or "uid" in k), None)
if not op_uid and "_location" in op_resp:
loc = op_resp["_location"]
op_uid = loc.rsplit("/", 1)[-1] if "/" in loc else loc
op_uid = _find_uid(op_resp)
if not op_uid:
raise RuntimeError("No opUid in response")
op_uid = _uid_from_location(op_resp.get("_location", ""))
if not op_uid:
raise RuntimeError(f"No opUid in response: {json.dumps(op_resp)[:200]}")
# Отправить параметры и запустить
from routes.api_test import _send_params_terraform