From 7dd62c365add0e11f9957c54dd8f22eacbd9a160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 31 Jul 2026 19:01:39 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B3=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BE=D1=80=20=D0=BC=D0=BE=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=B7=20STANDS=20YAML:=20=D0=B2=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=B8=D0=BA=D1=82=20=D0=9E=D0=BF=D1=83=D1=81=D0=B0=20(=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=2037=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2),=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BF=D0=BF=D0=B8=D0=BD=D0=B3,=20=D0=B0=D0=BB?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC,=20=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-07-31-session.md | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/HISTORY/2026-07-31-session.md b/HISTORY/2026-07-31-session.md index 6d4c1e3..e93c6ab 100644 --- a/HISTORY/2026-07-31-session.md +++ b/HISTORY/2026-07-31-session.md @@ -445,3 +445,50 @@ app-autotest/ | 863 | *—* | array | Для мока коды некритичны (мок сам отдаёт и шаблон и state.params — они должны совпадать между собой). Для реалистичности — код в `mock-architecture-prompt.md` достанет полные коды одной строкой Python. + +--- + +## Универсальный генератор моков из STANDS YAML (Опус, 2026-07-31) + +### Вердикт: универсальный конвертер возможен для всех 37 сервисов + +Опус изучил 6 STANDS YAML (dummy, postgres, k8s, mariadb, VM v2, vDC). +Структура единообразна — генерятся одним приложением. +STANDS — авторитетный источник (сверен с HAR: create=18, параметры совпадают 1:1). + +### Ключевой маппинг STANDS → polygon + +| STANDS | Polygon | Тип | +|--------|---------|-----| +| `service_id`→`serviceId`, `service_short_name`→`svcShort` | 1:1 | +| `operations[].id/name/action` → `svcOperationId/operation/isCreate` | 1:1 | +| `params[].id/code/default/required` → `svcOperationCfsParamId/svcOperationCfsParam/defaultValue/isRequired` | 1:1 | +| `params[].data_type` → `dataType` | `html.unescape` | +| `params[].sub_params` (list) → `dataDescriptor` (dict по code) | трансформация | +| `operations[].kind: subresource` → `stateOut[plural(subresource)]` | трансформация | +| `name/service_man/lifecycle/outputs/func/descr/man/sort` | игнор | + +### Алгоритм convert_one() + +1. Базовые поля + операции (фильтр `kind: instance/action`) +2. `cfsParams` из create-параметров: unescape, sub_params→dataDescriptor (рекурсивно), default→`default_for(dataType)` +3. `stateParams`: scalar→строка, map-fixed→`json.dumps({sub_key: sub_val})` +4. `stateOut`: subresource-операции → `{plural(subresource): {}}` + +### 4 границы универсальности + +1. **Контент stateOut** — структура (users/databases) генерится, имена (pgadmin/mydb) — нет. Решение: мок реализует subresource-операции +2. **redeploy не у всех** — конвертер включает что есть +3. **Динамический valueList** (`func: getAvailableResourceRealms`) — берём статический +4. **Битые valueList** — pass-through + +### Архитектура `polygon/from_stands.py` + +``` +convert_all(stands_dir) → dict[int, config] + convert_one(raw) → config + _map_param, _build_dd, _gen_state_params, _gen_state_out +``` + +Поток: `STANDS/*.yaml` → `yaml.safe_load` → `convert_one` → MockState. +Вызывается при СТАРТЕ полигона. Ручные YAML (`polygon/services/`) больше не нужны.