""" Общий цикл поллинга операции Nubes. Используется: - _finish_op (api_test.py) — асинхронно в threading.Thread - run_scenario (scenario.py) — синхронно в while """ import time def poll_until_done(client, op_uid, timeout=1800): """Поллинг операции до завершения или таймаута. Возвращает dict: {status, is_successful, error_log, stages, duration, svc} status ∈ {OK, FAIL, TIMEOUT} """ t0 = time.time() deadline = t0 + timeout while time.time() < deadline: try: data = client.get( f"/instanceOperations/{op_uid}" "?fields=dtFinish,isSuccessful,errorLog,duration,stages,svc" ) except Exception: time.sleep(5) continue op = data.get("instanceOperation", {}) dt_finish = op.get("dtFinish") if dt_finish and str(dt_finish).strip(): is_ok = op.get("isSuccessful") return { "status": "OK" if is_ok else "FAIL", "is_successful": is_ok, "error_log": op.get("errorLog") or "", "stages": op.get("stages", []), "duration": round(time.time() - t0, 1), "svc": op.get("svc", ""), } time.sleep(5) # Таймаут return { "status": "TIMEOUT", "is_successful": False, "error_log": f"TIMEOUT after {timeout}s", "stages": [], "duration": round(time.time() - t0, 1), "svc": "", }