use std::{collections::HashMap, path::PathBuf};
use derive_builder::Builder;
use partial_derive2::Partial;
use serde::{Deserialize, Serialize};
use strum::Display;
use typeshare::typeshare;
use crate::{
deserializers::{
option_string_list_deserializer, string_list_deserializer,
},
entities::{_Serror, MaintenanceWindow, Timelength},
};
use super::{
alert::SeverityLevel,
resource::{AddFilters, Resource, ResourceListItem, ResourceQuery},
};
#[cfg(feature = "utoipa")]
#[derive(utoipa::ToSchema)]
#[schema(as = Server)]
pub struct ServerSchema(
#[schema(inline)] pub Resource<ServerConfig, ServerInfo>,
);
#[typeshare]
pub type Server = Resource<ServerConfig, ServerInfo>;
#[typeshare]
pub type ServerListItem = ResourceListItem<ServerListItemInfo>;
#[typeshare]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerListItemInfo {
pub state: ServerState,
pub err: Option<_Serror>,
pub region: String,
pub address: Option<String>,
pub external_address: Option<String>,
pub public_ip: Option<String>,
pub send_unreachable_alerts: bool,
pub send_cpu_alerts: bool,
pub send_mem_alerts: bool,
pub send_disk_alerts: bool,
pub send_version_mismatch_alerts: bool,
pub version: Option<String>,
pub public_key: Option<String>,
pub attempted_public_key: Option<String>,
pub terminals_disabled: bool,
pub container_terminals_disabled: bool,
}
#[typeshare]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerInfo {
#[serde(default)]
pub attempted_public_key: String,
#[serde(default)]
pub public_key: String,
}
#[typeshare(serialized_as = "Partial<ServerConfig>")]
pub type _PartialServerConfig = PartialServerConfig;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Builder, Partial)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[partial_derive(Serialize, Deserialize, Debug, Clone, Default)]
#[diff_derive(Serialize, Deserialize, Debug, Clone, Default)]
#[partial(skip_serializing_none, from, diff)]
pub struct ServerConfig {
#[serde(default)]
#[builder(default)]
pub address: String,
#[serde(default = "default_insecure_tls")]
#[builder(default = "default_insecure_tls()")]
#[partial_default(default_insecure_tls())]
pub insecure_tls: bool,
#[serde(default)]
#[builder(default)]
pub external_address: String,
#[serde(default)]
#[builder(default)]
pub region: String,
#[serde(default = "default_enabled")]
#[builder(default = "default_enabled()")]
#[partial_default(default_enabled())]
pub enabled: bool,
#[serde(default = "default_auto_rotate_keys")]
#[builder(default = "default_auto_rotate_keys()")]
#[partial_default(default_auto_rotate_keys())]
pub auto_rotate_keys: bool,
#[serde(default)]
#[builder(default)]
pub passkey: String,
#[serde(default, deserialize_with = "string_list_deserializer")]
#[partial_attr(serde(
default,
deserialize_with = "option_string_list_deserializer"
))]
#[builder(default)]
pub ignore_mounts: Vec<String>,
#[serde(default = "default_auto_prune")]
#[builder(default = "default_auto_prune()")]
#[partial_default(default_auto_prune())]
pub auto_prune: bool,
#[serde(default, deserialize_with = "string_list_deserializer")]
#[partial_attr(serde(
default,
deserialize_with = "option_string_list_deserializer"
))]
#[builder(default)]
pub links: Vec<String>,
#[serde(default = "default_stats_monitoring")]
#[builder(default = "default_stats_monitoring()")]
#[partial_default(default_stats_monitoring())]
pub stats_monitoring: bool,
#[serde(default = "default_send_alerts")]
#[builder(default = "default_send_alerts()")]
#[partial_default(default_send_alerts())]
pub send_unreachable_alerts: bool,
#[serde(default = "default_send_alerts")]
#[builder(default = "default_send_alerts()")]
#[partial_default(default_send_alerts())]
pub send_cpu_alerts: bool,
#[serde(default = "default_send_alerts")]
#[builder(default = "default_send_alerts()")]
#[partial_default(default_send_alerts())]
pub send_mem_alerts: bool,
#[serde(default = "default_send_alerts")]
#[builder(default = "default_send_alerts()")]
#[partial_default(default_send_alerts())]
pub send_disk_alerts: bool,
#[serde(default = "default_send_alerts")]
#[builder(default = "default_send_alerts()")]
#[partial_default(default_send_alerts())]
pub send_version_mismatch_alerts: bool,
#[serde(default = "default_cpu_warning")]
#[builder(default = "default_cpu_warning()")]
#[partial_default(default_cpu_warning())]
pub cpu_warning: f32,
#[serde(default = "default_cpu_critical")]
#[builder(default = "default_cpu_critical()")]
#[partial_default(default_cpu_critical())]
pub cpu_critical: f32,
#[serde(default = "default_mem_warning")]
#[builder(default = "default_mem_warning()")]
#[partial_default(default_mem_warning())]
pub mem_warning: f64,
#[serde(default = "default_mem_critical")]
#[builder(default = "default_mem_critical()")]
#[partial_default(default_mem_critical())]
pub mem_critical: f64,
#[serde(default = "default_disk_warning")]
#[builder(default = "default_disk_warning()")]
#[partial_default(default_disk_warning())]
pub disk_warning: f64,
#[serde(default = "default_disk_critical")]
#[builder(default = "default_disk_critical()")]
#[partial_default(default_disk_critical())]
pub disk_critical: f64,
#[serde(default)]
#[builder(default)]
pub maintenance_windows: Vec<MaintenanceWindow>,
}
impl ServerConfig {
pub fn builder() -> ServerConfigBuilder {
ServerConfigBuilder::default()
}
}
fn default_insecure_tls() -> bool {
true
}
fn default_enabled() -> bool {
false
}
fn default_auto_rotate_keys() -> bool {
true
}
fn default_stats_monitoring() -> bool {
true
}
fn default_auto_prune() -> bool {
true
}
fn default_send_alerts() -> bool {
true
}
fn default_cpu_warning() -> f32 {
90.0
}
fn default_cpu_critical() -> f32 {
99.0
}
fn default_mem_warning() -> f64 {
75.0
}
fn default_mem_critical() -> f64 {
95.0
}
fn default_disk_warning() -> f64 {
75.0
}
fn default_disk_critical() -> f64 {
95.0
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
address: Default::default(),
insecure_tls: default_insecure_tls(),
external_address: Default::default(),
enabled: default_enabled(),
auto_rotate_keys: default_auto_rotate_keys(),
ignore_mounts: Default::default(),
stats_monitoring: default_stats_monitoring(),
auto_prune: default_auto_prune(),
links: Default::default(),
send_unreachable_alerts: default_send_alerts(),
send_cpu_alerts: default_send_alerts(),
send_mem_alerts: default_send_alerts(),
send_disk_alerts: default_send_alerts(),
send_version_mismatch_alerts: default_send_alerts(),
region: Default::default(),
passkey: Default::default(),
cpu_warning: default_cpu_warning(),
cpu_critical: default_cpu_critical(),
mem_warning: default_mem_warning(),
mem_critical: default_mem_critical(),
disk_warning: default_disk_warning(),
disk_critical: default_disk_critical(),
maintenance_windows: Default::default(),
}
}
}
#[cfg(feature = "utoipa")]
impl utoipa::PartialSchema for PartialServerConfig {
fn schema()
-> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::schema!(#[inline] std::collections::HashMap<String, serde_json::Value>).into()
}
}
#[cfg(feature = "utoipa")]
impl utoipa::ToSchema for PartialServerConfig {}
#[typeshare]
#[derive(Serialize, Deserialize, Default, Debug, Clone)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerHealthState {
pub level: SeverityLevel,
pub should_close_alert: bool,
}
#[typeshare]
#[derive(Serialize, Deserialize, Default, Debug, Clone)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerHealth {
pub cpu: ServerHealthState,
pub mem: ServerHealthState,
#[cfg_attr(feature = "utoipa", schema(value_type = HashMap<String, ServerHealthState>))]
pub disks: HashMap<PathBuf, ServerHealthState>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Default, Debug, Clone)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct PeripheryInformation {
pub version: String,
pub public_key: String,
pub terminals_disabled: bool,
pub container_terminals_disabled: bool,
pub stats_polling_rate: Timelength,
pub docker_connected: bool,
pub public_ip: Option<String>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerActionState {
pub pruning_networks: bool,
pub pruning_containers: bool,
pub pruning_images: bool,
pub pruning_volumes: bool,
pub pruning_builders: bool,
pub pruning_buildx: bool,
pub pruning_system: bool,
pub starting_containers: bool,
pub restarting_containers: bool,
pub pausing_containers: bool,
pub unpausing_containers: bool,
pub stopping_containers: bool,
}
#[typeshare]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Default,
Display,
Serialize,
Deserialize,
)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[strum(serialize_all = "kebab-case")]
pub enum ServerState {
Ok,
#[default]
NotOk,
Disabled,
}
#[typeshare]
pub type ServerQuery = ResourceQuery<ServerQuerySpecifics>;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ServerQuerySpecifics {}
impl AddFilters for ServerQuerySpecifics {}