v1.2.0: unified executor + flexible instance refs + params-render.js

Phase 1 — New modules:
- api/utils.py: find_uid(), uid_from_location() (replaces 2 duplicates)
- operations/poll.py: poll_until_done() (shared sync/async polling)
- operations/executor.py: execute_operation() (single CREATE/non-CREATE flow)

Phase 2 — Format + validation:
- routes/api_scenario_defs.py: _validate_steps with output/instance_ref/instance_uid
- operations/scenario.py: resolve instance_uid > instance_ref > service_id,
  use executor + poll_until_done, persist instance_bindings

Phase 3 — Migration:
- routes/api_test.py: create/non-create through executor, _finish_op through poll_until_done
- db/init_db.py: startup cleanup of stuck scenario_runs (>1h)

Phase 4 — UI shared module:
- static/js/params-render.js: renderParamRow, renderMapFixedRow, collectParams
- static/js/operations.js: use params-render.js (remove duplicates)
- templates/index.html: include params-render.js
- app.py: bump 1.1.57 → 1.2.0
This commit is contained in:
2026-07-31 08:55:06 +04:00
parent 38f58ddbd7
commit 91e97f6f75
11 changed files with 429 additions and 272 deletions
+17
View File
@@ -159,6 +159,23 @@ def init_db():
conn.commit()
cur.close()
print("[DB] Schema initialized", flush=True)
# Startup cleanup: зависшие RUNNING сценарии старше 1 часа → TIMEOUT
try:
cur = conn.cursor()
cur.execute("""
UPDATE scenario_runs
SET status = 'TIMEOUT', error_log = 'worker restart'
WHERE status = 'RUNNING'
AND created_at < NOW() - INTERVAL '1 hour'
""")
if cur.rowcount:
print(f"[DB] Cleaned up {cur.rowcount} stuck scenario_runs", flush=True)
conn.commit()
cur.close()
except Exception as e:
print(f"[DB] Cleanup error: {e}", flush=True)
conn.rollback()
except Exception as e:
print(f"[DB] Init error: {e}", flush=True)
conn.rollback()