137 lines
8.1 KiB
Markdown
137 lines
8.1 KiB
Markdown
# 2026-07-31 — Сессия (v1.1.57 → v1.2.1)
|
||
|
||
## Контекст
|
||
Обсуждение архитектуры: унификация ручного и сценарного режимов, гибкие ссылки на инстансы, новый UI редактора сценариев.
|
||
|
||
## Agent consultations
|
||
|
||
### Промпт для Opus
|
||
Составлен `DOCS/opus-architecture-prompt.md` — полное описание проекта, дублирование CREATE-флоу, ограничение instance_map, вопросы по архитектуре.
|
||
|
||
### Ответ Opus — 19 уточняющих вопросов
|
||
|
||
**A. Единый executor (operations/executor.py)**
|
||
1. Граница ответственности: executor делает всё до /run, поллинг — снаружи?
|
||
2. Обработка ошибок: исключения с типом или dict {ok, error, failed_step}?
|
||
3. Трекер: вызывать tracker_add внутри executor для create? Нужны ли сценарные инстансы в трекере?
|
||
4. _finish_op: остаётся в api_test.py или выносим в общий модуль поллинга?
|
||
|
||
**B. Гибкие ссылки на инстансы**
|
||
5. Приоритет резолвинга: instance_uid > instance_ref > (для create — новый)
|
||
6. Где хранить output→uid: в памяти (instance_map) или в scenario_runs.instance_bindings?
|
||
7. Валидация _validate_steps: проверять ссылки на output, уникальность, обязательность
|
||
8. Обратная совместимость: поддерживать старый формат (service_id) или мигрировать?
|
||
|
||
**C. Схема БД**
|
||
9. Формат в steps JSONB без изменений схемы? (подтверждено)
|
||
10. Использовать существующую колонку scenario_runs.instance_bindings?
|
||
|
||
**D. UI редактора**
|
||
11. Модал vs inline — рекомендация: модал на весь экран
|
||
12. Переиспользовать renderParamRow из operations.js в общем модуле?
|
||
13. Pre-fill параметров: авто или по кнопке?
|
||
14. Формат параметров: символические имена в БД (как сейчас) или иное?
|
||
|
||
**E. Оптимизация**
|
||
15. Вынести _find_uid/_uid_from_location в общий utils
|
||
16. Механизм восстановления зависших scenario_runs?
|
||
17. Ограничение lock_check: только один RUNNING сценарий — осознанное?
|
||
18. _op_results в памяти → мигрировать в БД/Redis?
|
||
19. Приоритет: бэкенд или UI редактора в первую очередь?
|
||
|
||
## Ключевые решения (отвечено DeepSeek)
|
||
|
||
**A. Executor:**
|
||
- A1. Граница: до /run включительно, без поллинга. Возвращает {instance_uid, op_uid, display_name}
|
||
- A2. Ошибки: dict {ok, error, failed_step}, не исключения
|
||
- A3. Трекер: да, tracker_add внутри executor для всех create
|
||
- A4. _finish_op: оставить в api_test.py, цикл поллинга → operations/poll.py
|
||
|
||
**B. Ссылки:**
|
||
- B5. Приоритет: instance_uid > instance_ref > новый create
|
||
- B6. Хранение: память + scenario_runs.instance_bindings
|
||
- B7. Валидация: проверять ссылки, уникальность, обязательность
|
||
- B8. Совместимость: оба формата, без миграции, fallback на service_id
|
||
|
||
**C. БД:**
|
||
- C9. Без изменений схемы
|
||
- C10. Использовать instance_bindings
|
||
|
||
**D. UI:**
|
||
- D11. Модал на весь экран
|
||
- D12. Общий модуль params-render.js
|
||
- D13. Авто pre-fill, все параметры с defaults
|
||
- D14. Символические имена в БД
|
||
|
||
**E. Оптимизация:**
|
||
- E15. _find_uid → api/utils.py
|
||
- E16. Startup check: TIMEOUT для зависших >1ч
|
||
- E17. lock_check оставить
|
||
- E18. _op_results не в scope
|
||
- E19. Порядок: executor → формат → api_test/scenario → UI
|
||
|
||
### Финальный план (Опус, утверждён)
|
||
|
||
Сохранён в `DOCS/opus-plan-2026-07-31.md`. Ветка: `opus-architecture-2026-07-31`.
|
||
|
||
**4 фазы, 13 шагов:**
|
||
|
||
**Фаза 1 — Общие модули:**
|
||
- `api/utils.py` (NEW) — find_uid(), uid_from_location()
|
||
- `operations/poll.py` (NEW) — poll_until_done()
|
||
- `operations/executor.py` (NEW) — execute_operation() до /run, без поллинга
|
||
|
||
**Фаза 2 — Формат шагов:**
|
||
- `routes/api_scenario_defs.py` — _validate_steps с output/instance_ref/instance_uid
|
||
- `operations/scenario.py` — резолвинг instance_uid > instance_ref > service_id
|
||
|
||
**Фаза 3 — Миграция вызывающих:**
|
||
- `routes/api_test.py` — CMDB delete early return, остальное через executor
|
||
- `operations/scenario.py` — через executor + poll_until_done
|
||
- `db/init_db.py` — startup cleanup зависших scenario_runs
|
||
|
||
**Фаза 4 — UI редактора:**
|
||
- `static/js/params-render.js` (NEW) — общий рендер параметров
|
||
- `static/js/operations.js` — использовать params-render.js
|
||
- `static/js/scenario-form.js` — модальный редактор
|
||
- `templates/index.html` — разметка модала
|
||
|
||
### CMDB delete
|
||
Жёсткое удаление через `DELETE cmdb-api.deck.nubes.ru/instances/{uid}` (без авторизации).
|
||
Нужно для недосозданных инстансов (not created). Остаётся в api_test.py, не в executor.
|
||
Добавлено после переписки с Георгием Родионовым 29.07.2026.
|
||
|
||
## Реализация (v1.2.0 — v1.2.1)
|
||
|
||
### v1.2.0 — Unified executor + flexible refs
|
||
**Новые файлы:** api/utils.py, operations/poll.py, operations/executor.py, static/js/params-render.js
|
||
**Изменено:** api_test.py (через executor + poll), scenario.py (output/ref/bindings), api_scenario_defs.py (_validate_steps), init_db.py (cleanup), operations.js (→ params-render), index.html (load order)
|
||
- Дублирование CREATE-флоу устранено: ручной и сценарный → один executor
|
||
- instance_uid > instance_ref > service_id (гибкие ссылки)
|
||
- Общий поллинг poll_until_done()
|
||
- +254 / −277 строк (меньше кода)
|
||
|
||
### v1.2.1 — Opus review fixes
|
||
**Критическое:** tracker_add внутрь executor (защита от сирот, A3)
|
||
**Исправлено:** labelCls в renderMapFixedRow, descr с контекстом, порядок скриптов
|
||
**5 файлов:** executor.py, api_test.py, scenario.py, params-render.js, app.py
|
||
|
||
### Проверка в поде (v1.2.1)
|
||
- Все 4 новых файла на месте
|
||
- 11 JS → 200, порядок правильный
|
||
- Schema OK, seed OK, API отвечает
|
||
|
||
## Что дальше
|
||
|
||
**Фаза 4 — модальный редактор сценариев (✅ v1.2.2-v1.2.4):**
|
||
- ✅ Модал с дропдаунами сервисов/операций
|
||
- ✅ output/instance_ref с облачными инстансами
|
||
- ✅ Кнопки CRUD крупнее, справка «📖 Как заполнять»
|
||
|
||
**Фаза 5 — редактор параметров (план от Опус, НЕ РЕАЛИЗОВАНО):**
|
||
- Заменить ручной key=value на автоподгрузку через params-render.js
|
||
- Параметры в свёрнутом `<details>` внутри карточки шага
|
||
- Хранение: символические имена в БД, обратный маппинг numeric→name при сохранении
|
||
- Снапшот параметров перед ре-рендером (защита от потери правок)
|
||
- 3 развилки решены: без ссылок на output в параметрах, всегда шаблон, полный сброс при смене операции
|