v0.5.0: 3 стенда — изоляция состояния, WSGI middleware, OpenAPI server selector, POLYGON_STANDS env
- loader.py: STANDS dict, get_services/get_ops_index per stand, POLYGON_STANDS env
- mock_state.py: get_state(stand_id) — ленивая инициализация
- app.py: StandMiddleware — перезапись PATH_INFO до Flask-роутинга
- Все роуты: LocalProxy(state), LocalProxy(SERVICES/OPS_INDEX) через g.stand_id
- openapi.py: _build_servers() — по одному серверу на стенд
- services/stand{1,2,3}/ — 37 YAML на стенд из STANDS/dev и STANDS/test
- tests/test_api.py: +4 multi-stand теста (изоляция, fail-next, OpenAPI servers)
- Обратная совместимость: /api/v1/svc/... → стенд по умолчанию
This commit is contained in:
+15
-7
@@ -20,6 +20,17 @@ bp = Blueprint("openapi", __name__, url_prefix="/api/v1/svc")
|
||||
_SERVER_URL = os.getenv("POLYGON_ENDPOINT", "https://polygon.pythonk8s.dev.nubes.ru")
|
||||
|
||||
|
||||
def _build_servers():
|
||||
"""Список серверов — по одному на каждый стенд."""
|
||||
servers = []
|
||||
for sid in _cfg.list_stands():
|
||||
servers.append({
|
||||
"url": f"{_SERVER_URL}/{sid}",
|
||||
"description": f"Стенд: {sid}",
|
||||
})
|
||||
return servers
|
||||
|
||||
|
||||
@bp.route("/openapi.json", methods=["GET"])
|
||||
def openapi_spec():
|
||||
"""GET /api/v1/svc/openapi.json — OpenAPI 3.1.0 спецификация.
|
||||
@@ -56,18 +67,15 @@ def _build_spec():
|
||||
"- Управляемый сброс через `/_mock/reset`\n"
|
||||
"- Симуляция ошибок через `/_mock/fail-next`\n\n"
|
||||
"### Авторизация\n"
|
||||
f"Bearer-токен: `test-token-123` (настроен через `MOCK_AUTH_TOKEN`)"
|
||||
"- Основные эндпоинты — без авторизации\n"
|
||||
"- `_mock/*` — заголовок `X-Mock-Auth: test-token-123` "
|
||||
"(настроен через `MOCK_AUTH_TOKEN`)"
|
||||
),
|
||||
"contact": {
|
||||
"name": "Nubes Platform",
|
||||
},
|
||||
},
|
||||
"servers": [
|
||||
{
|
||||
"url": _SERVER_URL,
|
||||
"description": "Polygon (mock)",
|
||||
},
|
||||
],
|
||||
"servers": _build_servers(),
|
||||
"security": [],
|
||||
"tags": [
|
||||
{"name": "services", "description": "Сервисы (каталог)"},
|
||||
|
||||
Reference in New Issue
Block a user