Skip to content

v2.64 (01.06.2026)

Choose a tag to compare

@Vadims06 Vadims06 released this 13 Jul 09:43

Topolograph Release Notes v2.64

Features

New endpoint: GET /api/graph/{graph_time}/edges
Returns a paginated list of edges for a graph with support for graph-level pre-filters (protocol, watcher, area) and per-edge attribute filters. Exact match (?weight=10) and range operators (__gt, __lt, __gte, __lte) are supported for any edge attribute including TE fields (temetric, max_link_bw, max_rsrv_link_bw, unreserved_bw_0..7), IS-IS fields (isis_level), and arbitrary user-defined attributes.

GET /api/graph/{graph_time}/nodes — new filters
Added protocol (ospf / ospfv3 / isis / yaml), watcher (true/false), and area query parameters. These check graph-level document flags before touching igraph, returning 404 with a clear message when the graph does not match the filter.

GET /api/diagram/{graph_time}/nodes and /edges — pagination
Both endpoints now return { items: [...], pagination: { page, per_page, total, total_pages } } instead of a bare list. Added page and per_page query parameters. Fixed style: deepObject swagger declaration — parameters are now style: form (flat key=value), matching how the handlers have always read request.args.

MCP server updated
get_nodes and get_edges MCP tools now call /graph/{graph_time}/nodes and /graph/{graph_time}/edges respectively, exposing protocol, watcher, area, page, and per_page parameters. get_edges accepts edge_query_params as a flat dict for per-edge attribute filtering.

GET /api/graph/ — monitoring filters, search, and pagination
The graph-list endpoint now returns { items: [...], pagination: { page, per_page, total, total_pages } } and adds:

  • is_monitored (true/false) — filter by provenance: graphs received from a watcher vs manually uploaded. Each returned graph also reports is_monitored.
  • is_live — per-graph field: whether the source watcher is currently sending heartbeats (last_seen within 3× its heartbeat interval). Manual graphs and graphs with no recent heartbeat are false.
  • name — case-insensitive substring over graph_time or watcher_name (e.g. ?name=before_maintenance).
  • latest_only now returns the single newest graph among those matching the filters (previously one per watcher).
  • page / per_page pagination. The watcher_name query parameter is removed — use name instead.

The Topolograph SDK (graphs.list / graphs.get) and MCP get_all_graphs tool expose the same parameters and surface is_monitored / is_live.

Area filtering on /nodes, /networks, and /edges
Narrow query results to a specific OSPF or IS-IS area in one parameter:
?area=0, ?area=0.0.0.1, or ?area=49.0001.

  • /nodes?area=X — returns only routers that participate in area X. Area Border Routers (ABRs) appear in every area they belong to.
  • /networks?area=X — returns only networks advertised in area X. The displayed area field on each network and termination point reflects the actual advertising area.
  • /edges?area=X — returns edges with at least one endpoint in area X. Useful for plotting an area's adjacencies including its boundary links to neighboring areas.

Standard OSPF area formats (0, 1, 0.0.0.1) are accepted interchangeably. IS-IS areas (49.0001, etc.) are matched as written.

Fixes

API: GET /api/diagram/{graph_time}/edges?src_node=<ip> returned 404 "Node was not found"
Connexion did not reliably bind src_node/dst_node query parameters to function arguments when values contained dots (e.g. IP addresses). The parameters are now read directly from request.args. Additionally, filtering edges by only src_node (without dst_node) no longer triggers a false 404 for the empty destination.

API: getPath with unknown IS-IS node ID raised an unhandled exception
Searching for a non-existent node by IS-IS-style attribute (e.g. AAAA.BBBB.CCCC) on an OSPF graph raised a KeyError because the attribute does not exist on OSPF graphs. The error is now caught and returned as a proper {"error": "..."} response.

API: GET /api/events/{graph_time}/adjacency and /networks returned 500 for OSPF graphs
Two bugs caused the event endpoints to fail on OSPF graphs:

  1. swagger.yml marked level_number (an IS-IS-only field) as required in all four event response schemas — Connexion response validation rejected OSPF events that omit it. The field is now optional in NetworkUpDownEvent, HostUpDownEvent, LinkMetricChangeEvent, and NetworkMetricChangeEvent.
  2. TELinkMetricChangeEvent had no output_api property, causing an AttributeError when TE link metric events were serialised for the API response. Added output_api returning the same shape as LinkMetricChangeEvent.output_api.

Performance

Faster /nodes and /edges responses on large graphs
Per-router area membership is now computed once when a graph is uploaded rather than recomputed on every API request. Graphs uploaded with earlier versions benefit automatically on first read after the upgrade.