pub struct AppState {Show 26 fields
pub cluster_config: ClusterConfig,
pub container_runtime: Arc<dyn Runtime>,
pub wasm_runtime: Option<Arc<dyn Runtime>>,
pub services: RwLock<HashMap<String, ServiceState>>,
pub route_table: SharedRouteTable,
pub wasm_triggers: SharedWasmTriggers,
pub registered_nodes: RwLock<HashMap<u64, RegisteredNode>>,
pub webhooks: WebhookStore,
pub api_tokens: Vec<String>,
pub pending_commands: RwLock<HashMap<u64, Vec<Value>>>,
pub deploy_history: RwLock<DeployHistory>,
pub acme_manager: Option<AcmeManager>,
pub cert_resolver: Option<SharedCertResolver>,
pub container_stats: RwLock<HashMap<String, ContainerStats>>,
pub store: Option<Arc<ClusterStore>>,
pub ws_agents: RwLock<HashMap<u64, AgentSender>>,
pub log_listeners: RwLock<HashMap<String, Sender<(String, bool)>>>,
pub backup_listeners: RwLock<HashMap<String, Sender<BackupStatusReportData>>>,
pub network_listeners: RwLock<HashMap<String, Sender<NetworkStatusReportData>>>,
pub last_backup_results: RwLock<HashMap<u64, LastBackupResult>>,
pub master_last_backup_result: RwLock<Option<LastBackupResult>>,
pub webhook_invocations: RwLock<HashMap<String, VecDeque<WebhookInvocation>>>,
pub exec_sessions: RwLock<HashMap<String, Sender<Vec<u8>>>>,
pub pending_deploys: RwLock<HashMap<String, Sender<Result<(), String>>>>,
pub alerts: Option<SharedAlertEngine>,
pub instance_events: RwLock<HashMap<String, InstanceEventLog>>,
}Expand description
Shared state for the control plane, accessible by the API server and reconciler.
Fields§
§cluster_config: ClusterConfigCluster configuration.
container_runtime: Arc<dyn Runtime>Container runtime (Docker).
wasm_runtime: Option<Arc<dyn Runtime>>Wasm runtime (wasmtime). Trait object to avoid coupling to concrete type.
services: RwLock<HashMap<String, ServiceState>>Current service state, keyed by service name.
route_table: SharedRouteTableRouting table for container workloads, shared with the reverse proxy.
wasm_triggers: SharedWasmTriggersWasm HTTP triggers, shared with the reverse proxy.
registered_nodes: RwLock<HashMap<u64, RegisteredNode>>Registered cluster nodes (M2 in-memory, will move to Raft store).
webhooks: WebhookStoreWebhook configurations for push-triggered deploys.
api_tokens: Vec<String>API bearer tokens for authentication (empty = allow all).
pending_commands: RwLock<HashMap<u64, Vec<Value>>>Pending commands for agent nodes, keyed by node_id. Uses serde_json::Value to avoid circular dependency on orca-agent types.
deploy_history: RwLock<DeployHistory>Deploy history for rollback support.
acme_manager: Option<AcmeManager>ACME manager for hot cert provisioning (None if no TLS).
cert_resolver: Option<SharedCertResolver>Dynamic cert resolver shared with the HTTPS listener.
container_stats: RwLock<HashMap<String, ContainerStats>>Cached container stats, keyed by service name.
store: Option<Arc<ClusterStore>>Persistent cluster store (redb). None in tests without persistence.
ws_agents: RwLock<HashMap<u64, AgentSender>>WebSocket senders for connected agent nodes, keyed by node_id.
log_listeners: RwLock<HashMap<String, Sender<(String, bool)>>>Log stream listeners: request_id → (data, done) sender.
backup_listeners: RwLock<HashMap<String, Sender<BackupStatusReportData>>>Backup status listeners: request_id → report sender. Used by the
/api/v1/cluster/backups handler to collect reports dispatched in
parallel to every connected agent.
network_listeners: RwLock<HashMap<String, Sender<NetworkStatusReportData>>>Network status listeners: request_id → report sender. Same pattern as
backup_listeners, used by the /api/v1/cluster/networks handler.
last_backup_results: RwLock<HashMap<u64, LastBackupResult>>Last completed BackupResult per agent node, recorded as the result
arrives over WS. Surfaced alongside the snapshot listing so the
dashboard can show a node’s last-failure message without having to
scrape logs. Master has its own field — its backups are subprocess-
driven, not WS-dispatched.
master_last_backup_result: RwLock<Option<LastBackupResult>>Last completed master backup result, recorded when run_master_backup
finishes. Separate from last_backup_results because the master has
no node_id and runs its backups via subprocess rather than WS.
webhook_invocations: RwLock<HashMap<String, VecDeque<WebhookInvocation>>>Recent webhook invocations, keyed by service_name. Bounded ring
buffer of the last 10 deliveries per webhook so the TUI can render a
history view without scraping logs. Lost on restart by design — this
is operator-visible recent activity, not durable audit.
exec_sessions: RwLock<HashMap<String, Sender<Vec<u8>>>>Active exec sessions: session_id → output bytes sender (agent → CLI WS).
pending_deploys: RwLock<HashMap<String, Sender<Result<(), String>>>>Pending deploy result waiters: service_name → oneshot sender. Inserted by queue_remote_deploy, resolved by ws_handler on DeployResult.
alerts: Option<SharedAlertEngine>AI conversational-alert engine. None when [ai] is not configured.
AiMonitor::run (spawned in lib::run_server_with_acme) feeds it
open_alert calls; the HTTP /api/v1/alerts/... handlers mutate it
in response to operator actions.
instance_events: RwLock<HashMap<String, InstanceEventLog>>Per-service log of restart triggers and instance failures.
Read by the AI alert monitor to populate restart_count_24h and
error_count_1h in the cluster context. In-memory only; restart
wipes the log (the AI monitor reconstructs alerts as conditions
reappear, so a brief gap after restart is acceptable).
Implementations§
Source§impl AppState
impl AppState
Sourcepub fn new(
cluster_config: ClusterConfig,
container_runtime: Arc<dyn Runtime>,
wasm_runtime: Option<Arc<dyn Runtime>>,
route_table: SharedRouteTable,
wasm_triggers: SharedWasmTriggers,
) -> Self
pub fn new( cluster_config: ClusterConfig, container_runtime: Arc<dyn Runtime>, wasm_runtime: Option<Arc<dyn Runtime>>, route_table: SharedRouteTable, wasm_triggers: SharedWasmTriggers, ) -> Self
Create with shared route table and Wasm triggers (for sharing with the proxy).
Sourcepub async fn record_instance_restart(&self, service: &str)
pub async fn record_instance_restart(&self, service: &str)
Append a restart event for service and prune old entries.
Cheap (one now() + a few VecDeque ops); safe to call from hot paths.
Sourcepub async fn record_instance_failure(&self, service: &str)
pub async fn record_instance_failure(&self, service: &str)
Append a failure event for service (non-zero exit or health-check
failure) and prune old entries.
Sourcepub fn with_store(self, store: Arc<ClusterStore>) -> Self
pub fn with_store(self, store: Arc<ClusterStore>) -> Self
Set persistent store for service state.
Sourcepub fn with_alerts(self, engine: SharedAlertEngine) -> Self
pub fn with_alerts(self, engine: SharedAlertEngine) -> Self
Attach the AI alert engine. Builder-style so startup code can wire it
only when [ai] is configured.
Sourcepub fn with_acme(
self,
manager: AcmeManager,
resolver: SharedCertResolver,
) -> Self
pub fn with_acme( self, manager: AcmeManager, resolver: SharedCertResolver, ) -> Self
Set ACME manager and cert resolver for hot cert provisioning.
Auto Trait Implementations§
impl !Freeze for AppState
impl !RefUnwindSafe for AppState
impl Send for AppState
impl Sync for AppState
impl Unpin for AppState
impl UnsafeUnpin for AppState
impl !UnwindSafe for AppState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> GetSetFdFlags for T
impl<T> GetSetFdFlags for T
Source§fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
self file descriptor.Source§fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
Source§fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: AsFilelike,
fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: AsFilelike,
self file descriptor. Read moreSource§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request