From ea4709a409896491534a35f3d9a50e61a8fffcfe Mon Sep 17 00:00:00 2001 From: Willem Date: Wed, 4 Jun 2025 15:47:48 -0400 Subject: [PATCH] fix:binding with the ensure_ready impementation of K8sAnywhe --- .../topology/oberservability/monitoring.rs | 9 ++++ .../monitoring/discord_webhook_sender.rs | 44 +++++++++++-------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/harmony/src/domain/topology/oberservability/monitoring.rs b/harmony/src/domain/topology/oberservability/monitoring.rs index 97f040f..11f8719 100644 --- a/harmony/src/domain/topology/oberservability/monitoring.rs +++ b/harmony/src/domain/topology/oberservability/monitoring.rs @@ -1,10 +1,12 @@ use async_trait::async_trait; +use dyn_clone::DynClone; use serde::Serialize; use std::fmt::Debug; use crate::interpret::InterpretError; +use crate::inventory::Inventory; use crate::{interpret::Outcome, topology::Topology}; /// Represents an entity responsible for collecting and organizing observability data @@ -26,6 +28,13 @@ pub trait Monitor: Debug + Send + Sync { ) -> Result; } +#[async_trait] +pub trait EnsureAlertReceiver: Debug + DynClone + Send + Sync { + async fn ensure_alert_receiver(&self, inventory: Inventory, topology: &T) -> Result; +} + +dyn_clone::clone_trait_object!( EnsureAlertReceiver); + #[derive(Debug, Clone, Serialize)] pub struct AlertReceiver { pub receiver_id: String, diff --git a/harmony/src/modules/monitoring/discord_webhook_sender.rs b/harmony/src/modules/monitoring/discord_webhook_sender.rs index f87ba0c..843655b 100644 --- a/harmony/src/modules/monitoring/discord_webhook_sender.rs +++ b/harmony/src/modules/monitoring/discord_webhook_sender.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use super::discord_alert_manager::discord_alert_manager_score; use async_trait::async_trait; use serde::Serialize; @@ -13,7 +11,7 @@ use crate::{ inventory::Inventory, score::Score, topology::{ - HelmCommand, K8sAnywhereTopology, Topology, oberservability::monitoring::AlertReceiver, + oberservability::monitoring::{AlertReceiver, EnsureAlertReceiver}, HelmCommand, K8sAnywhereTopology, Topology }, }; @@ -24,10 +22,18 @@ pub struct DiscordWebhookConfig { pub send_resolved_notifications: bool, } +#[async_trait] +impl EnsureAlertReceiver for DiscordWebhookConfig { + async fn ensure_alert_receiver(&self, inventory: Inventory, topology: &T) -> Result { + topology.ensure_discord_webhook_receiver(&inventory, self.clone()).await + } +} + #[async_trait] pub trait DiscordWebhookReceiver { - async fn deploy_discord_webhook_receiver( + async fn ensure_discord_webhook_receiver( &self, + inventory: &Inventory, config: DiscordWebhookConfig, ) -> Result; fn delete_discord_webhook_receiver( @@ -36,21 +42,11 @@ pub trait DiscordWebhookReceiver { ) -> Result; } -pub trait AlertManagerConfig { - fn get_alert_manager_config(&self) -> Result; -} - -#[async_trait] -impl AlertManagerConfig for DiscordWebhookConfig { - fn get_alert_manager_config(&self) -> Result { - todo!() - } -} - #[async_trait] impl DiscordWebhookReceiver for K8sAnywhereTopology { - async fn deploy_discord_webhook_receiver( + async fn ensure_discord_webhook_receiver( &self, + inventory: &Inventory, config: DiscordWebhookConfig, ) -> Result { let receiver_key = config.name.clone(); @@ -69,7 +65,7 @@ impl DiscordWebhookReceiver for K8sAnywhereTopology { let final_state = cell .get_or_try_init(|| async { - initialize_discord_webhook_receiver(config.clone(), self).await + initialize_discord_webhook_receiver(config.clone(), inventory, self).await }) .await?; @@ -89,6 +85,7 @@ impl DiscordWebhookReceiver for K8sAnywhereTopology { async fn initialize_discord_webhook_receiver( conf: DiscordWebhookConfig, + inventory: &Inventory, topology: &K8sAnywhereTopology, ) -> Result { println!( @@ -98,7 +95,6 @@ async fn initialize_discord_webhook_receiver( let score = DiscordWebhookReceiverScore { config: conf.clone(), }; - let inventory = Inventory::autoload(); let interpret = score.create_interpret(); interpret.execute(&inventory, topology).await?; @@ -108,6 +104,18 @@ async fn initialize_discord_webhook_receiver( receiver_installed: true, }) } + +pub trait AlertManagerConfig { + fn get_alert_manager_config(&self) -> Result; +} + +#[async_trait] +impl AlertManagerConfig for DiscordWebhookConfig { + fn get_alert_manager_config(&self) -> Result { + todo!() + } +} + #[derive(Debug, Clone, Serialize)] struct DiscordWebhookReceiverScore { config: DiscordWebhookConfig,