doc: HISTORY — фаза 2: селектор режима и стенда

This commit is contained in:
2026-08-03 08:50:21 +04:00
parent af2cede717
commit cd06040d62
+95
View File
@@ -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()`