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