From 1b18353062375378f8728a63b0d98b415795935a Mon Sep 17 00:00:00 2001 From: Robert Chacon Date: Sat, 4 Apr 2026 17:07:48 -0600 Subject: [PATCH] changes --- docs-es/v2.0/node-manager-ui-es.md | 3 ++- docs/v2.0/node-manager-ui.md | 3 ++- .../lqosd/src/node_manager/js_build/src/tree.js | 14 +++++++++----- .../local_api/node_topology_overrides.rs | 6 ++++++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs-es/v2.0/node-manager-ui-es.md b/docs-es/v2.0/node-manager-ui-es.md index 2f7ff73b..87de009a 100644 --- a/docs-es/v2.0/node-manager-ui-es.md +++ b/docs-es/v2.0/node-manager-ui-es.md @@ -25,7 +25,7 @@ Esta página documenta las vistas clave de la WebUI (Node Manager) y su comporta - Vista jerárquica de nodos/circuitos desde la perspectiva del shaper. - Útil para identificar cuellos de botella y patrones de utilización padre/hijo. - Las páginas de detalle del árbol muestran una ruta tipo breadcrumb, conteos de rama e indicadores de estado para el nodo seleccionado. -- `Node Details` resume el tipo de nodo seleccionado, el tamaño de la rama, las velocidades configuradas y la velocidad efectiva. +- `Node Details` resume las velocidades configuradas del nodo seleccionado, el estado de overrides y la velocidad efectiva. - `Node Snapshot` ofrece un resumen visual rápido del throughput y el QoO del nodo seleccionado. - Los circuitos adjuntos se muestran en una tabla dedicada para el nodo seleccionado. - La columna de IP de circuitos adjuntos mantiene las filas compactas mostrando una dirección inline y colapsando las adicionales como `+X`, mientras la lista completa sigue disponible al pasar el cursor. @@ -37,6 +37,7 @@ Esta página documenta las vistas clave de la WebUI (Node Manager) y su comporta - La página del árbol mantiene `Node Details` como una tarjeta compacta de resumen y coloca los editores de override como filas compactas directamente debajo de la tabla de detalles. - Los nodos de UISP con estrategia `full` también pueden exponer un editor de `Topology Override` en la página del árbol. Las compilaciones actuales soportan solo `Pinned Parent`, usando los candidatos inmediatos detectados aguas arriba del nodo y guardando esa decisión del operador en `lqos_overrides.json`. - El selector de padre fijado usa `Default upstream parent` cuando no existe un override. Elegir esa opción deja el nodo con el padre seleccionado por la integración. +- En el nodo sintético `Root`, el topology override se muestra como no aplicable en lugar de mostrar una advertencia genérica por falta de `node_id`. ### Site Map - Mapa operativo plano de sitios y APs usando geodatos importados de nodos. diff --git a/docs/v2.0/node-manager-ui.md b/docs/v2.0/node-manager-ui.md index 1a3b9d7f..a5dc8214 100644 --- a/docs/v2.0/node-manager-ui.md +++ b/docs/v2.0/node-manager-ui.md @@ -25,7 +25,7 @@ This page documents key WebUI (Node Manager) views and operational behavior in t - Hierarchical topology view of nodes/circuits from the shaper perspective. - Useful for spotting bottlenecks and parent/child utilization patterns. - Tree detail pages show a breadcrumb path, branch counts, and status indicators for the selected node. -- `Node Details` summarizes the selected node’s type, branch size, configured rates, and effective rate. +- `Node Details` summarizes the selected node’s configured rates, override state, and effective rate. - `Node Snapshot` provides a quick visual summary of throughput and QoO for the selected node. - Attached circuits are shown in a dedicated table for the selected node. - The attached-circuits IP column keeps rows compact by showing one address inline and collapsing additional addresses as `+X`, with the full list still available on hover. @@ -37,6 +37,7 @@ This page documents key WebUI (Node Manager) views and operational behavior in t - The tree page keeps `Node Details` as a compact summary card and places the override editors as compact inline rows directly beneath the details table. - UISP `full` strategy nodes can also expose a `Topology Override` editor on the tree page. Current builds support `Pinned Parent` only, using the node's detected immediate upstream candidates and storing that operator choice in `lqos_overrides.json`. - The pinned-parent selector defaults to `Default upstream parent` when no override is set. Choosing that default leaves the node on the integration-selected parent. +- On the synthetic `Root` node, topology override is shown as not applicable rather than as a generic missing-node-ID warning. ### Site Map - Flat operational map of Sites and APs using imported node geodata. diff --git a/src/rust/lqosd/src/node_manager/js_build/src/tree.js b/src/rust/lqosd/src/node_manager/js_build/src/tree.js index ee1104cc..d98786a9 100644 --- a/src/rust/lqosd/src/node_manager/js_build/src/tree.js +++ b/src/rust/lqosd/src/node_manager/js_build/src/tree.js @@ -947,6 +947,13 @@ function renderTopologyOverrideValue(overrideData) { wrap.classList.add("lqos-tree-detail-value"); const value = document.createElement("span"); + const node = currentNode(); + if (node && isSyntheticRootNode(node)) { + value.textContent = "Not applicable for Root"; + wrap.appendChild(value); + target.appendChild(wrap); + return; + } if (!overrideData?.has_override) { value.textContent = "None"; wrap.appendChild(value); @@ -1084,11 +1091,8 @@ function renderNodeTopologySettings(node) { nodeTopologyOverrideState.data?.warnings || [], "warning", ); - renderAlertMessages( - "nodeTopologyDisabledReason", - nodeTopologyOverrideState.data?.disabled_reason ? [nodeTopologyOverrideState.data.disabled_reason] : [], - "secondary", - ); + const disabledReason = isSyntheticRootNode(node) ? null : nodeTopologyOverrideState.data?.disabled_reason; + renderAlertMessages("nodeTopologyDisabledReason", disabledReason ? [disabledReason] : [], "secondary"); maybeSeedTopologyOverrideInputs(nodeTopologyOverrideState.data); diff --git a/src/rust/lqosd/src/node_manager/local_api/node_topology_overrides.rs b/src/rust/lqosd/src/node_manager/local_api/node_topology_overrides.rs index 82c471f6..e9c59106 100644 --- a/src/rust/lqosd/src/node_manager/local_api/node_topology_overrides.rs +++ b/src/rust/lqosd/src/node_manager/local_api/node_topology_overrides.rs @@ -276,6 +276,12 @@ fn edit_disabled_reason( )); } let Some(node_id) = query.node_id.as_deref() else { + if trimmed_name == "Root" { + return Ok(Some( + "The Root node has no upstream parent, so a pinned-parent override does not apply." + .to_string(), + )); + } return Ok(Some( "This node cannot be edited from the tree because it does not expose a stable node ID." .to_string(),