diff --git a/examples/rhob_application_monitoring/src/main.rs b/examples/rhob_application_monitoring/src/main.rs index fdcff48..14ef2bd 100644 --- a/examples/rhob_application_monitoring/src/main.rs +++ b/examples/rhob_application_monitoring/src/main.rs @@ -4,8 +4,7 @@ use harmony::{ inventory::Inventory, modules::{ application::{ - ApplicationScore, RustWebFramework, RustWebapp, - features::rhob_monitoring::RHOBMonitoring, + ApplicationScore, RustWebFramework, RustWebapp, features::rhob_monitoring::Monitoring, }, monitoring::alert_channel::discord_alert_channel::DiscordWebhook, }, @@ -29,7 +28,7 @@ async fn main() { let app = ApplicationScore { features: vec![ - Box::new(RHOBMonitoring { + Box::new(Monitoring { application: application.clone(), alert_receiver: vec![Box::new(discord_receiver)], }), diff --git a/examples/rust/src/main.rs b/examples/rust/src/main.rs index ff6d769..624cc88 100644 --- a/examples/rust/src/main.rs +++ b/examples/rust/src/main.rs @@ -5,7 +5,7 @@ use harmony::{ modules::{ application::{ ApplicationScore, RustWebFramework, RustWebapp, - features::{ContinuousDelivery, Monitoring}, + features::{Monitoring, PackagingDeployment}, }, monitoring::alert_channel::{ discord_alert_channel::DiscordWebhook, webhook_receiver::WebhookReceiver, @@ -36,7 +36,7 @@ async fn main() { let app = ApplicationScore { features: vec![ - Box::new(ContinuousDelivery { + Box::new(PackagingDeployment { application: application.clone(), }), Box::new(Monitoring { diff --git a/examples/try_rust_webapp/files_to_add/Cargo.toml b/examples/try_rust_webapp/files_to_add/Cargo.toml.to_add similarity index 100% rename from examples/try_rust_webapp/files_to_add/Cargo.toml rename to examples/try_rust_webapp/files_to_add/Cargo.toml.to_add diff --git a/examples/try_rust_webapp/files_to_add/main.rs b/examples/try_rust_webapp/files_to_add/main.rs index ce96763..a4ab320 100644 --- a/examples/try_rust_webapp/files_to_add/main.rs +++ b/examples/try_rust_webapp/files_to_add/main.rs @@ -3,7 +3,7 @@ use harmony::{ modules::{ application::{ ApplicationScore, RustWebFramework, RustWebapp, - features::{ContinuousDelivery, Monitoring, rhob_monitoring::RHOBMonitoring}, + features::{PackagingDeployment, rhob_monitoring::Monitoring}, }, monitoring::alert_channel::discord_alert_channel::DiscordWebhook, }, @@ -21,14 +21,19 @@ async fn main() { service_port: 8080, }); + let discord_webhook = DiscordWebhook { + name: "harmony_demo".to_string(), + url: hurl!("http://not_a_url.com"), + }; + let app = ApplicationScore { features: vec![ - Box::new(ContinuousDelivery { + Box::new(PackagingDeployment { application: application.clone(), }), - Box::new(RHOBMonitoring { + Box::new(Monitoring { application: application.clone(), - alert_receiver: vec![], + alert_receiver: vec![Box::new(discord_webhook)], }), ], application, diff --git a/examples/try_rust_webapp/src/main.rs b/examples/try_rust_webapp/src/main.rs index 26a1958..977ca16 100644 --- a/examples/try_rust_webapp/src/main.rs +++ b/examples/try_rust_webapp/src/main.rs @@ -3,7 +3,7 @@ use harmony::{ modules::{ application::{ ApplicationScore, RustWebFramework, RustWebapp, - features::{ContinuousDelivery, Monitoring, rhob_monitoring::RHOBMonitoring}, + features::{PackagingDeployment, rhob_monitoring::Monitoring}, }, monitoring::alert_channel::discord_alert_channel::DiscordWebhook, }, @@ -28,10 +28,10 @@ async fn main() { let app = ApplicationScore { features: vec![ - Box::new(ContinuousDelivery { + Box::new(PackagingDeployment { application: application.clone(), }), - Box::new(RHOBMonitoring { + Box::new(Monitoring { application: application.clone(), alert_receiver: vec![Box::new(discord_receiver)], }), diff --git a/harmony/src/domain/topology/localhost.rs b/harmony/src/domain/topology/localhost.rs index 71a8b93..667b3f8 100644 --- a/harmony/src/domain/topology/localhost.rs +++ b/harmony/src/domain/topology/localhost.rs @@ -1,9 +1,10 @@ use async_trait::async_trait; use derive_new::new; +use serde::{Deserialize, Serialize}; use super::{HelmCommand, PreparationError, PreparationOutcome, Topology}; -#[derive(new)] +#[derive(new, Clone, Debug, Serialize, Deserialize)] pub struct LocalhostTopology; #[async_trait] diff --git a/harmony/src/modules/application/features/mod.rs b/harmony/src/modules/application/features/mod.rs index 93f6412..f2500db 100644 --- a/harmony/src/modules/application/features/mod.rs +++ b/harmony/src/modules/application/features/mod.rs @@ -5,8 +5,8 @@ pub use endpoint::*; mod monitoring; pub use monitoring::*; -mod continuous_delivery; -pub use continuous_delivery::*; +mod packaging_deployment; +pub use packaging_deployment::*; mod helm_argocd_score; pub use helm_argocd_score::*; diff --git a/harmony/src/modules/application/features/continuous_delivery.rs b/harmony/src/modules/application/features/packaging_deployment.rs similarity index 98% rename from harmony/src/modules/application/features/continuous_delivery.rs rename to harmony/src/modules/application/features/packaging_deployment.rs index beb422d..4fafbf0 100644 --- a/harmony/src/modules/application/features/continuous_delivery.rs +++ b/harmony/src/modules/application/features/packaging_deployment.rs @@ -47,11 +47,11 @@ use crate::{ /// - ArgoCD to install/upgrade/rollback/inspect k8s resources /// - Kubernetes for runtime orchestration #[derive(Debug, Default, Clone)] -pub struct ContinuousDelivery { +pub struct PackagingDeployment { pub application: Arc, } -impl ContinuousDelivery { +impl PackagingDeployment { async fn deploy_to_local_k3d( &self, app_name: String, @@ -139,7 +139,7 @@ impl ContinuousDelivery { impl< A: OCICompliant + HelmPackage + Clone + 'static, T: Topology + HelmCommand + MultiTargetTopology + K8sclient + Ingress + 'static, -> ApplicationFeature for ContinuousDelivery +> ApplicationFeature for PackagingDeployment { async fn ensure_installed( &self, diff --git a/harmony/src/modules/application/features/rhob_monitoring.rs b/harmony/src/modules/application/features/rhob_monitoring.rs index 9075751..36cc859 100644 --- a/harmony/src/modules/application/features/rhob_monitoring.rs +++ b/harmony/src/modules/application/features/rhob_monitoring.rs @@ -27,7 +27,7 @@ use harmony_types::net::Url; use log::{debug, info}; #[derive(Debug, Clone)] -pub struct RHOBMonitoring { +pub struct Monitoring { pub application: Arc, pub alert_receiver: Vec>>, } @@ -43,7 +43,7 @@ impl< + Ingress + std::fmt::Debug + PrometheusApplicationMonitoring, -> ApplicationFeature for RHOBMonitoring +> ApplicationFeature for Monitoring { async fn ensure_installed( &self, diff --git a/harmony/src/modules/application/rust.rs b/harmony/src/modules/application/rust.rs index 58dc046..ddbf0a8 100644 --- a/harmony/src/modules/application/rust.rs +++ b/harmony/src/modules/application/rust.rs @@ -10,7 +10,7 @@ use dockerfile_builder::Dockerfile; use dockerfile_builder::instruction::{CMD, COPY, ENV, EXPOSE, FROM, RUN, USER, WORKDIR}; use dockerfile_builder::instruction_builder::CopyBuilder; use futures_util::StreamExt; -use log::{debug, info, log_enabled}; +use log::{debug, error, info, log_enabled, trace, warn}; use serde::Serialize; use tar::{Builder, Header}; use walkdir::WalkDir; @@ -162,7 +162,7 @@ impl RustWebapp { &self, image_name: &str, ) -> Result> { - debug!("Generating Dockerfile for '{}'", self.name); + info!("Generating Dockerfile for '{}'", self.name); let dockerfile = self.get_or_build_dockerfile(); let quiet = !log_enabled!(log::Level::Debug); match dockerfile @@ -194,8 +194,41 @@ impl RustWebapp { Some(body_full(tar_data.into())), ); - while let Some(msg) = image_build_stream.next().await { - debug!("Message: {msg:?}"); + while let Some(mut msg) = image_build_stream.next().await { + trace!("Got bollard msg {msg:?}"); + match msg { + Ok(mut msg) => { + if let Some(progress) = msg.progress_detail { + info!( + "Build progress {}/{}", + progress.current.unwrap_or(0), + progress.total.unwrap_or(0) + ); + } + + if let Some(mut log) = msg.stream { + if log.ends_with('\n') { + log.pop(); + if log.ends_with('\r') { + log.pop(); + } + } + info!("{log}"); + } + + if let Some(error) = msg.error { + warn!("Build error : {error:?}"); + } + + if let Some(error) = msg.error_detail { + warn!("Build error : {error:?}"); + } + } + Err(e) => { + error!("Build failed : {e}"); + return Err(format!("Build failed : {e}").into()); + } + } } Ok(image_name.to_string())