marker: make per-filter toggle fall back to NIO rebuild when the marker isn't installed

Toggle routes silently no-opped when _marker_filter_bridges lacked the filter
name, so update_marker's enabled-only short-circuit succeeded without toggling
uBridge — the controller-layer enabled was set but the uBridge filter stayed on
and kept emitting signals. Now the toggle routes raise HTTPException 404
(FastAPI handles it directly, no ERROR log); the controller's except catches it
and falls back to self.update() (NIO rebuild, which applies the marker + off).
This commit is contained in:
YueGuobin 2026-08-02 23:41:43 +08:00
parent 0afbb897a5
commit 34b644a548
No known key found for this signature in database
6 changed files with 30 additions and 0 deletions

View File

@ -269,6 +269,11 @@ async def toggle_cloud_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}

View File

@ -423,6 +423,11 @@ async def toggle_docker_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}

View File

@ -382,6 +382,11 @@ async def toggle_dynamips_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}

View File

@ -361,6 +361,11 @@ async def toggle_iou_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}

View File

@ -453,6 +453,11 @@ async def toggle_qemu_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}

View File

@ -360,6 +360,11 @@ async def toggle_vpcs_marker(
Toggle a marker filter on/off without an NIO rebuild (ubridge contract §3.2).
"""
if marker_name not in node._marker_filter_bridges:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Marker '{marker_name}' is not installed on this node",
)
await node._ubridge_set_marker_filter_state(marker_name, toggle_data.enabled)
return {"marker_name": marker_name, "enabled": toggle_data.enabled}