v1.0.54: fix 4 audit bugs — _client auto-detect, _find_uid by key, tracker_add before params, flock LOCK_NB
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
# История разработки 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)
|
||||
Reference in New Issue
Block a user