Add DM Sans font integration and enhance dashboard context

- Added DM Sans font to the project, including multiple weights and styles for improved typography.
- Updated package.json and package-lock.json to include @fontsource/dm-sans dependency.
- Enhanced dashboard context to include current cluster CPU state, integrating new data into the context and API responses.
- Updated relevant templates and JavaScript to utilize the new current cluster data for better visualization and user experience.
This commit is contained in:
2026-02-07 16:51:24 +03:00
parent 0ecad9bd72
commit 917a7758bc
19 changed files with 181 additions and 16 deletions

View File

@@ -74,14 +74,16 @@ class CollectContextTest(TestCase):
conn._compute_region = region_name
return conn
@patch("dashboard.views.get_current_cluster_cpu")
@patch("dashboard.views._fetch_prometheus_metrics")
@patch("dashboard.views.get_audits")
@patch("dashboard.views.get_flavor_list")
@patch("dashboard.views.get_connection")
def test_collect_context_structure_and_calculation(
self, mock_get_connection, mock_get_flavor_list, mock_get_audits, mock_fetch_metrics
self, mock_get_connection, mock_get_flavor_list, mock_get_audits, mock_fetch_metrics, mock_get_current_cluster_cpu
):
mock_get_connection.return_value = self._make_mock_connection("my-region")
mock_get_current_cluster_cpu.return_value = {"host_labels": ["h0", "h1"], "cpu_current": [30.0, 40.0]}
mock_get_flavor_list.return_value = {
"first_common_flavor": {"name": "m1.small", "count": 5},
"second_common_flavor": {"name": "", "count": 0},
@@ -124,6 +126,9 @@ class CollectContextTest(TestCase):
import json
self.assertIsInstance(context["audits"][0]["migrations"], str)
self.assertEqual(json.loads(context["audits"][0]["host_labels"]), ["h0", "h1"])
self.assertIn("current_cluster", context)
self.assertEqual(json.loads(context["current_cluster"]["host_labels"]), ["h0", "h1"])
self.assertEqual(json.loads(context["current_cluster"]["cpu_current"]), [30.0, 40.0])
class ApiStatsTest(TestCase):
@@ -196,10 +201,11 @@ class ApiAuditsTest(TestCase):
def setUp(self):
self.factory = RequestFactory()
@patch("dashboard.views.get_current_cluster_cpu")
@patch("dashboard.views.get_audits")
@patch("dashboard.views.get_connection")
def test_api_audits_returns_json_audits_list(
self, mock_get_connection, mock_get_audits
self, mock_get_connection, mock_get_audits, mock_get_current_cluster_cpu
):
mock_get_connection.return_value = MagicMock()
mock_get_audits.return_value = [
@@ -218,6 +224,7 @@ class ApiAuditsTest(TestCase):
"cpu_projected": [35.0, 35.0],
}
]
mock_get_current_cluster_cpu.return_value = {"host_labels": ["h0", "h1"], "cpu_current": [30.0, 40.0]}
cache.clear()
request = self.factory.get("/api/audits/")
with patch("dashboard.views.settings") as mock_settings:
@@ -231,15 +238,24 @@ class ApiAuditsTest(TestCase):
self.assertEqual(data["audits"][0]["name"], "Test Audit")
self.assertIsInstance(data["audits"][0]["migrations"], str)
self.assertIsInstance(data["audits"][0]["host_labels"], str)
self.assertIn("current_cluster", data)
self.assertEqual(data["current_cluster"]["host_labels"], ["h0", "h1"])
self.assertEqual(data["current_cluster"]["cpu_current"], [30.0, 40.0])
@patch("dashboard.views.get_current_cluster_cpu")
@patch("dashboard.views.collect_audits")
@patch("dashboard.views.settings")
def test_api_audits_uses_cache(self, mock_settings, mock_collect_audits):
def test_api_audits_uses_cache(self, mock_settings, mock_collect_audits, mock_get_current_cluster_cpu):
mock_settings.DASHBOARD_CACHE_TTL = 120
cached = [{"id": "cached-1", "name": "Cached Audit", "migrations": "[]", "host_labels": "[]", "cpu_current": "[]", "cpu_projected": "[]"}]
cached_audits = [{"id": "cached-1", "name": "Cached Audit", "migrations": "[]", "host_labels": "[]", "cpu_current": "[]", "cpu_projected": "[]"}]
cached_cluster = {"host_labels": ["cached-h0"], "cpu_current": [10.0]}
cache.clear()
cache.set("dashboard_audits", cached, timeout=120)
cache.set("dashboard_audits", cached_audits, timeout=120)
cache.set("dashboard_current_cluster", cached_cluster, timeout=120)
request = self.factory.get("/api/audits/")
response = api_audits(request)
mock_collect_audits.assert_not_called()
self.assertEqual(json.loads(response.content)["audits"][0]["name"], "Cached Audit")
mock_get_current_cluster_cpu.assert_not_called()
data = json.loads(response.content)
self.assertEqual(data["audits"][0]["name"], "Cached Audit")
self.assertEqual(data["current_cluster"], cached_cluster)