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}