feat: added Score and topology to create kube prometheus monitoring and alerting stack

This commit is contained in:
Willem 2025-05-05 12:49:28 -04:00
parent a6bcaade46
commit 2f8e150f41
5 changed files with 79 additions and 35 deletions

View File

@ -1,3 +1,4 @@
pub mod monitoring_alerting;
mod ha_cluster;
mod host_binding;
mod http;

View File

@ -1,4 +1,3 @@
use std::str::FromStr;
use non_blank_string_rs::NonBlankString;

View File

@ -1,3 +1,3 @@
mod monitoring_alerting;
mod resources;
pub use monitoring_alerting::*;
pub mod monitoring_alerting;
mod kube_prometheus;

View File

@ -1,58 +1,103 @@
use async_trait::async_trait;
use serde::Serialize;
use crate::{
interpret::Interpret,
maestro::Maestro,
data::{Id, Version},
interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome},
inventory::Inventory,
maestro::{self, Maestro},
modules::helm::chart::HelmChartScore,
score::Score,
topology::{K8sclient, Topology},
score::{CloneBoxScore, Score},
topology::{K8sclient, Topology, monitoring_alerting::MonitoringAlertingTopology},
};
#[derive(Debug, Clone, Serialize)]
use super::kube_prometheus::kube_prometheus_score;
#[derive(Debug)]
pub struct MonitoringAlertingStackScore {
monitoring: HelmChartScore,
pub monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>,
}
impl Default for MonitoringAlertingStackScore {
fn default() -> Self {
let ns = "monitoring";
Self {
monitoring_stack: vec![
Box::new(kube_prometheus_score(ns)) as Box<dyn Score<MonitoringAlertingTopology>>,
],
}
}
}
impl Clone for MonitoringAlertingStackScore {
fn clone(&self) -> Self {
Self {
monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(),
}
}
}
impl Serialize for MonitoringAlertingStackScore {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut s = serializer.serialize_struct("MonitoringAlertingStackScore", 1)?;
let monitoring_values: Vec<_> = self.monitoring_stack.iter().map(|m| m.serialize()).collect();
s.serialize_field("monitoring", &monitoring_values)?;
s.end()
}
}
impl<T: Topology> Score<T> for MonitoringAlertingStackScore {
fn create_interpret(&self) -> Box<dyn Interpret<T>> {
Box::new(MonitoringAlertingStackInterpret {
score: self.clone(),
score: MonitoringAlertingStackScore {
monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(),
},
})
}
fn name(&self) -> String {
format!(
"{} {} MonitoringAlertingStackScore",
self.monitoring.chart_name, self.monitoring.release_name
)
format!("MonitoringAlertingStackScore")
}
}
#[derive(Debug, Serialize)]
#[derive(Debug)]
struct MonitoringAlertingStackInterpret {
pub score: MonitoringAlertingStackScore,
}
impl MonitoringAlertingStackInterpret {
pub async fn build_monitoring_stack(
&self,
monitoring_stack: MonitoringAlertingStackScore,
) -> Result<Outcome, InterpretError> {
let inventory = Inventory::autoload();
let topology = MonitoringAlertingTopology::new();
let mut maestro = match Maestro::initialize(inventory, topology).await {
Ok(m) => m,
Err(e) => {
println!("failed to initialize Maestro: {}", e);
std::process::exit(1);
}
};
maestro.register_all(monitoring_stack.monitoring_stack);
Ok(Outcome::success(format!(
"installed kube-prometheus monitoring and alerting stack"
)))
}
}
#[async_trait]
impl<T: Topology> Interpret<T> for MonitoringAlertingStackInterpret {
fn execute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
inventory: &'life1 Inventory,
topology: &'life2 T,
) -> ::core::pin::Pin<
Box<
dyn ::core::future::Future<Output = Result<Outcome, InterpretError>>
+ ::core::marker::Send
+ 'async_trait,
>,
>
where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
{
todo!()
async fn execute(
&self,
_inventory: &Inventory,
_topology: &T,
) -> Result<Outcome, InterpretError> {
self.build_monitoring_stack(self.score.clone()).await
}
fn get_name(&self) -> InterpretName {

View File

@ -1 +0,0 @@
mod kube_prometheus;