diff --git a/site/app.py b/site/app.py index 106c1ea..590c266 100644 --- a/site/app.py +++ b/site/app.py @@ -19,7 +19,7 @@ from routes.api_scenario_run import bp_run as api_scenario_run_bp from routes.api_scenario_defs import bp_defs as api_scenario_defs_bp # Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI. -VERSION = "1.2.15" +VERSION = "1.2.16" app = Flask(__name__, template_folder="templates", static_folder="static") app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc") diff --git a/site/db/init_db.py b/site/db/init_db.py index 295fdad..6426df0 100644 --- a/site/db/init_db.py +++ b/site/db/init_db.py @@ -59,6 +59,7 @@ ALTER TABLE runs ADD COLUMN IF NOT EXISTS user_email VARCHAR(128); ALTER TABLE runs ADD COLUMN IF NOT EXISTS app_version VARCHAR(16); ALTER TABLE runs ADD COLUMN IF NOT EXISTS scenario_run_id INTEGER; ALTER TABLE runs ADD COLUMN IF NOT EXISTS step_number INTEGER; +ALTER TABLE runs ADD COLUMN IF NOT EXISTS instance_meta JSONB; """ # Таблица сценариев — один запуск = одна строка diff --git a/site/db/save_run.py b/site/db/save_run.py index 7f7a6a2..c4aee67 100644 --- a/site/db/save_run.py +++ b/site/db/save_run.py @@ -9,9 +9,10 @@ from db.pool import get_conn, put_conn def save_run(client_id, stand, user_email, svc_id, svc_name, op_name, svc_op_id, op_uid, instance_uid, display_name, status, duration_sec, error_log, params, stages, app_version, - scenario_run_id=None, step_number=None): + scenario_run_id=None, step_number=None, instance_meta=None): """Сохранить один запуск в таблицу runs. - Опционально: scenario_run_id + step_number для шагов сценария.""" + Опционально: scenario_run_id + step_number для шагов сценария. + instance_meta — JSONB с полной информацией об инстансе.""" conn = get_conn() if not conn: print("[DB] save_run SKIP: no connection", flush=True) @@ -23,8 +24,8 @@ def save_run(client_id, stand, user_email, svc_id, svc_name, op_name, svc_op_id, INSERT INTO runs (client_id, stand, user_email, svc_id, svc_name, op_name, svc_op_id, op_uid, instance_uid, display_name, status, duration_sec, error_log, params, stages, app_version, - scenario_run_id, step_number) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + scenario_run_id, step_number, instance_meta) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """, ( client_id, stand, user_email, svc_id, svc_name, op_name, svc_op_id, op_uid, instance_uid, display_name, status, duration_sec, @@ -33,6 +34,7 @@ def save_run(client_id, stand, user_email, svc_id, svc_name, op_name, svc_op_id, json.dumps(stages) if stages else None, app_version, scenario_run_id, step_number, + json.dumps(instance_meta) if instance_meta else None, )) conn.commit() cur.close() diff --git a/site/operations/scenario.py b/site/operations/scenario.py index d5ad2aa..f059c47 100644 --- a/site/operations/scenario.py +++ b/site/operations/scenario.py @@ -177,12 +177,23 @@ def run_scenario(client, steps, client_id, stand, user_email, app_version, scena # 7. Сохранить финальный результат try: + # Получить полную информацию об инстансе + instance_meta = None + try: + inst_data = client.get(f"/instances/{instance_uid}") + inst = inst_data.get("instance", {}) if isinstance(inst_data, dict) else {} + if inst: + instance_meta = {k: v for k, v in inst.items() + if k not in ('instanceUid', 'displayName', 'svc', 'serviceId', 'explainedStatus')} + except Exception: + pass save_run(client_id, stand, user_email, svc_id, svc_final, op_name, svc_op_id, op_uid, instance_uid, step_display, step_status, step_duration, step_error, resolved_params, step_stages, app_version, - scenario_run_id, step_num) + scenario_run_id, step_num, + instance_meta=instance_meta) except Exception as e: print(f"[SCENARIO] save_run failed for step {step_num}: {e}", flush=True) diff --git a/site/routes/api_test.py b/site/routes/api_test.py index 8563e7e..6237eef 100644 --- a/site/routes/api_test.py +++ b/site/routes/api_test.py @@ -319,6 +319,16 @@ def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_ # Сохранить в БД try: from db.save_run import save_run + # Получить полную информацию об инстансе + instance_meta = None + try: + inst_data = client.get(f"/instances/{instance_uid}") + inst = inst_data.get("instance", {}) if isinstance(inst_data, dict) else {} + if inst: + instance_meta = {k: v for k, v in inst.items() + if k not in ('instanceUid', 'displayName', 'svc', 'serviceId', 'explainedStatus')} + except Exception: + pass saved_params = redact_params(params or {}) save_run(client_id, stand, user_email, svc_id, poll_result["svc"], op_name, svc_op_id, @@ -326,7 +336,8 @@ def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_ poll_result["status"], poll_result["duration"], poll_result["error_log"], - saved_params, poll_result["stages"], app_version) + saved_params, poll_result["stages"], app_version, + instance_meta=instance_meta) except Exception as e: import traceback print(f"[DB] save_run FAILED: {e}", flush=True)