3.5 KiB
3.5 KiB
Sol — ответы по редактору сценариев
Дата: 2026-07-30
1. Структура steps
- JSONB массив, отдельная таблица не нужна
- Обязательно поле
resource— идентификатор инстанса внутри сценария (для связи create→modify→delete) scenario_definitions: +version INTEGER,updated_by,is_active/deleted_at, уникальность имени case-insensitivescenario_runs: +definition_id,definition_version,steps_snapshot- Runner работает со snapshot, не перечитывает определение
2. Параметры в редакторе
- Из Nubes API: сервис→операции→
/instanceOperations/default/{opId}→коды - Выпадающий список с типом, обязательностью, default
- Map/array — JSON-строка с валидацией
- Кеш: браузерный на время сессии редактора ИЛИ серверный (stand+opId, TTL 5 мин)
- Свободный ввод кода не нужен
3. Seed из config.yaml
- Не импортировать при каждом пустом старте
- Схема: marker импорта →
INSERT ON CONFLICT DO NOTHING→ markerscenario_seed_v1=completed - YAML вынести в
scenario_seed.yaml, после rollout удалить - Остальной config.yaml не трогать
4. UI редактор
- Модальное окно или боковая панель (не inline)
- Имя, список шагов, сервис, операция, параметры
- Кнопки добавить/удалить/вверх/вниз
- Drag-and-drop не нужен
- Мягкое удаление:
is_active=false
5. Валидация
- При сохранении: структура, существование сервиса, доступность операции, коды параметров, типы, уникальность resource, порядок (create→modify→delete, после delete ничего)
- При запуске: повторить по актуальному API
- Невалидный сценарий не запускать частично
6. Критически упущенное
POST /api/scenario/runне возвращает run ID — гонка при двух запусках. Создавать запись ДО thread, вернуть HTTP 202 + run_id- Нужен
GET /api/scenario/runs/<id>— поллинг конкретного запуска save_run()не пишетscenario_run_idиstep_number— шаги не связаны со сценарием- TIMEOUT:
op_dataможет быть неинициализирована - Шаг нужно создавать в
runsсо статусом RUNNING ДО обращения к API, потом обновлять - Блокировка параллельных запусков: HTTP 409 для одного client_id+stand
- CRUD: проверять
client_id+standпри всех операциях versionв definitions: PUT с текущей version, 409 при конфликте- Runner использует персональный токен — нужен сервисный токен/клиент по stand
- Имя не идентификатор: API запуска принимает
definition_id, имя — редактируемое поле