import type { NodeProps } from "@xyflow/react"; import { Handle, Position } from "@xyflow/react"; import { Box, Cpu, HardDrive, Network, Server as ServerIcon } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/cn"; import type { K8sNodeMetadata, TopologyNodeData } from "@/lib/topology-types"; export function K8sNodeComponent({ data, selected }: NodeProps) { const nodeData = data as TopologyNodeData; const metadata = nodeData.metadata as K8sNodeMetadata; const { node, podCount, serverPods, proxyPods, health, metrics } = metadata; const getStatusBadge = () => { switch (health) { case "healthy": return Healthy; case "degraded": return Degraded; case "unhealthy": return Unhealthy; default: return ( Unknown ); } }; return (

{node.name || "Unknown"}

Kubernetes Node

{getStatusBadge()}
{node.status} {node.version && ( {node.version} )} {node.roles}
Total Pods {podCount}
Server Pods {serverPods.length}
Proxy Pods {proxyPods.length}
{metrics && (metrics.cpuUsage || metrics.memoryUsage) && (
{metrics.cpuUsage && (
CPU {metrics.cpuUsage}
)} {metrics.memoryUsage && (
Memory {metrics.memoryUsage}
)}
)}
Age {node.age}
{node.hostname && (
Hostname {node.hostname}
)}
{(node.internalIP || node.externalIP) && (
{node.internalIP && (
Internal IP {node.internalIP}
)} {node.externalIP && (
External IP {node.externalIP}
)}
)}
); }