diff --git a/site/config/loader.py b/site/config/loader.py index 5dc0c37..6d8d52d 100644 --- a/site/config/loader.py +++ b/site/config/loader.py @@ -80,7 +80,7 @@ SERVICES = _DF["SERVICES"] OPS_INDEX = _DF["OPS_INDEX"] DELAY = float(os.getenv("MOCK_OP_DELAY", "0.1")) -VERSION = "0.5.6" +VERSION = "0.5.7" def get_services(stand_id): diff --git a/site/routes/openapi.py b/site/routes/openapi.py index 5a912b3..309916d 100644 --- a/site/routes/openapi.py +++ b/site/routes/openapi.py @@ -19,6 +19,9 @@ bp = Blueprint("openapi", __name__, url_prefix="/api/v1/svc") # URL для сервера — из env или автоопределение _SERVER_URL = os.getenv("POLYGON_ENDPOINT", "https://polygon.pythonk8s.dev.nubes.ru") +# Кеш спеки — генерится один раз, не на каждый запрос +_SPEC_CACHE = None + def _build_servers(): """Список серверов — по одному на каждый стенд.""" @@ -33,12 +36,11 @@ def _build_servers(): @bp.route("/openapi.json", methods=["GET"]) def openapi_spec(): - """GET /api/v1/svc/openapi.json — OpenAPI 3.1.0 спецификация. - - Возвращает полную спецификацию всех эндпоинтов полигона. - Динамически добавляет схемы параметров для каждого загруженного сервиса. - """ - return jsonify(_build_spec()) + """GET /api/v1/svc/openapi.json — OpenAPI 3.1.0 спецификация (кешируется).""" + global _SPEC_CACHE + if _SPEC_CACHE is None: + _SPEC_CACHE = _build_spec() + return jsonify(_SPEC_CACHE) def _build_spec(): diff --git a/tests/test_api.py b/tests/test_api.py index 6d11884..eba74e4 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -371,7 +371,7 @@ def test_stands_isolated(): t("Изоляция: каждый стенд — свои инстансы", test_stands_isolated) def test_stands_openapi(): - r = requests.get(f"{BASE}/api/v1/svc/openapi.json") + r = requests.get(f"{BASE}/api/v1/svc/openapi.json", timeout=30) spec = js(r) servers = [s["url"] for s in spec["servers"]] assert len(servers) == 3, f"expected 3 servers, got {len(servers)}"