use std::collections::HashMap;
use std::fmt::{Debug, Display, Formatter};
use std::path::PathBuf;
use decimal_percentage::Percentage;
use nix::unistd::Pid;
use serde::{Serialize, Serializer};
use crate::Leadership;
use crate::o11y::{Cpu, Disk, LoadAvg, MemStats, NetIO, SwapStats};
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub enum ChangeKind {
Created,
Modified,
Removed,
Other,
}
impl ChangeKind {
pub(crate) fn from_notify_kind(kind: ¬ify::EventKind) -> Self {
match kind {
notify::EventKind::Create(_) => Self::Created,
notify::EventKind::Modify(_) => Self::Modified,
notify::EventKind::Remove(_) => Self::Removed,
_ => Self::Other,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct ConfigChange {
pub kind: ChangeKind,
pub paths: Vec<PathBuf>,
pub main_config_changed: bool,
pub supplemental_paths: Vec<PathBuf>,
}
impl ConfigChange {
pub fn new(kind: ChangeKind, main_config_path: PathBuf, paths: Vec<PathBuf>) -> Self {
let main_config_changed = paths.iter().any(|path| path == &main_config_path);
let supplemental_paths = paths.iter().filter(|path| *path != &main_config_path).cloned().collect();
Self {
kind,
paths,
main_config_changed,
supplemental_paths,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub struct SecretChange {
pub kind: ChangeKind,
pub paths: Vec<PathBuf>,
}
impl SecretChange {
pub fn new(kind: ChangeKind, paths: Vec<PathBuf>) -> Self {
Self { kind, paths }
}
}
#[derive(Clone, Debug)]
pub struct ProcessId(pub Pid);
impl Serialize for ProcessId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_i32(self.0.as_raw())
}
}
#[derive(Clone, Debug, Serialize)]
pub enum SystemResourceStat {
CPU(Cpu),
Disk(HashMap<String, Disk>),
Load(LoadAvg),
Memory(MemStats),
NetworkIO(HashMap<String, NetIO>),
Swap(SwapStats),
}
#[derive(Clone, Debug, Serialize)]
pub enum ControlEvent {
ReloadConfiguration,
Suspend(Option<chrono::NaiveDateTime>),
Shutdown(Option<chrono::NaiveDateTime>),
LogRotation,
}
#[derive(Clone, Debug, Serialize)]
pub enum Event<T> {
Control(ControlEvent),
SystemResource(SystemResourceStat),
SystemResourceCPUThreshold(Percentage, Cpu),
SystemResourceLoadThreshold(Percentage, LoadAvg),
SystemResourceMemoryThreshold(Percentage, MemStats),
ConfigChanged(ConfigChange),
SecretChanged(SecretChange),
LeadershipChanged(Leadership, Leadership),
App(T),
}
impl<T: Debug> Display for Event<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}