Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions docs/net/operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,6 @@ kubectl unbounded-system controller proxy
The dashboard displays:
- **Overview**: Cluster health summary with node counts, site counts, and gateway status
- **Sites**: All configured sites with node counts and health indicators
- **Connectivity Matrix**: Visual representation of node-to-node connectivity (pingmesh results)
- **Nodes**: Detailed list of all nodes with filtering, sorting, and pagination
- Tunnel peer status (WireGuard peers or eBPF tunnel endpoints)
- Gateway health for each node
Expand All @@ -225,12 +224,10 @@ The dashboard uses **WebSocket** for real-time updates with delta compression, f
- Filtering nodes by name, site, or role (gateway/worker)
- Sorting by any column
- Auto-sizing pagination based on screen height
- Expandable connectivity matrix with zoom and labels
- Dark/light theme toggle

Connectivity matrices are omitted for site or gateway-pool scopes containing
more than 100 nodes. Smaller scopes remain visible even when other scopes
exceed that limit.
The dashboard does not render a site connectivity graph or connectivity matrix.
Use the Site summaries and filtered node list to inspect individual resources.

### Health Endpoints

Expand Down
72 changes: 2 additions & 70 deletions frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import * as React from 'react';
import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import NodeTable from './components/nodes/NodesTable';
import NetworkCard from './components/dashboard/NetworkCard';
import SitesCard from './components/network/SitesCard';
import StatusJsonModal from './components/status/StatusJsonModal';
import ErrorBoundary from './components/common/ErrorBoundary';
Expand All @@ -23,7 +22,6 @@ export default function App() {
} = useClusterStatus();
const nodes = status?.nodes || [];
const sites = summary?.sites || status?.sites || [];
const peerings = summary?.peerings || status?.peerings || [];
const gatewayPools = summary?.gatewayPools || status?.gatewayPools || [];
const nodeSummaries = summary?.nodeSummaries || [];
const [hiddenSites, setHiddenSites] = useState<Set<string>>(new Set());
Expand All @@ -32,8 +30,7 @@ export default function App() {
const [selectedNodeDetailTab, setSelectedNodeDetailTab] = useState<'peerings' | 'routes' | 'bpf'>('peerings');
const [pullEnabledOptimistic, setPullEnabledOptimistic] = useState<boolean | null>(null);
const [selectedNodeTypesFilter, setSelectedNodeTypesFilter] = useState<Set<string>>(new Set(['Gateway', 'Worker']));
const [networkTab, setNetworkTab] = useState<'siteTopology' | 'matrix'>('siteTopology');
const [maximizedPanel, setMaximizedPanel] = useState<'nodes' | 'siteTopology' | 'matrix' | null>(null);
const [maximizedPanel, setMaximizedPanel] = useState<'nodes' | null>(null);
const [infoOpen, setInfoOpen] = useState(false);
const [statusJsonOpen, setStatusJsonOpen] = useState(false);
const [errorsDismissed, setErrorsDismissed] = useState(false);
Expand All @@ -52,12 +49,6 @@ export default function App() {
window.localStorage.setItem('theme', theme);
}, [theme]);

useEffect(() => {
if (maximizedPanel === 'siteTopology' || maximizedPanel === 'matrix') {
setNetworkTab(maximizedPanel);
}
}, [maximizedPanel]);

useEffect(() => {
if (!maximizedPanel) return;
const onKeyDown = (event: KeyboardEvent) => {
Expand Down Expand Up @@ -217,17 +208,14 @@ export default function App() {
}, []);

const {
activeNetworkTab,
activeSelectedNode,
edgeHealthCheckCounts,
effectivePullEnabled,
gatewayByNode,
nodeK8sStatusMap,
nodeHealthyCount,
nodeTotalCount,
peerHealth,
poolCounts,
poolToSite,
siteCounts,
visibleNodeSummaries
} = useDashboardData({
Expand All @@ -239,8 +227,6 @@ export default function App() {
gatewayPoolHiddenNames: hiddenGatewayPools,
hiddenSites,
selectedNodeTypesFilter,
networkTab,
maximizedPanel,
pullEnabledOptimistic,
selectedNodeName,
nodeDetail
Expand Down Expand Up @@ -272,18 +258,6 @@ export default function App() {
? 'Polling only'
: 'No data';

const onSelectNetworkTab = (tab: 'siteTopology' | 'matrix') => {
if (maximizedPanel === 'siteTopology' || maximizedPanel === 'matrix') {
setMaximizedPanel(tab);
return;
}
setNetworkTab(tab);
};

const onToggleNetworkMaximize = (isMaximized: boolean) => {
setMaximizedPanel(isMaximized ? null : activeNetworkTab);
};

const renderNodesCard = (isMaximized: boolean) => {
const content = (
<NodeTable
Expand Down Expand Up @@ -316,34 +290,12 @@ export default function App() {
const buildInfo = summary?.buildInfo || status?.buildInfo;
const leaderInfo = summary?.leaderInfo || status?.leaderInfo;
const timestamp = summary?.timestamp || status?.timestamp;
const connectivityMatrix = summary?.connectivityMatrix || status?.connectivityMatrix;

if (maximizedPanel) {
return (
<div className="app app-maximized">
<div className="maximize-backdrop" onClick={() => setMaximizedPanel(null)}></div>
{maximizedPanel === 'nodes' ? renderNodesCard(true) : (
<NetworkCard
activeNetworkTab={activeNetworkTab}
edgeHealthCheckCounts={edgeHealthCheckCounts}
gatewayByNode={gatewayByNode}
nodeK8sStatusMap={nodeK8sStatusMap}
gatewayPools={gatewayPools}
hiddenGatewayPools={hiddenGatewayPools}
hiddenSites={hiddenSites}
isMaximized
nodeStatuses={nodes}
peerings={peerings}
poolCounts={poolCounts}
poolToSite={poolToSite}
siteCounts={siteCounts}
sites={sites}
statusMatrix={connectivityMatrix}
theme={theme}
onSelectTab={onSelectNetworkTab}
onToggleMaximize={() => onToggleNetworkMaximize(true)}
/>
)}
{renderNodesCard(true)}
<Suspense fallback={null}>
<NodeDetailModal
nodeName={selectedNodeName}
Expand Down Expand Up @@ -559,26 +511,6 @@ export default function App() {
nodeSummaries={nodeSummaries}
nodes={nodes}
/>
<NetworkCard
activeNetworkTab={activeNetworkTab}
edgeHealthCheckCounts={edgeHealthCheckCounts}
gatewayByNode={gatewayByNode}
nodeK8sStatusMap={nodeK8sStatusMap}
gatewayPools={gatewayPools}
hiddenGatewayPools={hiddenGatewayPools}
hiddenSites={hiddenSites}
isMaximized={false}
nodeStatuses={nodes}
peerings={peerings}
poolCounts={poolCounts}
poolToSite={poolToSite}
siteCounts={siteCounts}
sites={sites}
statusMatrix={connectivityMatrix}
theme={theme}
onSelectTab={onSelectNetworkTab}
onToggleMaximize={() => onToggleNetworkMaximize(false)}
/>
</div>
<div>
{loading && <div className="card">Loading...</div>}
Expand Down
118 changes: 0 additions & 118 deletions frontend/src/components/dashboard/NetworkCard.tsx

This file was deleted.

Loading