Enhance configuration management by implementing loading and saving of HostConfig and HostResources from disk, and refactor related structures for improved clarity and functionality.
This commit is contained in:
		
							parent
							
								
									414eacad2b
								
							
						
					
					
						commit
						a1e5ad641b
					
				| @ -1,4 +1,7 @@ | |||||||
| #[derive(Debug)] | use anyhow::Result; | ||||||
|  | use serde::{Deserialize, Serialize}; | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Serialize, Deserialize)] | ||||||
| pub struct HostConfig { | pub struct HostConfig { | ||||||
|     pub brain_url: String, |     pub brain_url: String, | ||||||
|     pub host_ip_address: String, |     pub host_ip_address: String, | ||||||
| @ -13,6 +16,7 @@ pub struct HostConfig { | |||||||
|     pub delete_archive: bool, |     pub delete_archive: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
| impl Default for HostConfig { | impl Default for HostConfig { | ||||||
|     fn default() -> Self { |     fn default() -> Self { | ||||||
|         // TODO: load from config file
 |         // TODO: load from config file
 | ||||||
| @ -41,3 +45,13 @@ impl Default for HostConfig { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | impl HostConfig { | ||||||
|  |     pub fn load_from_disk(path: &str) -> Result<Self> { | ||||||
|  |         let content = std::fs::read_to_string(path)?; | ||||||
|  |         let config: Self = serde_yml::from_str(&content)?; | ||||||
|  | 
 | ||||||
|  |         Ok(config) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										51
									
								
								src/data.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										51
									
								
								src/data.rs
									
									
									
									
									
								
							| @ -9,25 +9,57 @@ use serde::{Deserialize, Serialize}; | |||||||
| 
 | 
 | ||||||
| use crate::container::delete_enclave; | use crate::container::delete_enclave; | ||||||
| use crate::container::deploy_enclave; | use crate::container::deploy_enclave; | ||||||
| use crate::global::app_config_dir; |  | ||||||
| use crate::global::APP_NAME_PREFIX; |  | ||||||
| use crate::utils::handle_package; | use crate::utils::handle_package; | ||||||
| use crate::utils::prepare_port_map; | use crate::utils::prepare_port_map; | ||||||
| use crate::HostConfig; | use crate::HostConfig; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default)] | use crate::global::APP_CONFIG_DIR; | ||||||
|  | use crate::global::APP_NAME_PREFIX; | ||||||
|  | use crate::global::USED_RESOURCES; | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Default, Deserialize, Serialize)] | ||||||
| pub struct HostResources { | pub struct HostResources { | ||||||
|     pub existing_apps: HashSet<String>, |     pub existing_apps: HashSet<String>, | ||||||
|     pub reserved_vcpus: u32, |     pub reserved_vcpus: u32, | ||||||
|     pub reserved_memory: u32, |     pub reserved_memory_mb: u32, | ||||||
|  |     pub reserved_disk_mb: u32, | ||||||
|     pub reserved_host_ports: HashSet<u16>, |     pub reserved_host_ports: HashSet<u16>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl HostResources { | impl HostResources { | ||||||
|  |     pub fn new() -> Self { | ||||||
|  |         // TODO: compute host resources
 | ||||||
|  |         Self::default() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     // TODO: implement load and save
 |     // TODO: implement load and save
 | ||||||
|  |     fn save_to_disk(&self) -> Result<()> { | ||||||
|  |         let mut file = File::create(&*USED_RESOURCES)?; | ||||||
|  |         file.write_all(serde_yml::to_string(self)?.as_bytes())?; | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn load_from_disk() -> Result<Self> { | ||||||
|  |         let content = std::fs::read_to_string(&*USED_RESOURCES)?; | ||||||
|  |         let res: Self = serde_yml::from_str(&content)?; | ||||||
|  |         Ok(res) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn reserve_resources(&mut self, app: &App) -> Result<()> { | ||||||
|  |         self.reserved_memory_mb += app.app_resource.memory_mb; | ||||||
|  |         self.reserved_vcpus += app.app_resource.vcpu; | ||||||
|  |         self.reserved_disk_mb += app.app_resource.disk_mb; | ||||||
|  | 
 | ||||||
|  |         for (_, port) in app.mapped_ports.iter() { | ||||||
|  |             self.reserved_host_ports.insert(*port); | ||||||
|  |         } | ||||||
|  |         self.existing_apps.insert(app.uuid.clone()); | ||||||
|  | 
 | ||||||
|  |         self.save_to_disk() | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default, Serialize, Deserialize)] | #[derive(Debug, Default, Clone, Serialize, Deserialize)] | ||||||
| pub struct App { | pub struct App { | ||||||
|     pub uuid: String, |     pub uuid: String, | ||||||
|     pub name: String, |     pub name: String, | ||||||
| @ -58,7 +90,7 @@ impl App { | |||||||
|         } |         } | ||||||
|         if host_config.max_mem_reservation_mb |         if host_config.max_mem_reservation_mb | ||||||
|             < host_resource |             < host_resource | ||||||
|                 .reserved_memory |                 .reserved_memory_mb | ||||||
|                 .saturating_add(new_app_req.resource.memory_mb) |                 .saturating_add(new_app_req.resource.memory_mb) | ||||||
|         { |         { | ||||||
|             return Err(anyhow!("not enough memory available")); |             return Err(anyhow!("not enough memory available")); | ||||||
| @ -96,14 +128,15 @@ impl App { | |||||||
|             .existing_apps |             .existing_apps | ||||||
|             .insert(app_instance.uuid.clone()); |             .insert(app_instance.uuid.clone()); | ||||||
| 
 | 
 | ||||||
|  |         host_resource.reserve_resources(&app_instance)?; | ||||||
|  | 
 | ||||||
|         Ok(app_instance) |         Ok(app_instance) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn write_config(&self) -> Result<()> { |     fn write_config(&self) -> Result<()> { | ||||||
|         let app_config_dir = app_config_dir(); |         std::fs::create_dir_all(&*APP_CONFIG_DIR)?; | ||||||
|         std::fs::create_dir_all(&app_config_dir)?; |  | ||||||
| 
 | 
 | ||||||
|         let mut file = File::create(app_config_dir + &self.uuid + ".yaml")?; |         let mut file = File::create(format!("{}{}.yaml", *APP_CONFIG_DIR, &self.uuid))?; | ||||||
|         file.write_all(serde_yml::to_string(self)?.as_bytes())?; |         file.write_all(serde_yml::to_string(self)?.as_bytes())?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | use std::sync::LazyLock; | ||||||
|  | 
 | ||||||
| pub const NODE_PUBKEY: &str = "0xd0837609aedd53854651210327db90f5c2626188a00e940bbc9eea2c7e6838b7"; | pub const NODE_PUBKEY: &str = "0xd0837609aedd53854651210327db90f5c2626188a00e940bbc9eea2c7e6838b7"; | ||||||
| pub const ADMIN_PUBKEY: &str = "0x28a3a71197250b0fa4dd0f86288e07ec9cc78ce3338e21e2ebef84dd7780e3eb"; | pub const ADMIN_PUBKEY: &str = "0x28a3a71197250b0fa4dd0f86288e07ec9cc78ce3338e21e2ebef84dd7780e3eb"; | ||||||
| 
 | 
 | ||||||
| @ -10,7 +12,14 @@ pub const APP_NAME_PREFIX: &str = "dtpm"; | |||||||
| const DETEE_DIR_ENV_NAME: &str = "DETEE_DIR"; | const DETEE_DIR_ENV_NAME: &str = "DETEE_DIR"; | ||||||
| 
 | 
 | ||||||
| // TODO: try lazy static later
 | // TODO: try lazy static later
 | ||||||
| pub fn app_config_dir() -> String { | 
 | ||||||
|  | pub static USED_RESOURCES: LazyLock<String> = LazyLock::new(|| { | ||||||
|     let home = home::home_dir().unwrap().to_string_lossy().into_owned(); |     let home = home::home_dir().unwrap().to_string_lossy().into_owned(); | ||||||
|     std::env::var(DETEE_DIR_ENV_NAME).unwrap_or(format!("{home}/.detee/app_daemon/")) |     std::env::var(DETEE_DIR_ENV_NAME) | ||||||
| } |         .unwrap_or(format!("{home}/.detee/app_daemon/used_resources.yaml")) | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | pub static APP_CONFIG_DIR: LazyLock<String> = LazyLock::new(|| { | ||||||
|  |     let home = home::home_dir().unwrap().to_string_lossy().into_owned(); | ||||||
|  |     std::env::var(DETEE_DIR_ENV_NAME).unwrap_or(format!("{home}/.detee/app_daemon/deployed_apps/")) | ||||||
|  | }); | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								src/main.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -14,8 +14,8 @@ use detee_shared::pb::brain::DaemonMessageApp; | |||||||
| use detee_shared::pb::brain::MappedPort; | use detee_shared::pb::brain::MappedPort; | ||||||
| use detee_shared::pb::brain::NewAppRes; | use detee_shared::pb::brain::NewAppRes; | ||||||
| use detee_shared::types::brain::AppDeployConfig; | use detee_shared::types::brain::AppDeployConfig; | ||||||
| use global::app_config_dir; |  | ||||||
| use log::info; | use log::info; | ||||||
|  | use log::warn; | ||||||
| use std::time::Duration; | use std::time::Duration; | ||||||
| use tokio::sync::mpsc::Receiver; | use tokio::sync::mpsc::Receiver; | ||||||
| use tokio::sync::mpsc::Sender; | use tokio::sync::mpsc::Sender; | ||||||
| @ -26,6 +26,8 @@ use utils::cleanup_enclave_disk_and_package; | |||||||
| pub use crate::config::HostConfig; | pub use crate::config::HostConfig; | ||||||
| pub use crate::data::HostResources; | pub use crate::data::HostResources; | ||||||
| 
 | 
 | ||||||
|  | use global::APP_CONFIG_DIR; | ||||||
|  | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct AppHandler { | pub struct AppHandler { | ||||||
|     pub receiver: Receiver<BrainMessageApp>, |     pub receiver: Receiver<BrainMessageApp>, | ||||||
| @ -39,11 +41,24 @@ impl AppHandler { | |||||||
|         // TODO: load from config and resources from file,
 |         // TODO: load from config and resources from file,
 | ||||||
|         //       if not found use default and save host resources to file
 |         //       if not found use default and save host resources to file
 | ||||||
| 
 | 
 | ||||||
|  |         let host_config = match HostConfig::load_from_disk(&APP_CONFIG_DIR) { | ||||||
|  |             Ok(config) => config, | ||||||
|  |             Err(e) => panic!("Could not load config: {e:?}"), | ||||||
|  |         }; | ||||||
|  |         let host_resource = match HostResources::load_from_disk() { | ||||||
|  |             Ok(res) => res, | ||||||
|  |             Err(e) => { | ||||||
|  |                 warn!("Could not load resources from disk: {e:?}"); | ||||||
|  |                 info!("Creating new resource calculator."); | ||||||
|  |                 HostResources::new() | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|         Self { |         Self { | ||||||
|             receiver, |             receiver, | ||||||
|             sender, |             sender, | ||||||
|             host_config: HostConfig::default(), |             host_config, | ||||||
|             host_resource: HostResources::default(), |             host_resource, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -106,8 +121,7 @@ impl AppHandler { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async fn handle_del_app_req(&mut self, uuid: String) -> Result<()> { |     async fn handle_del_app_req(&mut self, uuid: String) -> Result<()> { | ||||||
|         let app_config_dir = app_config_dir(); |         let app_handle_file_name = format!("{}{}.yaml", *APP_CONFIG_DIR, &uuid); | ||||||
|         let app_handle_file_name = format!("{app_config_dir}{}.yaml", &uuid); |  | ||||||
|         let content = std::fs::read_to_string(&app_handle_file_name)?; |         let content = std::fs::read_to_string(&app_handle_file_name)?; | ||||||
|         let app_instance: App = serde_yml::from_str(&content)?; |         let app_instance: App = serde_yml::from_str(&content)?; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user