From 6739b84b9abe232b500892800a157f857b654bec Mon Sep 17 00:00:00 2001 From: Luca Sacchi Ricciardi Date: Sat, 25 Apr 2026 16:30:46 +0200 Subject: [PATCH] fix: avoid worker fetch noise when server is offline --- app/api/models.py | 2 ++ app/web/static/js/data-sync.worker.js | 11 +++++++---- tests/test_api.py | 16 ++++++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/api/models.py b/app/api/models.py index fe2ce40..f332cbd 100644 --- a/app/api/models.py +++ b/app/api/models.py @@ -126,6 +126,8 @@ async def get_models(host: Optional[str] = Query(default=None)): status_code=502, detail="Impossible connettersi a Ollama" ) + except HTTPException: + raise except Exception as e: logger.error(f"Error fetching models: {e}") raise HTTPException( diff --git a/app/web/static/js/data-sync.worker.js b/app/web/static/js/data-sync.worker.js index ecb6a07..b7e243a 100644 --- a/app/web/static/js/data-sync.worker.js +++ b/app/web/static/js/data-sync.worker.js @@ -49,7 +49,9 @@ async function fetchModels() { try { const response = await fetch(buildApiUrl(`${API_BASE}/models`)); - if (!response.ok) throw new Error("Failed to load models"); + if (!response.ok) { + return null; + } const data = await response.json(); const models = data.models || []; @@ -108,7 +110,7 @@ async function fetchRunningModels() { try { const response = await fetch(buildApiUrl(`${API_BASE}/models/running`)); if (!response.ok) { - throw new Error("Failed to load running models"); + return null; } const data = await response.json(); @@ -137,8 +139,9 @@ async function syncData() { } const health = await fetchHealth(); - const modelsData = await fetchModels(); - const runningData = await fetchRunningModels(); + const isOnline = health?.ollama_status === "online"; + const modelsData = isOnline ? await fetchModels() : null; + const runningData = isOnline ? await fetchRunningModels() : null; if (modelsData && modelsData.models.length > 0) { modelsData.showByModel = await fetchAllModelsShow(modelsData.models); diff --git a/tests/test_api.py b/tests/test_api.py index 1593d66..43c9e39 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,6 +3,7 @@ Test API endpoints """ import pytest +import requests from unittest.mock import patch, MagicMock def test_health_check(client): @@ -107,10 +108,21 @@ def test_get_running_models_ollama_offline(client): def test_get_models_ollama_offline(client): """Test getting models when Ollama is offline""" with patch("requests.get") as mock_get: - mock_get.side_effect = Exception("Connection refused") + mock_get.side_effect = requests.exceptions.ConnectionError("Connection refused") response = client.get("/api/v1/models") - assert response.status_code == 500 + assert response.status_code == 502 + + +def test_get_models_returns_502_when_upstream_is_unavailable(client): + """Non-200 upstream response should remain a 502, not be converted to 500.""" + with patch("requests.get") as mock_get: + mock_response = MagicMock() + mock_response.status_code = 503 + mock_get.return_value = mock_response + + response = client.get("/api/v1/models") + assert response.status_code == 502 def test_get_specific_model(client, mock_models_response): """Test getting specific model"""