The Go structs used snake_case JSON tags (kubernetes_version, control_plane_nodes, etc.)
but the frontend expected camelCase, with no conversion layer. This broke the Kubernetes
version, node counts, and node status display on the dashboard and cluster pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Continuation of blue-green backup work. Includes recovery plan
generation, active deployment tracking, and strategy updates for
postgres, mysql, longhorn, and config. Incomplete — branched to
make way for services/apps convergence.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Implemented `node upgrade <hostname> <version>` command to upgrade a node's Talos version.
- Implemented `node rollback <hostname>` command to rollback a node to its previous Talos version.
- Added corresponding API calls for node upgrade and rollback in the nodes service.
- Enhanced CLI help documentation for new commands.
feat: introduce Talos utilities in CLI
- Added `talos` command group for Talos Image Factory utilities.
- Implemented `talos versions` command to list available Talos versions.
- Implemented `talos validate <schematic-id> <version>` command to validate schematic compatibility.
- Implemented `talos client` command to show talosctl client information and upgrade functionality.
feat: integrate Talos version selection in UI components
- Created `TalosVersionSelect` component for selecting Talos versions.
- Updated `CentralComponent`, `ClusterSettings`, `NodeUpgradeDialog`, and asset pages to use the new version selection component.
- Added validation feedback for schematic compatibility in relevant components.
fix: update entity tile to support version display
- Modified `EntityTile` component to accept React nodes for descriptions, allowing for version display alongside IP addresses.
chore: refactor API hooks for Talos
- Created new hooks for fetching Talos versions, validating schematics, and managing Talos client information and upgrades.
- Updated existing services and components to utilize the new hooks for improved data management and reactivity.
- Implemented ResolveNamespace method to determine the Kubernetes namespace for an app based on priority: config.yaml, manifest, or appName.
- Updated AppsGetLogs and AppsGetEvents handlers to use the resolved namespace.
- Modified backup process to correctly reference the app's namespace when copying secrets.
- Added unit tests for ResolveNamespace and copyDir functions to ensure correct behavior.
- Removed the ClusterServicesComponent and integrated its functionality into the AppsComponent.
- Updated AppSidebar to reflect the removal of cluster services navigation.
- Adjusted AppsComponent to handle infrastructure services, including fetching, compiling, and deploying.
- Enhanced AppDetailPanel to support infrastructure-specific actions and lifecycle status display.
- Modified routing to redirect cluster-related paths to the apps section, ensuring proper phase checks.
- Updated phase guard logic to accommodate multiple required phases for app management.
- Cleaned up unused ServiceCard component and related imports.
- Adjusted app status types to include category for better categorization of apps.
refactor(logs): Enhance pod retrieval logic in GetLogs and StreamLogs methods
refactor(backup): Update JSON unmarshalling to marshal response data before parsing
refactor(tests): Enhance DNS testing functionality and streamline component structure
refactor(ui): Improve loading states and descriptions in service and app detail dialogs
- Replaced all polling with Server-Sent Events (SSE) for real-time updates
- Created unified global SSE endpoint at /api/v1/events
- Implemented SSE broadcasting for operations, central status, and dnsmasq events
- Added SSE manager with wildcard subscription support for global events
- Created useGlobalSSE hook with singleton connection management
- Updated all frontend hooks to use SSE instead of polling:
- useApps: SSE for app deployments and status
- useSetupStatus: SSE for setup operations
- useNodes: SSE for node management
- useDnsmasq: SSE for DNS configuration
- useCentralStatus: SSE for central daemon status
- useServices: SSE for service management
- useOperations: SSE for long-running operations
- Fixed CORS configuration for wild-central.lan access
- Fixed SSE connection loop issues with proper state management
- Added client-side event filtering for instance-specific updates
- Increased React Query staleTime since SSE provides real-time updates
- Added proper cleanup and reconnection logic with timeouts
This eliminates all polling overhead and provides instant UI updates
when cluster state changes occur.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
The CPU percentage was showing incorrect values (e.g., 10,000% instead of 10%)
because the parseResourceQuantity function wasn't properly converting CPU cores
to millicores. CPU values specified as whole numbers (e.g., "1" for 1 core) were
being treated as 1 millicore instead of 1000 millicores.
Split parseResourceQuantity into separate parseCPUQuantity and parseMemoryQuantity
functions to properly handle the different unit conversions:
- CPU values without "m" suffix are now converted from cores to millicores (×1000)
- CPU values with "m" suffix remain in millicores
- Memory parsing remains unchanged
This ensures consistent millicore units for accurate percentage calculations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>