Skip to content

NMS-20125: Node List parity enhancements - #8736

Draft
synqotik wants to merge 11 commits into
release-36.xfrom
jira/NMS-20125-node-list-parity-enhancements
Draft

NMS-20125: Node List parity enhancements#8736
synqotik wants to merge 11 commits into
release-36.xfrom
jira/NMS-20125-node-list-parity-enhancements

Conversation

@synqotik

@synqotik synqotik commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

We want to remove the legacy JSP Node List code, but we identified some more functionality that was not fully ported to the Vue Node List page. This PR fixes those gaps in both the Vue Node List as well as the v2 Node Rest Service, and should achieve feature parity.

Removal of the JSP node list will be in a separate PR.

REST (v2):

  • New nodesWithOutages FIQL search key: nodes with ≥1 current (unresolved, unsuppressed, non-perspective) outage.
  • Fixes a operator-precedence bug in the legacy DefaultNodeListService SQL.
  • Integration tests lock in node.type FIQL filtering

Vue UI:

  • "Show interfaces" mode (legacy ?listInterfaces=true): expandable rows listing each node's interfaces, replicating the three legacy display modes: Default IP interface list, MAC-search mode, and SNMP-attribute mode. Also adds an "N Nodes, M Interfaces on this page" footer.
  • Batched SNMP interface fetching mirroring the existing IP interface batch.
  • New "Nodes with current outages" filter.
  • Legacy ?nodeId=<n> URLs now redirect to the node detail page.
  • Deleted nodes excluded from all node-list queries, including CSV/JSON export.
  • Asset-column filtering widened to include all 61 assetRecord string properties (incl. geolocation-backed city/state/zip/country/address), so site-status-view drill-downs can no longer silently render an unfiltered list.
  • Fixed the Flows column emitting an invalid orderBy=flows sort.

External References

synqotik added 11 commits July 31, 2026 15:38
Adds the nodesWithOutages virtual FIQL search key to NodeRestService,
replacing legacy DefaultNodeListService.addCriteriaForCurrentOutages
with corrected operator precedence (suppresstime disjunction is now
parenthesized so it no longer defeats "ifregainedservice is null").

Also adds testNodesWithOutagesSearch and testNodeTypeSearch ITs to
NodeRestServiceIT, both passing locally (2/2, mvn failsafe against
local PostgreSQL).
- Gate the SNMP interface fetch in NodesTable.vue on nodes/showInterfaces
  changing rather than interfaceListMode, so it can no longer fire with the
  new filter mode paired against stale (pre-refetch) page node ids racing
  the correct, later fetch. Add a dedupe key as a secondary safeguard.
- Omit the snmpParm attribute narrowing entirely when the value contains
  SQL-LIKE wildcards (%/_), since the server matches them literally while
  the client-side matcher treats them as wildcards; keeps the fetch a
  proper superset of the client-side match.
- Add NodesTable.test.ts coverage for the narrowing FIQL, default-mode
  no-fetch, wildcard omission, and fetch dedupe.
Fixes five Important issues from the whole-branch review:

1. Invert the snmpMatchType-undefined default in getInterfaceListMode
   (useInterfaceListing.ts) so undefined resolves to 'equals', matching
   buildSnmpQuery and parseSnmpParmParams. Previously undefined defaulted to
   'contains' display while the filter narrowed by exact match, so expanded
   interface panels could show interfaces that didn't qualify the node.

2. Extract one shared, exported normalizeMacSearch() (useInterfaceListing.ts)
   that strips all non-hex characters and lowercases, and use it in
   useInterfaceListing's maclike match, NodesTable.vue's buildSnmpNarrowing,
   and useNodeQuery.ts's buildMaclikeQuery. Previously two of the three only
   stripped ':' and '-', so a Cisco-style dotted MAC (aabb.ccdd) filtered
   nodes correctly but the expanded panel/narrowing fetch found nothing.

3. Widen NodesTable.vue's buildSnmpNarrowing under-fetch guard from just
   '%'/'_' to also cover ','/';'/'('/')'. Those characters previously either
   got silently replaced with spaces (making the server narrowing no longer
   a superset of the client match) or passed through raw and could unbalance
   the FIQL expression, causing a server-side parse error that surfaced as
   "No interfaces" client-side.

4. Add server-side IT coverage locking in the composed FIQL wire shapes the
   Vue page emits: NodeRestServiceIT#testComposedFiqlWireShapes (grouped
   label OR, grouped nodesWithOutages, and the searchTerm-as-IP union, all
   intersected with the node.type!=D guard) and
   SnmpInterfaceRestServiceIT#testGroupedNodeIdAndPhysAddrFiqlParses (the
   "(ids);(narrowing)" shape used by the interfaces-narrowing fetch).

5. Add a useNodeQuery.test.ts case asserting the exact _s produced for a
   searchTerm that looks like an IP (with no explicit ipAddress filter),
   locking in the label/ipInterface.ipAddress union shape inside the
   node.type!=D guard.

Also (freebie): Nodes.vue's legacy ?nodeId=<n> redirect now uses
window.location.replace instead of .assign, so Back doesn't return to the
bookmark URL and immediately re-redirect.
…lves in maclike/snmpParm mode

The auto-expand watcher evaluated isRowExpandable synchronously against
nodeToSnmpInterfaceMap before the lazy SNMP fetch (kicked off only once
Show Interfaces is on, in maclike/snmpParm mode) had resolved, so
qualifying rows were never auto-expanded on first entry to those modes.
Add a generation-guarded catch-up watcher on nodeToSnmpInterfaceMap that
merges in newly-qualifying rows once the fetch resolves, without
reverting a manual collapse on a later redundant map replacement for the
same fetch generation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant