use schemars::JsonSchema;
use serde::Serialize;
use crate::config::{HumanDuration, Service};
pub fn schema_json() -> String {
crate::schema_pretty::<Response>()
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
#[serde(untagged)]
#[schemars(title = "sleet response")]
pub enum Response {
Status(StatusResponse),
Register(RegisterResponse),
MirrorSync(MirrorSyncResponse),
MirrorRestore(MirrorRestoreResponse),
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
#[schemars(title = "sleet status response")]
pub struct StatusResponse {
pub nodes: Vec<NodeStatus>,
pub databases: Vec<DatabaseStatus>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub mirrors: Vec<MirrorStatus>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub warnings: Vec<String>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct MirrorStatus {
pub database: String,
pub target: String,
pub destination: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_manifest_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dest_manifest_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manifests_behind: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wal_behind: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seconds_behind: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct NodeStatus {
pub node_id: String,
pub live: bool,
pub heartbeat_age: HumanDuration,
pub services: Vec<Service>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sleet_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slatedb_version: Option<String>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct DatabaseStatus {
pub url: String,
pub services: Vec<ServicePlacement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub queue: Option<QueueStatus>,
}
#[derive(Clone, Copy, Debug, Serialize, JsonSchema)]
pub struct QueueStatus {
pub claimable: u64,
pub running: u64,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct ServicePlacement {
pub service: Service,
pub nodes: Vec<String>,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
#[schemars(title = "sleet register response")]
pub struct RegisterResponse {
pub url: String,
pub file: String,
pub created: bool,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
#[schemars(title = "sleet mirror sync response")]
pub struct MirrorSyncResponse {
pub database: String,
pub target: String,
pub destination: String,
pub head: u64,
pub committed: bool,
pub manifests_committed: u64,
pub objects_copied: u64,
pub bytes_copied: u64,
pub pruned_manifests: u64,
pub pruned_objects: u64,
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
#[schemars(title = "sleet mirror restore response")]
pub struct MirrorRestoreResponse {
pub backup: String,
pub destination: String,
pub manifest_id: u64,
pub manifests_committed: u64,
pub objects_copied: u64,
pub bytes_copied: u64,
}