# История разработки app-autotest ## v1.0.54 (27.07.2026) — Аудит #3: 4 бага исправлено ### Баг #1: `_client()` не автоопределял стенд (КРИТИЧЕСКИЙ) - **Где:** `api_test.py:_client()` — использовал `current_app.config["NUBES_API_ENDPOINT"]` (raw env var) - **Симптом:** main.py автоопределял стенд для главной, но POST /api/test падал с 401 если токен от другого стенда - **Исправление:** `detect_endpoint()` вынесен в `api/http_client.py`, используется в `_client()` - **Как пропустили:** анализировал main.py и api_test.py в изоляции, не сравнил ### Баг #2: `_find_uid()` возвращал не тот UUID (КРИТИЧЕСКИЙ) - **Где:** `api_test.py:_find_uid()` — итерировал по ВСЕМ значениям dict, искал 36-символьную строку - **Симптом:** `/instanceOperations` возвращает оба `instanceUid` + `instanceOperationUid`, функция брала первый попавшийся → `run` шёл на неправильный URL - **Исправление:** ищет по конкретным ключам: `instanceOperationUid` → `instanceUid` → `uid` → `Uid` - **Как пропустили:** не проверил реальный формат ответа API ### Баг #3: Сироты при ошибке params (СРЕДНИЙ) - **Где:** `api_test.py`: порядок — `POST /instances` → `POST /instanceOperations` → params loop → `tracker_add` - **Симптом:** если params падает — инстанс и операция созданы в Nubes, трекер пуст → сироты - **Исправление:** `tracker_add` вызывается ДО params loop, сразу после получения `instanceUid` - **Как пропустили:** не трассировал линейно порядок вызовов ### Баг #4: `flock` без таймаута (НИЗКИЙ) - **Где:** `tracker.py:_locked_read/_write` — `fcntl.flock(fd, LOCK_EX)` без LOCK_NB - **Симптом:** при зависшем процессе с локом все воркеры блокируются навсегда - **Исправление:** `_acquire_lock()` с `LOCK_EX | LOCK_NB` + retry до 2 секунд - **Как пропустили:** новый код flock не перечитал с нуля после добавления ### Архитектурное: `detect_endpoint` вынесен в http_client.py - Раньше был в main.py → недоступен для api_test.py - Теперь в `api/http_client.py` → оба модуля используют --- ## v1.0.53 (27.07.2026) — Файловый трекер с fcntl.flock - In-memory dict заменён на `/tmp/instances.json` с `fcntl.LOCK_EX` - Multi-worker gunicorn: все воркеры читают/пишут один файл под локом ## v1.0.52 (27.07.2026) — `_tmpl()` helper - Все переменные шаблона передаются во всех трёх return-путях index() - Исправлен UndefinedError при «Выйти» ## v1.0.51 (27.07.2026) — Автоопределение стенда + UnboundLocalError - `detect_endpoint()` в main.py: пробует токен против dev и test API - `instance_groups = {}` инициализирован до if - `_finish_op` обёрнут в полный try/except ## v1.0.50 (27.07.2026) — showStages + api_operations fix - `showStages()`: dtFinish вместо isSuccessful для ⏳/✅/❌ - `api_operations()`: не фильтровать "not created", добавлять tracked-сирот ## v1.0.49 (27.07.2026) — In-memory tracker + refreshInstances - Трекер: in-memory dict вместо файла `/tmp/instances.json` - `refreshInstances()` добавляет новые инстансы в DOM (не только бейджи) - `selectService()` заменён на `refreshInstances()` после OK ## v1.0.48 (27.07.2026) — tracker_add синхронно - `tracker_add` в `api_test()` до `threading.Thread` - Лог `is_ok` в `_finish_op` - Flexbox-кнопки горизонтально ## v1.0.47 (27.07.2026) — displayName fix - displayName захватывается до очистки формы - tracker_add до _op_results[OK] - autotest-1 в _INITIAL ## v1.0.46 (27.07.2026) — _finish_op signature - Добавлены op_name, svc_op_id в _finish_op() ## v1.0.45 и ранее - Базовый CREATE/MODIFY/SUSPEND/DELETE/RESUME/REDEPLOY - UI с этапами, поллинг, params форма - Множественные баги CREATE flow (документированы в DOCS/api-create-flow.md)