diff --git a/bin/fxt/src/tui/data_fetcher.rs b/bin/fxt/src/tui/data_fetcher.rs index dd735f39c..232ab76c0 100644 --- a/bin/fxt/src/tui/data_fetcher.rs +++ b/bin/fxt/src/tui/data_fetcher.rs @@ -25,8 +25,8 @@ use crate::proto::{broker_gateway, data_acquisition, ml, monitoring, risk, tradi use super::state::{ AccountData, AlertData, CircuitBreakerData, ConnectionStatus, DataCacheData, DataFeedData, - ExecutionData, GpuData, ModelStatusData, OrderEventData, PositionData, RiskAlertData, RiskData, - ServiceData, SystemResources, TrainingSessionData, + ExecutionData, GpuData, ModelStatusData, OrderEventData, PodGroupData, PositionData, + RiskAlertData, RiskData, ServiceData, SystemResources, TrainingSessionData, }; // --------------------------------------------------------------------------- @@ -73,6 +73,8 @@ pub enum StateUpdate { daily_pnl: f64, total_pnl: f64, }, + /// Cluster pod statuses (from SubscribeClusterPods). + Pods(Vec), /// gRPC connection status change. Connection(ConnectionStatus), } diff --git a/bin/fxt/src/tui/event_loop.rs b/bin/fxt/src/tui/event_loop.rs index 5b63a9b62..12cbab63f 100644 --- a/bin/fxt/src/tui/event_loop.rs +++ b/bin/fxt/src/tui/event_loop.rs @@ -320,6 +320,9 @@ fn apply_update(state: &mut AppState, update: StateUpdate) { state.account.daily_pnl = daily_pnl; state.account.total_pnl = total_pnl; } + StateUpdate::Pods(pods) => { + state.pods = pods; + } StateUpdate::Connection(status) => { state.connection_status = status; } diff --git a/bin/fxt/src/tui/state.rs b/bin/fxt/src/tui/state.rs index 2fd5be8d9..d0eda5192 100644 --- a/bin/fxt/src/tui/state.rs +++ b/bin/fxt/src/tui/state.rs @@ -63,6 +63,12 @@ pub struct AppState { pub data_cache: DataCacheData, /// System alerts from monitoring (ring buffer). pub alerts: VecDeque, + /// K8s pod groups (from SubscribeClusterPods). + pub pods: Vec, + /// Currently selected pod group index. + pub selected_pod_group: Option, + /// Whether the selected pod group is expanded. + pub pod_group_expanded: bool, /// Timestamp of the last data refresh. pub last_update: Instant, /// gRPC connection status. @@ -88,6 +94,9 @@ impl Default for AppState { data_feeds: Vec::new(), data_cache: DataCacheData::default(), alerts: VecDeque::new(), + pods: Vec::new(), + selected_pod_group: None, + pod_group_expanded: false, last_update: Instant::now(), connection_status: ConnectionStatus::default(), } @@ -314,3 +323,23 @@ pub struct AlertData { pub service: String, pub title: String, } + +/// A single K8s pod. +pub struct PodData { + pub name: String, + pub service: String, + pub status: String, + pub restarts: i32, + pub age: String, + pub node: String, + pub ready: bool, + pub version: String, +} + +/// Pods grouped by service. +pub struct PodGroupData { + pub service: String, + pub pods: Vec, + pub ready_count: usize, + pub total_count: usize, +}