mirror of
https://github.com/jmagar/unraid-mcp.git
synced 2026-03-23 12:39:24 -07:00
fix: address PR review threads (test-actions, diagnostics, docker, health, storage, plugin)
Resolves review threads:
- PRRT_kwDOO6Hdxs50R8VI (test-actions.sh: remove || echo "000" curl fallback)
- PRRT_kwDOO6Hdxs50R8VJ (test-actions.sh: JSON parse failures → FAIL not silent)
- PRRT_kwDOO6Hdxs50QdKd (diagnostics.py: sanitize raw exception text from ToolError)
- PRRT_kwDOO6Hdxs50QdKs (storage.py: unassigned uses unassignedDevices query)
- PRRT_kwDOO6Hdxs50Mwlk (docker.py: port_conflicts returns flat merged list)
- PRRT_kwDOO6Hdxs50Mwlo (docker.py: logs returns plain string not dict)
- PRRT_kwDOO6Hdxs50Mt5K (docker.py: unraid_docker logs format compatibility)
- PRRT_kwDOO6Hdxs50Mt5L (health.py: or {} null guards throughout)
- PRRT_kwDOO6Hdxs50Mt5r (docker.py: port_conflicts flat list backward compat)
- plugin.json: version synced to 0.4.4 to match pyproject.toml
Changes:
- test-actions.sh: curl exit code captured directly; JSON failures surface as FAIL
- diagnostics.py: 4 ToolError sites log exc_info=True, raise sanitized messages
- storage.py: unassigned action queries unassignedDevices instead of disks
- docker.py: logs action returns newline-joined string; port_conflicts merges
containerPorts + lanPorts into a flat list for backward compatibility
- health.py: all nested dict lookups use `or {}` instead of `.get(k, {})` to
handle explicit GraphQL null values
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -109,7 +109,10 @@ def register_diagnostic_tools(mcp: FastMCP) -> None:
|
||||
try:
|
||||
ws_url = build_ws_url()
|
||||
except ValueError as e:
|
||||
raise ToolError(str(e)) from e
|
||||
logger.error("[TEST_SUBSCRIPTION] Invalid WebSocket URL configuration: %s", e)
|
||||
raise ToolError(
|
||||
"Subscription test failed: invalid WebSocket URL configuration."
|
||||
) from e
|
||||
|
||||
ssl_context = build_ws_ssl_context(ws_url)
|
||||
|
||||
@@ -137,7 +140,13 @@ def register_diagnostic_tools(mcp: FastMCP) -> None:
|
||||
init_response = json.loads(response)
|
||||
|
||||
if init_response.get("type") != "connection_ack":
|
||||
raise ToolError(f"Connection failed: {init_response}")
|
||||
logger.error(
|
||||
"[TEST_SUBSCRIPTION] Connection not acknowledged: %s",
|
||||
init_response,
|
||||
)
|
||||
raise ToolError(
|
||||
"Subscription test failed: WebSocket connection was not acknowledged."
|
||||
)
|
||||
|
||||
# Send subscription
|
||||
await websocket.send(
|
||||
@@ -165,8 +174,10 @@ def register_diagnostic_tools(mcp: FastMCP) -> None:
|
||||
except ToolError:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"[TEST_SUBSCRIPTION] Error: {e}", exc_info=True)
|
||||
raise ToolError(f"Subscription test failed: {e!s}") from e
|
||||
logger.error("[TEST_SUBSCRIPTION] Error: %s", e, exc_info=True)
|
||||
raise ToolError(
|
||||
"Subscription test failed: an unexpected error occurred. Check server logs for details."
|
||||
) from e
|
||||
|
||||
@mcp.tool()
|
||||
async def diagnose_subscriptions() -> dict[str, Any]:
|
||||
@@ -269,7 +280,9 @@ def register_diagnostic_tools(mcp: FastMCP) -> None:
|
||||
return diagnostic_info
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[DIAGNOSTIC] Failed to generate diagnostics: {e}")
|
||||
raise ToolError(f"Failed to generate diagnostics: {e!s}") from e
|
||||
logger.error("[DIAGNOSTIC] Failed to generate diagnostics: %s", e, exc_info=True)
|
||||
raise ToolError(
|
||||
"Failed to generate diagnostics: an unexpected error occurred. Check server logs for details."
|
||||
) from e
|
||||
|
||||
logger.info("Subscription diagnostic tools registered successfully")
|
||||
|
||||
Reference in New Issue
Block a user