monitoring-alerting #30
| @ -15,24 +15,32 @@ use crate::{ | |||||||
|     inventory::Inventory, |     inventory::Inventory, | ||||||
|     maestro::Maestro, |     maestro::Maestro, | ||||||
|     modules::monitoring::monitoring_alerting::MonitoringAlertingStackScore, |     modules::monitoring::monitoring_alerting::MonitoringAlertingStackScore, | ||||||
|  |     score::Score, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::{HelmCommand, Topology}; | use super::{HelmCommand, K8sAnywhereTopology, Topology}; | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug)] | #[derive(Clone, Debug)] | ||||||
| struct MonitoringState { | struct MonitoringState { | ||||||
|     message: String, |     message: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug)] | #[derive(Debug)] | ||||||
| pub struct MonitoringAlertingTopology { | pub struct MonitoringAlertingTopology { | ||||||
|     monitoring_state: OnceCell<Option<MonitoringState>>, |     monitoring_state: OnceCell<Option<MonitoringState>>, | ||||||
|  |     namespace: String, | ||||||
|  |     monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl MonitoringAlertingTopology { | impl MonitoringAlertingTopology { | ||||||
|     pub fn new() -> Self { |     pub fn new( | ||||||
|  |         namespace: String, | ||||||
|  |         monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>, | ||||||
|  |     ) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             monitoring_state: OnceCell::new(), |             monitoring_state: OnceCell::new(), | ||||||
|  |             namespace, | ||||||
|  |             monitoring_stack, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -78,7 +86,7 @@ impl MonitoringAlertingTopology { | |||||||
|         &self, |         &self, | ||||||
|     ) -> Result<Option<MonitoringState>, InterpretError> { |     ) -> Result<Option<MonitoringState>, InterpretError> { | ||||||
|         let inventory = Inventory::autoload(); |         let inventory = Inventory::autoload(); | ||||||
|         let topology = MonitoringAlertingTopology::new(); |         let topology = K8sAnywhereTopology::new(); | ||||||
|         let mut maestro = match Maestro::initialize(inventory, topology).await { |         let mut maestro = match Maestro::initialize(inventory, topology).await { | ||||||
|             Ok(m) => m, |             Ok(m) => m, | ||||||
|             Err(e) => { |             Err(e) => { | ||||||
| @ -86,7 +94,7 @@ impl MonitoringAlertingTopology { | |||||||
|                 std::process::exit(1); |                 std::process::exit(1); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|         maestro.register_all(vec![Box::new(MonitoringAlertingStackScore::default())]); |         maestro.register_all(vec![Box::new(MonitoringAlertingStackScore::new(self.monitoring_stack.clone(), self.namespace.clone()))]); | ||||||
|         let state = match self.get_monitoring_state().await { |         let state = match self.get_monitoring_state().await { | ||||||
|             Ok(_) => MonitoringState { |             Ok(_) => MonitoringState { | ||||||
|                 message: "Monitoring Stack Ready".to_string(), |                 message: "Monitoring Stack Ready".to_string(), | ||||||
| @ -98,6 +106,12 @@ impl MonitoringAlertingTopology { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | impl<T: Topology> Clone for Box<dyn Score<T>> { | ||||||
|  |     fn clone(&self) -> Box<dyn Score<T>> { | ||||||
|  |         self.clone_box() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[async_trait] | #[async_trait] | ||||||
| impl Topology for MonitoringAlertingTopology { | impl Topology for MonitoringAlertingTopology { | ||||||
|     fn name(&self) -> &str { |     fn name(&self) -> &str { | ||||||
| @ -108,7 +122,8 @@ impl Topology for MonitoringAlertingTopology { | |||||||
|         let state = if let Some(state) = self.get_monitoring_state().await? { |         let state = if let Some(state) = self.get_monitoring_state().await? { | ||||||
|             state |             state | ||||||
|         } else { |         } else { | ||||||
|             self.try_install_monitoring_stack().await? |             self.try_install_monitoring_stack() | ||||||
|  |                 .await? | ||||||
|                 .ok_or_else(|| InterpretError::new("Failed to install monitoring stack".into()))? |                 .ok_or_else(|| InterpretError::new("Failed to install monitoring stack".into()))? | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,10 +13,16 @@ use crate::{ | |||||||
| 
 | 
 | ||||||
| use super::kube_prometheus::kube_prometheus_score; | use super::kube_prometheus::kube_prometheus_score; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct MonitoringAlertingStackScore { | pub struct MonitoringAlertingStackScore { | ||||||
|     pub monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>, |     pub monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>, | ||||||
|  |     pub namespace: String, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl MonitoringAlertingStackScore { | ||||||
|  |     pub fn new(monitoring_stack: Vec<Box<dyn Score<MonitoringAlertingTopology>>>, namespace: String) -> Self { | ||||||
|  |         Self { monitoring_stack, namespace } | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for MonitoringAlertingStackScore { | impl Default for MonitoringAlertingStackScore { | ||||||
| @ -24,15 +30,21 @@ impl Default for MonitoringAlertingStackScore { | |||||||
|         let ns = "monitoring"; |         let ns = "monitoring"; | ||||||
|         Self { |         Self { | ||||||
|             monitoring_stack: vec![ |             monitoring_stack: vec![ | ||||||
|                 Box::new(kube_prometheus_score(ns)) as Box<dyn Score<MonitoringAlertingTopology>>, |                 Box::new(kube_prometheus_score(ns)) as Box<dyn Score<MonitoringAlertingTopology>> | ||||||
|             ], |             ], | ||||||
|  |             namespace: ns.to_string() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| impl Clone for MonitoringAlertingStackScore { | impl Clone for MonitoringAlertingStackScore { | ||||||
|     fn clone(&self) -> Self { |     fn clone(&self) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(), |             monitoring_stack: self | ||||||
|  |                 .monitoring_stack | ||||||
|  |                 .iter() | ||||||
|  |                 .map(|s| s.clone_box()) | ||||||
|  |                 .collect(), | ||||||
|  |             namespace: self.namespace.clone(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -44,7 +56,11 @@ impl Serialize for MonitoringAlertingStackScore { | |||||||
|     { |     { | ||||||
|         use serde::ser::SerializeStruct; |         use serde::ser::SerializeStruct; | ||||||
|         let mut s = serializer.serialize_struct("MonitoringAlertingStackScore", 1)?; |         let mut s = serializer.serialize_struct("MonitoringAlertingStackScore", 1)?; | ||||||
|         let monitoring_values: Vec<_> = self.monitoring_stack.iter().map(|m| m.serialize()).collect(); |         let monitoring_values: Vec<_> = self | ||||||
|  |             .monitoring_stack | ||||||
|  |             .iter() | ||||||
|  |             .map(|m| m.serialize()) | ||||||
|  |             .collect(); | ||||||
|         s.serialize_field("monitoring", &monitoring_values)?; |         s.serialize_field("monitoring", &monitoring_values)?; | ||||||
|         s.end() |         s.end() | ||||||
|     } |     } | ||||||
| @ -54,7 +70,12 @@ impl<T: Topology> Score<T> for MonitoringAlertingStackScore { | |||||||
|     fn create_interpret(&self) -> Box<dyn Interpret<T>> { |     fn create_interpret(&self) -> Box<dyn Interpret<T>> { | ||||||
|         Box::new(MonitoringAlertingStackInterpret { |         Box::new(MonitoringAlertingStackInterpret { | ||||||
|             score: MonitoringAlertingStackScore { |             score: MonitoringAlertingStackScore { | ||||||
|                 monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(), |                 monitoring_stack: self | ||||||
|  |                     .monitoring_stack | ||||||
|  |                     .iter() | ||||||
|  |                     .map(|s| s.clone_box()) | ||||||
|  |                     .collect(), | ||||||
|  |                 namespace: self.namespace.clone(), | ||||||
|             }, |             }, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| @ -69,7 +90,6 @@ struct MonitoringAlertingStackInterpret { | |||||||
|     pub score: MonitoringAlertingStackScore, |     pub score: MonitoringAlertingStackScore, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #[async_trait] | #[async_trait] | ||||||
| impl<T: Topology> Interpret<T> for MonitoringAlertingStackInterpret { | impl<T: Topology> Interpret<T> for MonitoringAlertingStackInterpret { | ||||||
|     async fn execute( |     async fn execute( | ||||||
| @ -77,8 +97,18 @@ impl<T: Topology> Interpret<T> for MonitoringAlertingStackInterpret { | |||||||
|         _inventory: &Inventory, |         _inventory: &Inventory, | ||||||
|         _topology: &T, |         _topology: &T, | ||||||
|     ) -> Result<Outcome, InterpretError> { |     ) -> Result<Outcome, InterpretError> { | ||||||
|        todo!() 
 |         let inventory = Inventory::autoload(); | ||||||
|  |         let topology = MonitoringAlertingTopology::new(self.score.namespace.clone(), self.score.monitoring_stack.clone()); | ||||||
|  |         let mut maestro = match Maestro::initialize(inventory, topology).await { | ||||||
|  |             Ok(m) => m, | ||||||
|  |             Err(e) => { | ||||||
|  |                 println!("failed to initialize Maestro: {}", e); | ||||||
|  |                 std::process::exit(1); | ||||||
|             } |             } | ||||||
|  |         }; | ||||||
|  |         Ok(Outcome::success(format!("monitoring stack installed in {} namespace",self.score.namespace ))) | ||||||
|  |     } | ||||||
|  |     
 | ||||||
| 
 | 
 | ||||||
|     fn get_name(&self) -> InterpretName { |     fn get_name(&self) -> InterpretName { | ||||||
|         todo!() |         todo!() | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user