""" Общие утилиты: извлечение UUID из ответов API Nubes. Используется: api_test.py, scenario.py, executor.py. Заменяет разрозненные реализации _find_uid / _uid_from_location. """ def find_uid(resp): """Извлечь instanceUid или instanceOperationUid из ответа API. Ищет в нескольких местах: 1. На верхнем уровне: instanceOperationUid → instanceUid → uid → Uid 2. Во вложенных dict-значениях: {key: {instanceOperationUid: ..., instanceUid: ...}} """ if not isinstance(resp, dict): return None # Верхний уровень — прямые ключи (api_test.py-стиль) for key in ("instanceOperationUid", "instanceUid", "uid", "Uid"): v = resp.get(key) if isinstance(v, str) and v: return v # Вложенные dict-значения (scenario.py-стиль) 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): """Извлечь UUID из Location-заголовка. Location бывает: "./UUID", "/api/v1/svc/instances/UUID", "/api/v1/svc/instanceOperations/UUID" Берём последний сегмент после split("/"). """ if not loc: return None parts = str(loc).rstrip("/").split("/") uid = parts[-1] # UUID — 36 символов с 4 дефисами (уже проверено в http_client.py) if uid and uid != "." and len(uid) >= 32: return uid return None