From 42acdceebd485bc811ed3e8b2c2e6f8ff38f2e0b Mon Sep 17 00:00:00 2001 From: kavehtoyser Date: Mon, 29 Jun 2026 18:49:44 +0200 Subject: [PATCH] Fix logs export/search: drop invalid tail=all from full_url The logs view built full_url with tail=all, but the /services/~logs and /logs/stream endpoints type tail as Optional[int], so FastAPI rejected "all" with a 422. The export and search features (both fetch FULL_URL) saved/searched that error JSON instead of the log. Omit tail entirely so the endpoint receives None; the runtime connector already maps a falsy tail to Docker's "all" (whole log). Guard tests updated to assert full_url carries no tail and that tail=all is absent. Co-Authored-By: Claude Opus 4.8 --- manager/routers/logging_api.py | 2 +- manager/routers/service_api.py | 2 +- tests/manager_test/test_ui_redesign.py | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/manager/routers/logging_api.py b/manager/routers/logging_api.py index d57eaa3..5cb60d7 100644 --- a/manager/routers/logging_api.py +++ b/manager/routers/logging_api.py @@ -69,7 +69,7 @@ def manager_logs_view(request: Request): "title": "manager", "subtitle": f"v: {get_manager_version()}", "stream_url": "/logs/stream?follow=true&tail=400", - "full_url": "/logs/stream?tail=all", + "full_url": "/logs/stream", "export_basename": "manager", "manager_version": get_manager_version(), }, diff --git a/manager/routers/service_api.py b/manager/routers/service_api.py index 80eceb6..5d6ec42 100644 --- a/manager/routers/service_api.py +++ b/manager/routers/service_api.py @@ -340,7 +340,7 @@ def service_logs_view(request: Request, name: str, version: str): "title": name, "subtitle": f"v{version}", "stream_url": f"{base}&follow=true&tail=200", - "full_url": f"{base}&tail=all", + "full_url": base, "export_basename": f"{name}_v{version}", "manager_version": get_manager_version(), }, diff --git a/tests/manager_test/test_ui_redesign.py b/tests/manager_test/test_ui_redesign.py index e754f71..a1e953a 100644 --- a/tests/manager_test/test_ui_redesign.py +++ b/tests/manager_test/test_ui_redesign.py @@ -144,14 +144,18 @@ def test_logs_view_is_full_bleed(): def test_service_logs_view_full_url_and_basename(test_client_logged_in): r = test_client_logged_in.get("/services/~logs/view?name=demo&version=0.1.0") assert r.status_code == 200 - assert "/services/~logs?name=demo&version=0.1.0&tail=all" in r.text + # full_url omits tail so the endpoint receives tail=None -> Docker "all". + # Passing the literal tail=all 422s (the param is typed int). + assert '"/services/~logs?name=demo&version=0.1.0"' in r.text + assert "tail=all" not in r.text assert 'EXPORT_BASENAME = "demo_v0.1.0"' in r.text def test_manager_logs_view_full_url_and_basename(test_client): r = test_client.get("/logs/view") assert r.status_code == 200 - assert "/logs/stream?tail=all" in r.text + assert '"/logs/stream"' in r.text + assert "tail=all" not in r.text assert 'EXPORT_BASENAME = "manager"' in r.text