From 32d1ecc5a39493799b8b2732a688074d4b62dcbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 2 Aug 2026 12:22:14 +0400 Subject: [PATCH] =?UTF-8?q?v0.5.7:=20openapi.json=20=D0=BA=D0=B5=D1=88?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D1=8F=D1=82=D0=B8=20=E2=80=94=2033KB=20=D0=B1?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B3=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B0=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B6=D0=B4=D1=8B=D0=B9=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/config/loader.py | 2 +- site/routes/openapi.py | 14 ++++++++------ tests/test_api.py | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) 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)}"