From e387acf79df8f83f9092f673cbf95f93e91601db Mon Sep 17 00:00:00 2001 From: anti Date: Fri, 1 May 2026 01:51:43 -0400 Subject: [PATCH] =?UTF-8?q?fix(types):=20T4=20=E2=80=94=20stop=20spreading?= =?UTF-8?q?=20TopologySummary=20as=20dict;=20fix=20heartbeat=20.get()=20an?= =?UTF-8?q?d=20scope=20param?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decnet/web/router/swarm/api_heartbeat.py | 5 +++-- decnet/web/router/topology/api_create_blank_topology.py | 2 +- decnet/web/router/topology/api_create_topology.py | 4 +++- decnet/web/router/topology/api_deploy_topology.py | 2 +- decnet/web/router/topology/api_list_topologies.py | 4 ++-- decnet/web/router/topology/api_teardown_topology.py | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/decnet/web/router/swarm/api_heartbeat.py b/decnet/web/router/swarm/api_heartbeat.py index 8ad75a56..dfcb4e3a 100644 --- a/decnet/web/router/swarm/api_heartbeat.py +++ b/decnet/web/router/swarm/api_heartbeat.py @@ -16,6 +16,7 @@ from __future__ import annotations import hashlib import json from datetime import datetime, timezone +from collections.abc import MutableMapping from typing import Any, Optional from fastapi import APIRouter, Depends, HTTPException, Request @@ -39,7 +40,7 @@ class HeartbeatRequest(BaseModel): topology: Optional[dict[str, Any]] = None -def _extract_peer_fingerprint(scope: dict[str, Any]) -> Optional[str]: +def _extract_peer_fingerprint(scope: MutableMapping[str, Any]) -> Optional[str]: """Pull the peer cert's SHA-256 fingerprint from an ASGI scope. Tries two extraction paths because uvicorn has historically stashed @@ -127,7 +128,7 @@ async def _reconcile_topology_report( # Non-fatal: reconcile is best-effort; the host stays alive regardless log.exception("heartbeat: could not list active topologies") return - mine = [t for t in topos if t.get("target_host_uuid") == host_uuid] + mine = [t for t in topos if t.target_host_uuid == host_uuid] if not mine: return diff --git a/decnet/web/router/topology/api_create_blank_topology.py b/decnet/web/router/topology/api_create_blank_topology.py index 1c9f1c6e..28f90735 100644 --- a/decnet/web/router/topology/api_create_blank_topology.py +++ b/decnet/web/router/topology/api_create_blank_topology.py @@ -120,4 +120,4 @@ async def api_create_blank_topology( row = await repo.get_topology(topology_id) if row is None: # pragma: no cover — create then vanish raise HTTPException(status_code=500, detail="topology insert vanished") - return TopologySummary(**row) + return row diff --git a/decnet/web/router/topology/api_create_topology.py b/decnet/web/router/topology/api_create_topology.py index 9f367508..dc9ff736 100644 --- a/decnet/web/router/topology/api_create_topology.py +++ b/decnet/web/router/topology/api_create_topology.py @@ -74,4 +74,6 @@ async def api_create_topology( ) from exc raise row = await repo.get_topology(topology_id) - return TopologySummary(**row) + if row is None: # pragma: no cover — create then vanish + raise HTTPException(status_code=500, detail="topology insert vanished") + return row diff --git a/decnet/web/router/topology/api_deploy_topology.py b/decnet/web/router/topology/api_deploy_topology.py index d77780c5..6a3fa59d 100644 --- a/decnet/web/router/topology/api_deploy_topology.py +++ b/decnet/web/router/topology/api_deploy_topology.py @@ -73,4 +73,4 @@ async def api_deploy_topology( ) background.add_task(_run_deploy, topology_id) - return TopologySummary(**topo) + return topo diff --git a/decnet/web/router/topology/api_list_topologies.py b/decnet/web/router/topology/api_list_topologies.py index 4c9e9857..e77904cc 100644 --- a/decnet/web/router/topology/api_list_topologies.py +++ b/decnet/web/router/topology/api_list_topologies.py @@ -6,7 +6,7 @@ from typing import Optional from fastapi import APIRouter, Depends, Query from decnet.telemetry import traced as _traced -from decnet.web.db.models import TopologyListResponse, TopologySummary +from decnet.web.db.models import TopologyListResponse from decnet.web.dependencies import repo, require_viewer router = APIRouter() @@ -35,5 +35,5 @@ async def api_list_topologies( total=total, limit=limit, offset=offset, - data=[TopologySummary(**r) for r in rows], + data=rows, ) diff --git a/decnet/web/router/topology/api_teardown_topology.py b/decnet/web/router/topology/api_teardown_topology.py index 2467c090..44e4d626 100644 --- a/decnet/web/router/topology/api_teardown_topology.py +++ b/decnet/web/router/topology/api_teardown_topology.py @@ -76,4 +76,4 @@ async def api_teardown_topology( ) background.add_task(_run_teardown, topology_id) - return TopologySummary(**topo) + return topo