doc: HISTORY — фаза 2: селектор режима и стенда
This commit is contained in:
@@ -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()`
|
||||
Reference in New Issue
Block a user