aether_api/
status.rs

1use aether_ast::PolicyContext;
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4
5#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
6#[serde(rename_all = "snake_case")]
7pub enum ServiceMode {
8    #[default]
9    SingleNode,
10    Partitioned,
11}
12
13#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
14pub struct ServiceStatusStorage {
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub database_path: Option<PathBuf>,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub sidecar_path: Option<PathBuf>,
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub audit_log_path: Option<PathBuf>,
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub partition_root: Option<PathBuf>,
23}
24
25#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
26pub struct PrincipalStatusSummary {
27    pub principal: String,
28    pub principal_id: String,
29    pub token_id: String,
30    pub scopes: Vec<String>,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub policy_context: Option<PolicyContext>,
33    pub source: String,
34    #[serde(default, skip_serializing_if = "std::ops::Not::not")]
35    pub revoked: bool,
36}
37
38#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
39pub struct ReplicaStatusSummary {
40    pub partition: String,
41    pub replica_id: u64,
42    pub role: String,
43    pub leader_epoch: u64,
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub applied_element: Option<u64>,
46    pub replication_lag: u64,
47    pub healthy: bool,
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub detail: Option<String>,
50}
51
52#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
53pub struct ServiceStatusResponse {
54    pub status: String,
55    pub build_version: String,
56    pub config_version: String,
57    pub schema_version: String,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub bind_addr: Option<String>,
60    pub service_mode: ServiceMode,
61    pub storage: ServiceStatusStorage,
62    pub principals: Vec<PrincipalStatusSummary>,
63    pub replicas: Vec<ReplicaStatusSummary>,
64}
65
66impl ServiceStatusResponse {
67    pub fn single_node(
68        build_version: impl Into<String>,
69        config_version: impl Into<String>,
70        schema_version: impl Into<String>,
71    ) -> Self {
72        Self {
73            status: "ok".into(),
74            build_version: build_version.into(),
75            config_version: config_version.into(),
76            schema_version: schema_version.into(),
77            bind_addr: None,
78            service_mode: ServiceMode::SingleNode,
79            storage: ServiceStatusStorage::default(),
80            principals: Vec::new(),
81            replicas: Vec::new(),
82        }
83    }
84}
85
86#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
87pub struct AuthReloadResponse {
88    pub reloaded_at_ms: u64,
89    pub principal_count: usize,
90    pub revoked_count: usize,
91}