feat: introduce Maestro::initialize function that creates the maestro instance and ensure_ready the topology as well. Also refactor all relevant examples to use this new initialize function #18
							
								
								
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -961,6 +961,7 @@ dependencies = [ | ||||
|  "harmony", | ||||
|  "harmony_macros", | ||||
|  "http 1.3.1", | ||||
|  "inquire", | ||||
|  "k8s-openapi", | ||||
|  "kube", | ||||
|  "log", | ||||
|  | ||||
| @ -2,14 +2,14 @@ use harmony::{ | ||||
|     inventory::Inventory, | ||||
|     maestro::Maestro, | ||||
|     modules::dummy::{ErrorScore, PanicScore, SuccessScore}, | ||||
|     topology::HAClusterTopology, | ||||
|     topology::LocalhostTopology, | ||||
| }; | ||||
| 
 | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
|     let inventory = Inventory::autoload(); | ||||
|     let topology = HAClusterTopology::autoload(); | ||||
|     let mut maestro = Maestro::new(inventory, topology); | ||||
|     let topology = LocalhostTopology::new(); | ||||
|     let mut maestro = Maestro::initialize(inventory, topology).await.unwrap(); | ||||
| 
 | ||||
|     maestro.register_all(vec![ | ||||
|         Box::new(SuccessScore {}), | ||||
|  | ||||
| @ -18,3 +18,4 @@ kube = "0.98.0" | ||||
| k8s-openapi = { version = "0.24.0", features = [ "v1_30" ] } | ||||
| http = "1.2.0" | ||||
| serde_yaml = "0.9.34" | ||||
| inquire.workspace = true | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| use std::collections::BTreeMap; | ||||
| 
 | ||||
| use harmony_macros::yaml; | ||||
| use inquire::Confirm; | ||||
| use k8s_openapi::{ | ||||
|     api::{ | ||||
|         apps::v1::{Deployment, DeploymentSpec}, | ||||
| @ -15,6 +16,17 @@ use kube::{ | ||||
| 
 | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
|     let confirmation = Confirm::new( | ||||
|         "This will install various ressources to your default kubernetes cluster. Are you sure?", | ||||
|     ) | ||||
|     .with_default(false) | ||||
|     .prompt() | ||||
|     .expect("Unexpected prompt error"); | ||||
| 
 | ||||
|     if !confirmation { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     let client = Client::try_default() | ||||
|         .await | ||||
|         .expect("Should instanciate client from defaults"); | ||||
|  | ||||
| @ -9,7 +9,7 @@ use harmony::{ | ||||
| async fn main() { | ||||
|     let inventory = Inventory::autoload(); | ||||
|     let topology = HAClusterTopology::autoload(); | ||||
|     let mut maestro = Maestro::new(inventory, topology); | ||||
|     let mut maestro = Maestro::initialize(inventory, topology).await.unwrap(); | ||||
| 
 | ||||
|     maestro.register_all(vec![ | ||||
|         // ADD scores :
 | ||||
|  | ||||
| @ -84,7 +84,7 @@ async fn main() { | ||||
|     let http_score = HttpScore::new(Url::LocalFolder( | ||||
|         "./data/watchguard/pxe-http-files".to_string(), | ||||
|     )); | ||||
|     let mut maestro = Maestro::new(inventory, topology); | ||||
|     let mut maestro = Maestro::initialize(inventory, topology).await.unwrap(); | ||||
|     maestro.register_all(vec![ | ||||
|         Box::new(dns_score), | ||||
|         Box::new(dhcp_score), | ||||
|  | ||||
| @ -9,8 +9,7 @@ use harmony::{ | ||||
|         load_balancer::LoadBalancerScore, | ||||
|     }, | ||||
|     topology::{ | ||||
|         BackendServer, HAClusterTopology, HealthCheck, HttpMethod, HttpStatusCode, | ||||
|         LoadBalancerService, | ||||
|         BackendServer, DummyInfra, HealthCheck, HttpMethod, HttpStatusCode, LoadBalancerService, | ||||
|     }, | ||||
| }; | ||||
| use harmony_macros::ipv4; | ||||
| @ -18,8 +17,8 @@ use harmony_macros::ipv4; | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
|     let inventory = Inventory::autoload(); | ||||
|     let topology = HAClusterTopology::autoload(); | ||||
|     let mut maestro = Maestro::new(inventory, topology); | ||||
|     let topology = DummyInfra {}; | ||||
|     let mut maestro = Maestro::initialize(inventory, topology).await.unwrap(); | ||||
| 
 | ||||
|     maestro.register_all(vec![ | ||||
|         Box::new(SuccessScore {}), | ||||
|  | ||||
| @ -28,6 +28,12 @@ impl<T: Topology> Maestro<T> { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub async fn initialize(inventory: Inventory, topology: T) -> Result<Self, InterpretError> { | ||||
|         let instance = Self::new(inventory, topology); | ||||
|         instance.prepare_topology().await?; | ||||
|         Ok(instance) | ||||
|     } | ||||
| 
 | ||||
|     /// Ensures the associated Topology is ready for operations.
 | ||||
|     /// Delegates the readiness check and potential setup actions to the Topology.
 | ||||
|     pub async fn prepare_topology(&self) -> Result<Outcome, InterpretError> { | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| use async_trait::async_trait; | ||||
| use harmony_macros::ip; | ||||
| use harmony_types::net::MacAddress; | ||||
| use log::info; | ||||
| 
 | ||||
| use crate::executors::ExecutorError; | ||||
| use crate::interpret::InterpretError; | ||||
| @ -223,7 +224,20 @@ impl HttpServer for HAClusterTopology { | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| struct DummyInfra; | ||||
| pub struct DummyInfra; | ||||
| 
 | ||||
| #[async_trait] | ||||
| impl Topology for DummyInfra { | ||||
|     fn name(&self) -> &str { | ||||
|         todo!() | ||||
|     } | ||||
| 
 | ||||
|     async fn ensure_ready(&self) -> Result<Outcome, InterpretError> { | ||||
|         let dummy_msg = "This is a dummy infrastructure that does nothing"; | ||||
|         info!("{dummy_msg}"); | ||||
|         Ok(Outcome::success(dummy_msg.to_string())) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| const UNIMPLEMENTED_DUMMY_INFRA: &str = "This is a dummy infrastructure, no operation is supported"; | ||||
| 
 | ||||
|  | ||||
| @ -62,7 +62,7 @@ impl K8sAnywhereTopology { | ||||
|     } | ||||
| 
 | ||||
|     async fn try_install_k3d(&self) -> Result<K8sClient, InterpretError> { | ||||
|         let maestro = Maestro::new(Inventory::autoload(), LocalhostTopology::new()); | ||||
|         let maestro = Maestro::initialize(Inventory::autoload(), LocalhostTopology::new()).await?; | ||||
|         let k3d_score = K3DInstallationScore::new(); | ||||
|         maestro.interpret(Box::new(k3d_score)).await?; | ||||
|         todo!( | ||||
|  | ||||
| @ -370,13 +370,10 @@ mod tests { | ||||
|         let result = get_servers_for_backend(&backend, &haproxy); | ||||
| 
 | ||||
|         // Check the result
 | ||||
|         assert_eq!( | ||||
|             result, | ||||
|             vec![BackendServer { | ||||
|         assert_eq!(result, vec![BackendServer { | ||||
|             address: "192.168.1.1".to_string(), | ||||
|             port: 80, | ||||
|             },] | ||||
|         ); | ||||
|         },]); | ||||
|     } | ||||
|     #[test] | ||||
|     fn test_get_servers_for_backend_no_linked_servers() { | ||||
| @ -433,9 +430,7 @@ mod tests { | ||||
|         // Call the function
 | ||||
|         let result = get_servers_for_backend(&backend, &haproxy); | ||||
|         // Check the result
 | ||||
|         assert_eq!( | ||||
|             result, | ||||
|             vec![ | ||||
|         assert_eq!(result, vec![ | ||||
|             BackendServer { | ||||
|                 address: "some-hostname.test.mcd".to_string(), | ||||
|                 port: 80, | ||||
| @ -444,7 +439,6 @@ mod tests { | ||||
|                 address: "192.168.1.2".to_string(), | ||||
|                 port: 8080, | ||||
|             }, | ||||
|             ] | ||||
|         ); | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user