From cd06040d62685ec4026c79e058a173403f889508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 3 Aug 2026 08:50:21 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20HISTORY=20=E2=80=94=20=D1=84=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=202:=20=D1=81=D0=B5=D0=BB=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=20=D0=B8=20=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-03-session.md | 95 +++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 HISTORY/2026-08-03-session.md diff --git a/HISTORY/2026-08-03-session.md b/HISTORY/2026-08-03-session.md new file mode 100644 index 0000000..90fc87e --- /dev/null +++ b/HISTORY/2026-08-03-session.md @@ -0,0 +1,95 @@ +# 2026-08-03-session — Полигон: интеграция, баг с сервисами + +## Контекст + +Сессия началась с чтения двух файлов AI-агентом: +- `AGENT_BRIEFING.md` — контекст app-autotest (v1.2.28) +- `polygon-docs/POLYGON-FULL.md` — полное описание полигона (v0.5.9) + +jsonEnv автотеста на проде: +```json +{ + "POLYGON_ENDPOINT": "https://polygon.pythonk8s.dev.nubes.ru/api/v1/svc", + "NUBES_API_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" +} +``` + +## Архитектурное решение: разделение сервисы/инстансы + +**Зафиксировано (2026-08-03):** + +| Режим | Сервисы (метаданные) | Инстансы | +|--------|---------------------|-----------| +| Без полигона | Реальный API | Реальное облако | +| С полигоном | Реальный API | Виртуальные (полигон) | + +`POLYGON_ENDPOINT` подменяет ТОЛЬКО инстансы/операции. Сервисы — это «справочник», всегда из реального API. + +### Где это в коде + +`auth.py:_make_client(use_polygon)`: +- `use_polygon=True` → `get_client()`: если `POLYGON_ENDPOINT` задан → полигон, иначе → `NUBES_API_ENDPOINT` +- `use_polygon=False` → `get_real_client()`: **всегда** `NUBES_API_ENDPOINT` + +## Баг: «нет сервисов» при POLYGON_ENDPOINT + +### Причина + +Цепочка: +1. `get_stand()` → `"polygon"` (auth.py:141, POLYGON_ENDPOINT задан) +2. `load_service_ids("polygon")` → `services_polygon.txt` не существует → пустой `set` +3. `sorted(пустой_set)` → `[]` +4. Шаблон `index.html:81`: `{% if svc.svcId in config.service_ids %}` → `svc.svcId in []` → **всегда False** → ни один сервис не показывается + +Хотя `get_real_client()` корректно получает сервисы из реального API, фильтр в шаблоне убивает весь список. + +### Исправление (v1.2.29) + +Шаблон `index.html:81`: добавить `or not config.service_ids`: + +```jinja2 +{# Было #} +{% if svc.svcId in config.service_ids %} + +{# Стало #} +{% if not config.service_ids or svc.svcId in config.service_ids %} +``` + +Это соответствует изначальному замыслу `load_service_ids`: «пустой set → показываем все». + +--- + +## Фаза 2: селектор режима и стенда (v1.2.30) + +### Требования + +1. **Селектор режима** над версией: 🎭 Эмуляция / ☁️ Облако (только если POLYGON_ENDPOINT задан) +2. **Селектор стенда** (DEV/TEST/PROD) — только в режиме эмуляции +3. **По умолчанию:** эмуляция + TEST +4. **В эмуляции:** токен дезактивирован +5. **В облаке:** стенд автоопределяется по токену (как раньше) +6. При смене режима/стенда → сервисы обновляются + +### Новая архитектура + +| Режим | Сервисы | Инстансы | Стенд | +|--------|---------|----------|-------| +| Эмуляция | Полигон (/{stand}/api/v1/svc) | Полигон | Выбор (dev/test/prod) | +| Облако | Реальный API | Реальный API | Авто (токен→dev/test) | + +В эмуляции **всё** идёт в полигон — и сервисы, и инстансы. Полигон имеет полный набор эндпоинтов (/services, /instances, /instanceOperations). + +`get_real_client()` упраздняется — становится алиасом `get_client()`. + +### Cookie + +- `mode` — `"polygon"` (по умолчанию) или `"cloud"` +- `polygon_stand` — `"test"` (по умолчанию), `"dev"`, `"prod"` + +### Изменённые файлы + +1. **`auth.py`** — новые функции `get_mode()`, `get_polygon_stand()`; `get_token()` в режиме полигона только env-токен; `get_client()` строит URL с префиксом стенда; `get_real_client()` → алиас +2. **`main.py`** — `action=set_mode` (cookie), single `get_client()` вместо real_client/inst_client, переменные `mode`/`polygon_stand`/`polygon_enabled` +3. **`index.html`** — селекторы над версией, disable токена в эмуляции +4. **`service_list.py`** — обрезать `polygon_` префикс +5. **`api_test.py`** — `get_real_client()` → `get_client()`