From 9f93fb1f8868e30e50a0cdff0f2a57cfb6efc0d6 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Sun, 7 Dec 2025 23:17:21 +0000 Subject: [PATCH] phase 3: migrate Hosts page to use unified resources - Updated HostsRoute to consume unified resources with fallback to legacy data - Added asHosts adapter to useResourcesAsLegacy hook - Adapter converts Resource type to Host type for existing component The Hosts page now uses resources from state.resources when available, falling back to state.hosts for backward compatibility. This approach allows gradual migration without breaking the existing HostsOverview component. --- frontend-modern/src/App.tsx | 58 +++++++++++++++++- frontend-modern/src/hooks/useResources.ts | 75 +++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/frontend-modern/src/App.tsx b/frontend-modern/src/App.tsx index bbdc184..ebb7dd2 100644 --- a/frontend-modern/src/App.tsx +++ b/frontend-modern/src/App.tsx @@ -109,8 +109,64 @@ function HostsRoute() { return
Loading...
; } const { state } = wsContext; + + // Use unified resources if available, fall back to legacy state.hosts + // During migration: resources may be empty initially, so we need the fallback + const hosts = createMemo(() => { + const unifiedHosts = state.resources?.filter(r => r.type === 'host') ?? []; + + // If we have unified resources, convert them to legacy Host format + // (This will be simplified once HostsOverview is migrated to use resources directly) + if (unifiedHosts.length > 0) { + return unifiedHosts.map(r => { + const platformData = r.platformData as Record | undefined; + return { + id: r.id, + hostname: r.identity?.hostname ?? r.name, + displayName: r.displayName || r.name, + platform: platformData?.platform as string | undefined, + osName: platformData?.osName as string | undefined, + osVersion: platformData?.osVersion as string | undefined, + kernelVersion: platformData?.kernelVersion as string | undefined, + architecture: platformData?.architecture as string | undefined, + cpuCount: platformData?.cpuCount as number | undefined, + cpuUsage: r.cpu?.current, + loadAverage: platformData?.loadAverage as number[] | undefined, + memory: r.memory ? { + total: r.memory.total ?? 0, + used: r.memory.used ?? 0, + free: r.memory.free ?? 0, + usage: r.memory.current, + } : { total: 0, used: 0, free: 0, usage: 0 }, + disks: platformData?.disks as Array<{ + total: number; + used: number; + free: number; + usage: number; + mountpoint?: string; + }> | undefined, + diskIO: platformData?.diskIO, + networkInterfaces: platformData?.networkInterfaces, + sensors: platformData?.sensors, + raid: platformData?.raid, + status: r.status === 'online' || r.status === 'running' ? 'online' : r.status, + uptimeSeconds: r.uptime, + lastSeen: r.lastSeen, + intervalSeconds: platformData?.intervalSeconds as number | undefined, + agentVersion: platformData?.agentVersion as string | undefined, + tokenId: platformData?.tokenId as string | undefined, + tokenName: platformData?.tokenName as string | undefined, + tags: r.tags, + }; + }); + } + + // Fall back to legacy data + return state.hosts ?? []; + }); + return ( - + ); } diff --git a/frontend-modern/src/hooks/useResources.ts b/frontend-modern/src/hooks/useResources.ts index 0f77855..5473d90 100644 --- a/frontend-modern/src/hooks/useResources.ts +++ b/frontend-modern/src/hooks/useResources.ts @@ -303,10 +303,85 @@ export function useResourcesAsLegacy() { })); }); + // Convert resources to legacy Host format + const asHosts = createMemo(() => { + return byType('host').map(r => { + // Extract platform-specific data if available + const platformData = r.platformData as Record | undefined; + + return { + id: r.id, + hostname: r.identity?.hostname ?? r.name, + displayName: r.displayName || r.name, + platform: platformData?.platform as string | undefined, + osName: platformData?.osName as string | undefined, + osVersion: platformData?.osVersion as string | undefined, + kernelVersion: platformData?.kernelVersion as string | undefined, + architecture: platformData?.architecture as string | undefined, + cpuCount: platformData?.cpuCount as number | undefined, + cpuUsage: r.cpu?.current, + loadAverage: platformData?.loadAverage as number[] | undefined, + memory: r.memory ? { + total: r.memory.total ?? 0, + used: r.memory.used ?? 0, + free: r.memory.free ?? 0, + usage: r.memory.current, + } : { total: 0, used: 0, free: 0, usage: 0 }, + disks: platformData?.disks as Array<{ + total: number; + used: number; + free: number; + usage: number; + mountpoint?: string; + type?: string; + device?: string; + }> | undefined, + diskIO: platformData?.diskIO as Array<{ + device: string; + readBytes?: number; + writeBytes?: number; + }> | undefined, + networkInterfaces: platformData?.networkInterfaces as Array<{ + name: string; + mac?: string; + addresses?: string[]; + rxBytes?: number; + txBytes?: number; + }> | undefined, + sensors: platformData?.sensors as { + temperatureCelsius?: Record; + fanRpm?: Record; + } | undefined, + raid: platformData?.raid as Array<{ + device: string; + name?: string; + level: string; + state: string; + totalDevices: number; + activeDevices: number; + workingDevices: number; + failedDevices: number; + spareDevices: number; + devices: Array<{ device: string; state: string; slot: number }>; + rebuildPercent: number; + }> | undefined, + status: r.status === 'online' || r.status === 'running' ? 'online' : r.status, + uptimeSeconds: r.uptime, + lastSeen: r.lastSeen, + intervalSeconds: platformData?.intervalSeconds as number | undefined, + agentVersion: platformData?.agentVersion as string | undefined, + tokenId: platformData?.tokenId as string | undefined, + tokenName: platformData?.tokenName as string | undefined, + tags: r.tags, + }; + }); + }); + return { resources, asVMs, asContainers, + asHosts, }; }