v1.2.1: fix tracker_add in executor + labelCls + descr context + script order

Opus review fixes:
- executor.py: tracker_add inside executor after instance_uid, before params/run (A3, orphan protection)
- executor.py: descr parameter (version/context instead of hardcoded)
- api_test.py: pass client_id/stand/descr, remove duplicate tracker_add
- scenario.py: pass client_id/stand/descr with scenario context
- params-render.js: fix labelCls ReferenceError in renderMapFixedRow (pre-existing bug)
- index.html: params-render.js already before operations.js (verified)
This commit is contained in:
2026-07-31 09:45:05 +04:00
parent 91e97f6f75
commit 353e07bfa8
5 changed files with 24 additions and 13 deletions
+15 -2
View File
@@ -2,15 +2,18 @@
Единый executor операции Nubes.
Делает всё до /run включительно. НЕ поллит.
Вызывает tracker_add для create сразу после получения instance_uid (защита от сирот).
Используется api_test.py (ручной) и scenario.py (сценарный).
"""
from api.utils import find_uid, uid_from_location
from operations.terraform import send_params_terraform
from operations.tracker import add as tracker_add
def execute_operation(client, service_id, operation, instance_uid, params,
svc_op_id=None, display_name=None):
svc_op_id=None, display_name=None, descr=None,
client_id="", stand=""):
"""Запустить операцию и вернуть результат.
Args:
@@ -21,6 +24,9 @@ def execute_operation(client, service_id, operation, instance_uid, params,
params: dict — {numeric_param_id: value}
svc_op_id: int|None — svcOperationId (игнорируется для create)
display_name: str|None — displayName (только для create)
descr: str|None — описание инстанса
client_id: str — для tracker_add
stand: str — для tracker_add
Returns:
dict {ok, error, failed_step, instance_uid, op_uid, display_name}
@@ -32,7 +38,8 @@ def execute_operation(client, service_id, operation, instance_uid, params,
if is_create:
if not display_name:
display_name = f"autotest-{service_id}"
descr = f"created by autotest"
if not descr:
descr = "created by autotest"
payload = {"serviceId": service_id, "displayName": display_name, "descr": descr}
try:
resp = client.post("/instances", payload)
@@ -44,6 +51,12 @@ def execute_operation(client, service_id, operation, instance_uid, params,
return {"ok": False, "error": "No instanceUid in response", "failed_step": "instances",
"instance_uid": None, "op_uid": None, "display_name": display_name}
# tracker_add СРАЗУ после instance_uid, до params/run — защита от сирот
try:
tracker_add(client_id, stand, instance_uid, service_id, display_name)
except Exception:
pass # не ронять операцию из-за трекера
# --- Шаг 2: POST /instanceOperations ---
if is_create:
op_payload = {"instanceUid": instance_uid, "operation": operation}