11 KiB
AGENT BRIEFING — app-autotest (2026-07-31, v1.2.23)
Контекст для нового агента. Прочитай этот файл полностью — он заменит тебе чтение 4166 строк истории чата. Здесь всё что нужно знать чтобы продолжить работу.
1. Что такое app-autotest
Flask 3.1 + vanilla JS + PostgreSQL (psycopg2). Веб-приложение для автоматического тестирования сервисов облачной платформы Nubes через REST API.
Ручной режим: выбрать сервис → выбрать операцию (create/modify/delete/suspend/resume/redeploy) → заполнить параметры → запустить → поллинг статуса.
Сценарный режим: последовательность операций с передачей контекста между шагами. Сценарии редактируются через модальный UI, хранятся в БД.
Деплой: Nubes pythonk8s managed service, gunicorn --workers 2.
URL: https://atest.pythonk8s.dev.nubes.ru
Репозиторий: https://gitea.services.ngcloud.ru/forcloud/app-autotest.git (ветка master)
Файлы которые надо прочитать (обязательно)
- DOCS/ARCHITECTURE.md — архитектура, эндпоинты, безопасность
- DOCS/polygon-plan.md — полный план мок-полигона
- HISTORY/2026-07-31-session.md — хронология всего что сделано сегодня
- TASKS/mock-architecture-prompt.md — исходный промпт для Опуса
- TASKS/universal-mock-generator-prompt.md — промпт про STANDS YAML
Структура кода
app-autotest/site/
├── app.py # точка входа (VERSION = "1.2.23")
├── api/
│ ├── auth.py # токен/clientId/stand из JWT cookie
│ ├── http_client.py # HttpClient (requests.Session) + автостенд
│ └── utils.py # find_uid(), uid_from_location()
├── operations/
│ ├── executor.py # ЕДИНЫЙ запуск (create→instanceOperations→params→run)
│ ├── poll.py # poll_until_done() — поллинг до dtFinish
│ ├── scenario.py # run_scenario() — шаги с резолвингом instance_ref
│ ├── terraform.py # send_params_terraform() — нормализация + refSvc + validate-cfs
│ ├── tracker.py # JSON-файловый кеш /tmp/instances-*.json (flock)
│ ├── get_instances.py # GET /instances с пагинацией
│ ├── get_params.py # параметры с ТЕКУЩИМИ значениями из state.params
│ ├── get_services.py # GET /services
│ └── service_list.py # services_{stand}.txt фильтр
├── db/
│ ├── pool.py # ThreadedConnectionPool(1,5)
│ ├── init_db.py # CREATE TABLE + миграции + idx_one_running + seed
│ ├── save_run.py # INSERT в runs + instance_meta JSONB
│ └── scenario_defs.py # CRUD scenario_definitions + lock_check (трёхсостояночный)
├── routes/
│ ├── main.py # GET/POST / — главная страница
│ ├── api_test.py # /api/test, /api/params, /api/log (основная логика)
│ ├── api_scenario_run.py # /api/scenario/run, /api/scenario/status
│ ├── api_scenario_defs.py # CRUD /api/scenario/definitions
│ ├── api_scenario.py # ДУБЛИКАТ? (241 строка)
│ └── api.py # LEGACY /api/run
├── static/
│ ├── app.js, style.css
│ └── js/ (12 файлов: utils, icons, snackbar, views, instances, operations,
│ params-render, history, scenario-list, scenario-form,
│ scenario-create, scenario-edit, scenario-delete)
└── templates/
└── index.html
2. Что было сделано сегодня (2026-07-31)
Версии
- v1.2.16 → v1.2.23 (8 версий)
- 23 коммита в app-autotest, 9 в root autotest
Комментарии ко ВСЕМУ коду
29 файлов, ~6000 строк. Подробные комментарии к каждой функции, каждому if-ветвлению, каждому архитектурному решению. Python + JS.
Аудит безопасности (GPT-5.3-Codex, 3 раунда)
Раунд 1 (11 находок):
- v1.2.19: XSS params, JS injection onclick, polling timeout, has_target, tracker atomic update
- v1.2.20: _op_results lock (threading.Lock), advisory lock (pg_try_advisory_lock), _ensure_schema logging, stale async generation token, validate-cfs JSONDecodeError
Раунд 2 (Codex нашёл 2 критических ошибки в моих фиксах):
- ❌ Advisory lock сломан: брал lock на conn1, unlock на conn2 (другая сессия из пула)
- ❌ escName без
"escape: HTML-атрибут onclick="..." разрывается - v1.2.21: advisory lock → partial unique index
idx_one_running, escName +"
Раунд 3 (3 находки):
- v1.2.22: UniqueViolation→409, escName +
&, lock_check fallback - v1.2.23: трёхсостояночный lock_check (True/False/None→503) после дискуссии
Тесты: app-autotest/tests/ — 5 файлов от Codex (conftest, test_api_scenario_run, test_db_scenario_defs, test_static_regressions, README). Покрывают критические фиксы. НЕ запускались.
Архитектура мок-полигона (Опус)
Концепция: отдельный managed-сервис https://nubes_polygon.pythonk8s.dev.nubes.ru, притворяющийся Nubes API для всех 37 сервисов.
10 архитектурных решений (см. DOCS/polygon-plan.md):
- Отдельный процесс :5001 (не blueprint)
- Data-driven: сервисы из STANDS YAML, не хардкод
- Ленивый dtFinish (без потоков)
- Единая стейт-машина (create→running→suspended→deleted)
- Реальный мерж params при modify
/_mock/resetдля тестов
Универсальный конвертер STANDS YAML — Опус подтвердил: polygon/from_stands.py читает 37 YAML из STANDS/test/resources_yaml/ и генерит конфиги для всех сервисов. Маппинг почти 1:1 (см. HISTORY).
Subresource-операции — create_user/create_database через обычный apply_effect с флагом subresource. Универсально, без сервис-специфичного кода.
3. Что надо делать дальше
🔴 Срочно (сегодня)
Реализовать мок-полигон по плану в DOCS/polygon-plan.md:
Фаза 1 — MVP:
polygon/defaults.py—default_for(dataType)polygon/from_stands.py— конвертер STANDS YAML → polygon configpolygon/state.py—MockState(instances, operations, ленивый dtFinish, apply_effect, reset)polygon/server.py— Flask на порту 5001, префикс/api/v1/svc, Location-заголовкиpolygon/services/— НЕ создавать вручную! Генерится из STANDS- Интеграция в
auth.py— short-circuit localhost (см. §3.3 в polygon-plan.md)
Фаза 2 — полный CRUD:
7. GET /instances, GET /instances/{uid}, GET /services, GET /services/{id}
8. GET /instanceOperations/default/{id} (cfsParams шаблон)
9. apply_effect для всех операций + subresource
10. /_mock/reset
Фаза 3 — тесты:
11. tests/conftest.py — фикстура поднятия мока
12. tests/test_mock_integration.py — 5 сценариев через app_client
🟡 В планах
- Прогнать конвертер на ВСЕХ 37 YAML, найти аномалии
- Исправить
instances.js:78— instanceUid в onclick (низкий риск) - Вынести
_op_resultsв Redis/БД (архитектурное ограничение) - Context snapshot всех инстансов пользователя (идея из HISTORY)
4. Ключевые файлы документации
| Файл | Содержание |
|---|---|
| DOCS/ARCHITECTURE.md | Полная архитектура, эндпоинты Nubes API, безопасность (§8) |
| DOCS/polygon-plan.md | План мок-полигона: 3 фазы, 12 шагов, YAML-спецификация |
| DOCS/architecture-final.md | Финальная архитектура |
| HISTORY/2026-07-31-session.md | Хронология: все версии, аудит, ошибки, дискуссии |
| TASKS/mock-architecture-prompt.md | Исходный промпт для Опуса |
| TASKS/universal-mock-generator-prompt.md | Промпт про STANDS YAML + ответы |
| STANDS/test/resources_yaml/ | 37 YAML — источник для конвертера |
5. Что НЕ надо делать
- ❌ Не деплоить app-autotest без повышения версии
- ❌ Не править код без явного «делай»
- ❌ Не использовать sed для правки файлов
- ❌ Не удалять файлы/БД/контейнеры без разрешения
6. Как запускать
# app-autotest (основное)
cd app-autotest/site && python app.py # порт 5000
# Мок-полигон (когда будет готов)
cd app-autotest && STANDS_DIR=../STANDS/test/resources_yaml python polygon/server.py # порт 5001
# Тесты (когда будут готовы)
NUBES_API_ENDPOINT=http://localhost:5001/api/v1/svc pytest tests/ -v