mirror of
https://github.com/hansjone/netx.git
synced 2026-10-17 15:40:47 +08:00
- New packages/netx-bizmonitor-mcp: 8 read-only cutover/biz-state tools mirroring the netxops bizMonitor group. - Align netx-mcp (15) and netx-topology-mcp (16) with backend HTTP contracts; surface partial batch failures as tool errors. - CLI hard gate: single-line show/display only; exec job IDs, path containment, owner and ne:exec checks. - Cisco IOSv collection: stable prompt/echo handling over CR. - Remove legacy netx_api/mcp and mcp_server.py; add mcp.all.json; sync skills and docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""layoutTopologyView action=move_nodes registration + validation."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from netx_topology_mcp.http_tools import HTTP_MCP_TOOLS, _move_topology_view_nodes
|
|
from netx_topology_mcp.layout_tool import list_layout_catalog
|
|
|
|
|
|
def test_move_nodes_in_layout_schema_and_catalog() -> None:
|
|
tool = next(t for t in HTTP_MCP_TOOLS if t["name"] == "layoutTopologyView")
|
|
enum = tool["inputSchema"]["properties"]["action"]["enum"]
|
|
assert "move_nodes" in enum
|
|
assert "sink_nodes" not in enum
|
|
cat = list_layout_catalog()
|
|
assert "move_nodes" in cat["actions"]
|
|
assert "sink_nodes" not in cat["actions"]
|
|
|
|
|
|
def test_move_nodes_requires_ids_and_views() -> None:
|
|
assert _move_topology_view_nodes({}).get("error") == "view_id_and_source_view_id_required"
|
|
assert (
|
|
_move_topology_view_nodes(
|
|
{
|
|
"view_id": "a",
|
|
"source_view_id": "a",
|
|
"params": {"fabric_node_ids": ["x"]},
|
|
}
|
|
).get("error")
|
|
== "source_and_dest_must_differ"
|
|
)
|
|
assert (
|
|
_move_topology_view_nodes(
|
|
{"view_id": "a", "source_view_id": "b", "params": {}}
|
|
).get("error")
|
|
== "fabric_node_ids_required"
|
|
)
|