feat(plugins): Traefik problems first, UniFi/SNMP/fleet on shared shapes, audit names its entities, templates on tokens (#5126)
Traefik: routers are graded from their latest scrape (router_state: crit on any real 5xx share, warn on p95 past the latency critical cutoff or a high 4xx share). Failing and slow routers lead as cards that say why; healthy ones fold into one table that stays open or shut across polls. Proxy counts are stat tiles; certificates are graded by Settings -> Thresholds (tls_days). UniFi: WAN health is a stat strip (latency graded by the thresholds), devices carry status dots, event categories and firewall actions are badges, the alarm count reuses .count-badge (renamed from .nav-count). SNMP: each device wears a status badge and its readings are stat tiles. Agent fleet: the table comes first, with a Status column (Reporting / Silent / Never reported, by the host page's stale_after_seconds), silent agents first, hosts linked, last seen as |ago. Audit: entries name their entity (one query per type, steward/audit/ service.py) and link it; something deleted since keeps the name its entry recorded and says "(deleted)". Tokens: charts read colours through chart-colors.js (stewardColor resolves a token to the rgb the browser computed; Chart.js defaults take the page's text and border colours), so host, history, Traefik and SNMP charts drop their hex. Template hex colours reach 0 (HEX_CEILING = 0), the last rgba pills go, and heavy weights (600/700/bold, 60 of them) become 500, the house pair being 400/500; a guard keeps templates there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"""UniFi's overview reads in the shared shapes: WAN health as stat tiles graded
|
||||
by Settings → Thresholds, devices with status dots, categories as badges (#5126)."""
|
||||
from datetime import datetime, timezone
|
||||
from types import SimpleNamespace as NS
|
||||
|
||||
from tests._templates import render_plugin_template
|
||||
from tests.test_style_tokens import hex_colours
|
||||
|
||||
|
||||
async def test_wan_health_and_devices_use_the_shared_shapes(app):
|
||||
wan = NS(is_up=False, wan_ip="203.0.113.7", latency_ms=250.0, rx_bytes_rate=2_000_000.0,
|
||||
tx_bytes_rate=500_000.0, uptime_seconds=7200)
|
||||
devices = [NS(name="switch", mac="aa", model="USW", device_type="usw", ip="10.0.0.2", state=1,
|
||||
uptime_seconds=3600),
|
||||
NS(name="ap-attic", mac="bb", model="U6", device_type="uap", ip="10.0.0.3", state=0,
|
||||
uptime_seconds=None)]
|
||||
async with app.test_request_context("/plugins/unifi/rows"):
|
||||
page = await render_plugin_template(app, "unifi", "unifi/rows.html", latest_wan=wan, devices=devices,
|
||||
sparkline_latency="", sparkline_rx="", sparkline_tx="")
|
||||
|
||||
assert '<span class="stat-tile-label">WAN</span>' in page and "stat-crit" in page
|
||||
assert '<span class="stat-tile-value">250 ms</span>' in page
|
||||
assert 'class="dot dot-ok"' in page and 'class="dot dot-crit"' in page
|
||||
assert "font-weight:600" not in page and "font-weight:700" not in page
|
||||
assert not hex_colours(page), hex_colours(page)
|
||||
|
||||
|
||||
async def test_event_categories_are_badges(app):
|
||||
events = [NS(event_time=datetime(2026, 10, 6, 12, 0, tzinfo=timezone.utc), category="ids",
|
||||
event_key="EVT_IPS_Alert", message="blocked", subsystem="ids")]
|
||||
async with app.test_request_context("/plugins/unifi/events"):
|
||||
page = await render_plugin_template(app, "unifi", "unifi/events.html", events=events)
|
||||
assert '<span class="badge badge-crit">ids</span>' in page
|
||||
assert "rgba(" not in page
|
||||
Reference in New Issue
Block a user