Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			runtime-pr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2f7c4924c1 | 
| @ -2,9 +2,10 @@ use harmony::{ | ||||
|     data::Version, | ||||
|     inventory::Inventory, | ||||
|     maestro::Maestro, | ||||
|     modules::lamp::{LAMPConfig, LAMPScore}, | ||||
|     modules::lamp::{LAMPConfig, LAMPProfile, LAMPScore}, | ||||
|     topology::{K8sAnywhereTopology, Url}, | ||||
| }; | ||||
| use std::collections::HashMap; | ||||
| 
 | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
| @ -17,6 +18,10 @@ async fn main() { | ||||
|             project_root: "./php".into(), | ||||
|             ..Default::default() | ||||
|         }, | ||||
|         profiles: HashMap::from([ | ||||
|             ("dev", LAMPProfile { ssl_enabled: false }), | ||||
|             ("prod", LAMPProfile { ssl_enabled: true }), | ||||
|         ]), | ||||
|     }; | ||||
| 
 | ||||
|     let mut maestro = Maestro::<K8sAnywhereTopology>::initialize( | ||||
|  | ||||
| @ -39,8 +39,12 @@ impl std::fmt::Display for InterpretName { | ||||
| 
 | ||||
| #[async_trait] | ||||
| pub trait Interpret<T>: std::fmt::Debug + Send { | ||||
|     async fn execute(&self, inventory: &Inventory, topology: &T) | ||||
|     -> Result<Outcome, InterpretError>; | ||||
|     async fn execute( | ||||
|         &self, | ||||
|         inventory: &Inventory, | ||||
|         topology: &T, | ||||
|         profile: &String, | ||||
|     ) -> Result<Outcome, InterpretError>; | ||||
|     fn get_name(&self) -> InterpretName; | ||||
|     fn get_version(&self) -> Version; | ||||
|     fn get_status(&self) -> InterpretStatus; | ||||
|  | ||||
| @ -16,20 +16,23 @@ pub struct Maestro<T: Topology> { | ||||
|     topology: T, | ||||
|     scores: Arc<RwLock<ScoreVec<T>>>, | ||||
|     topology_preparation_result: Mutex<Option<Outcome>>, | ||||
|     profile: String, | ||||
| } | ||||
| 
 | ||||
| impl<T: Topology> Maestro<T> { | ||||
|     pub fn new(inventory: Inventory, topology: T) -> Self { | ||||
|     pub fn new(inventory: Inventory, topology: T, profile: String) -> Self { | ||||
|         Self { | ||||
|             inventory, | ||||
|             topology, | ||||
|             scores: Arc::new(RwLock::new(Vec::new())), | ||||
|             topology_preparation_result: None.into(), | ||||
|             profile, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub async fn initialize(inventory: Inventory, topology: T) -> Result<Self, InterpretError> { | ||||
|         let instance = Self::new(inventory, topology); | ||||
|         let profile = "dev".to_string(); // TODO: retrieve from env?
 | ||||
|         let instance = Self::new(inventory, topology, profile); | ||||
|         instance.prepare_topology().await?; | ||||
|         Ok(instance) | ||||
|     } | ||||
| @ -78,9 +81,11 @@ impl<T: Topology> Maestro<T> { | ||||
|             ); | ||||
|         } | ||||
|         info!("Running score {score:?}"); | ||||
|         let interpret = score.create_interpret(); | ||||
|         let interpret = score.apply_profile(&self.profile).create_interpret(); | ||||
|         info!("Launching interpret {interpret:?}"); | ||||
|         let result = interpret.execute(&self.inventory, &self.topology).await; | ||||
|         let result = interpret | ||||
|             .execute(&self.inventory, &self.topology, &self.profile) | ||||
|             .await; | ||||
|         info!("Got result {result:?}"); | ||||
|         result | ||||
|     } | ||||
|  | ||||
| @ -8,6 +8,9 @@ use super::{interpret::Interpret, topology::Topology}; | ||||
| pub trait Score<T: Topology>: | ||||
|     std::fmt::Debug + ScoreToString<T> + Send + Sync + CloneBoxScore<T> + SerializeScore<T> | ||||
| { | ||||
|     fn apply_profile(&self, profile: &String) -> Box<dyn Score<T>> { | ||||
|         Box::new(self.clone()) | ||||
|     } | ||||
|     fn create_interpret(&self) -> Box<dyn Interpret<T>>; | ||||
|     fn name(&self) -> String; | ||||
| } | ||||
|  | ||||
| @ -75,6 +75,7 @@ impl<T: Topology> Interpret<T> for DummyInterpret { | ||||
|         &self, | ||||
|         _inventory: &Inventory, | ||||
|         _topology: &T, | ||||
|         _profile: &String, | ||||
|     ) -> Result<Outcome, InterpretError> { | ||||
|         self.result.clone() | ||||
|     } | ||||
| @ -121,6 +122,7 @@ impl<T: Topology> Interpret<T> for PanicInterpret { | ||||
|         &self, | ||||
|         _inventory: &Inventory, | ||||
|         _topology: &T, | ||||
|         _profile: &String, | ||||
|     ) -> Result<Outcome, InterpretError> { | ||||
|         panic!("Panic interpret always panics when executed") | ||||
|     } | ||||
|  | ||||
| @ -1,3 +1,5 @@ | ||||
| use std::collections::HashMap; | ||||
| use std::fmt::Debug; | ||||
| use std::path::{Path, PathBuf}; | ||||
| 
 | ||||
| use async_trait::async_trait; | ||||
| @ -19,6 +21,7 @@ pub struct LAMPScore { | ||||
|     pub domain: Url, | ||||
|     pub config: LAMPConfig, | ||||
|     pub php_version: Version, | ||||
|     pub profiles: HashMap<&'static str, LAMPProfile>, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| @ -27,6 +30,11 @@ pub struct LAMPConfig { | ||||
|     pub ssl_enabled: bool, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Serialize)] | ||||
| pub struct LAMPProfile { | ||||
|     pub ssl_enabled: bool, | ||||
| } | ||||
| 
 | ||||
| impl Default for LAMPConfig { | ||||
|     fn default() -> Self { | ||||
|         LAMPConfig { | ||||
| @ -37,6 +45,23 @@ impl Default for LAMPConfig { | ||||
| } | ||||
| 
 | ||||
| impl<T: Topology + K8sclient> Score<T> for LAMPScore { | ||||
|     fn apply_profile(&self, profile: &String) -> Box<dyn Score<T>> { | ||||
|         let profile = match self.profiles.get(profile.as_str()) { | ||||
|             Some(profile) => profile, | ||||
|             None => panic!("Not good"), // TODO: better handling
 | ||||
|         }; | ||||
| 
 | ||||
|         let config = LAMPConfig { | ||||
|             ssl_enabled: profile.ssl_enabled, | ||||
|             ..self.config.clone() | ||||
|         }; | ||||
| 
 | ||||
|         Box::new(LAMPScore { | ||||
|             config, | ||||
|             ..self.clone() | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     fn create_interpret(&self) -> Box<dyn Interpret<T>> { | ||||
|         Box::new(LAMPInterpret { | ||||
|             score: self.clone(), | ||||
| @ -59,6 +84,7 @@ impl<T: Topology + K8sclient> Interpret<T> for LAMPInterpret { | ||||
|         &self, | ||||
|         inventory: &Inventory, | ||||
|         topology: &T, | ||||
|         profile: &String, | ||||
|     ) -> Result<Outcome, InterpretError> { | ||||
|         let image_name = match self.build_docker_image() { | ||||
|             Ok(name) => name, | ||||
| @ -78,8 +104,9 @@ impl<T: Topology + K8sclient> Interpret<T> for LAMPInterpret { | ||||
|         info!("LAMP deployment_score {deployment_score:?}"); | ||||
|         todo!(); | ||||
|         deployment_score | ||||
|             .apply_profile(profile) | ||||
|             .create_interpret() | ||||
|             .execute(inventory, topology) | ||||
|             .execute(inventory, topology, profile) | ||||
|             .await?; | ||||
|         todo!() | ||||
|     } | ||||
|  | ||||
| @ -41,7 +41,7 @@ pub mod tui { | ||||
| /// async fn main() {
 | ||||
| ///     let inventory = Inventory::autoload();
 | ||||
| ///     let topology = HAClusterTopology::autoload();
 | ||||
| ///     let mut maestro = Maestro::new(inventory, topology);
 | ||||
| ///     let mut maestro = Maestro::new(inventory, topology, "local");
 | ||||
| ///
 | ||||
| ///     maestro.register_all(vec![
 | ||||
| ///         Box::new(SuccessScore {}),
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user