Files
app-autotest/DOCS/HISTORY.md
T

93 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# История разработки app-autotest
## v1.0.58 (27.07.2026) — version bump
- Поднята версия проекта до `1.0.58`.
- Синхронизированы заголовки в `site/app.py` и `DOCS/ARCHITECTURE.md`.
## v1.0.57 (27.07.2026) — UI hardening + history sync
### Что изменилось
- В `site/templates/index.html` финальное состояние кнопки вынесено в `setFinishedState()`, чтобы не держать логику завершения операции в двух местах.
- После завершения операции кнопка «Готово» теперь гарантированно сбрасывает обработчик через `btn.onclick = null`.
- Повторный CREATE через старый обработчик больше не воспроизводится.
- `displayName` больше не теряется в нормальном сценарии завершения CREATE.
- В `site/app.py` версия поднята до `1.0.57`.
- В `DOCS/ARCHITECTURE.md` отмечено закрытие бага с повторным CREATE и синхронизирован статус по `displayName`.
### Зачем это было сделано
- Убрать хрупкость вокруг состояния кнопки после завершения операции.
- Привести документацию и версию к текущему состоянию кода.
## 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)