feat: add dynamic port mapping for enclave deployment
This commit is contained in:
		
							parent
							
								
									bd44c4bade
								
							
						
					
					
						commit
						7be5c1abd7
					
				
							
								
								
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -305,6 +305,7 @@ dependencies = [ | |||||||
|  "flate2", |  "flate2", | ||||||
|  "prost", |  "prost", | ||||||
|  "prost-types", |  "prost-types", | ||||||
|  |  "rand", | ||||||
|  "reqwest", |  "reqwest", | ||||||
|  "tar", |  "tar", | ||||||
|  "tokio", |  "tokio", | ||||||
| @ -315,7 +316,6 @@ dependencies = [ | |||||||
| [[package]] | [[package]] | ||||||
| name = "detee-shared" | name = "detee-shared" | ||||||
| version = "0.1.0" | version = "0.1.0" | ||||||
| source = "git+ssh://git@gitea.detee.cloud/noormohammedb/detee-shared#358c2d84ca092cad5df69ac19cc6acbfb85ee8d7" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "base64", |  "base64", | ||||||
|  "prost", |  "prost", | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ reqwest = "0.12.12" | |||||||
| flate2 = "1.0.35" | flate2 = "1.0.35" | ||||||
| tar = "0.4.43" | tar = "0.4.43" | ||||||
| anyhow = "1.0.95" | anyhow = "1.0.95" | ||||||
|  | rand = "0.8.5" | ||||||
| 
 | 
 | ||||||
| [build-dependencies] | [build-dependencies] | ||||||
| tonic-build = "0.12.3" | tonic-build = "0.12.3" | ||||||
|  | |||||||
| @ -31,7 +31,9 @@ impl DaemonState { | |||||||
|         req_data: ContainerConfig, |         req_data: ContainerConfig, | ||||||
|         unarchive_dir: String, |         unarchive_dir: String, | ||||||
|     ) -> Result<(), Box<dyn std::error::Error>> { |     ) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|         deploy_enclave(&unarchive_dir).await?; |         let publishing_ports = req_data.resource.clone().unwrap().port; | ||||||
|  | 
 | ||||||
|  |         deploy_enclave(&unarchive_dir, publishing_ports).await?; | ||||||
| 
 | 
 | ||||||
|         let container = Container { |         let container = Container { | ||||||
|             id: "123".to_string(), |             id: "123".to_string(), | ||||||
|  | |||||||
| @ -1,12 +1,14 @@ | |||||||
| use anyhow::{anyhow, Result}; | use anyhow::{anyhow, Result}; | ||||||
| use chrono::Utc; | use chrono::Utc; | ||||||
| use flate2::read::GzDecoder; | use flate2::read::GzDecoder; | ||||||
|  | use rand::Rng; | ||||||
| use reqwest::Client; | use reqwest::Client; | ||||||
| use std::io::BufReader; | use std::io::BufReader; | ||||||
| use std::path::Path; | use std::path::Path; | ||||||
| use std::process::Command; | use std::process::Command; | ||||||
| use tar::Archive; | use tar::Archive; | ||||||
| use tokio::io::AsyncWriteExt; | use tokio::io::AsyncWriteExt; | ||||||
|  | use tokio::net::TcpListener; | ||||||
| use tokio::{fs, fs::File}; | use tokio::{fs, fs::File}; | ||||||
| 
 | 
 | ||||||
| pub async fn handle_package(package_url: String) -> Result<String> { | pub async fn handle_package(package_url: String) -> Result<String> { | ||||||
| @ -41,21 +43,28 @@ pub async fn handle_package(package_url: String) -> Result<String> { | |||||||
| pub async fn deploy_enclave( | pub async fn deploy_enclave( | ||||||
|     enclave_path: &str, |     enclave_path: &str, | ||||||
|     // enclave_name: String,
 |     // enclave_name: String,
 | ||||||
|     // publishing_ports: Vec<u32>,
 |     publishing_ports: Vec<u32>, | ||||||
|     // ...
 |     // ...
 | ||||||
| ) -> Result<(), Box<dyn std::error::Error>> { | ) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|  |     let port_map = prepare_port_map(publishing_ports).await; | ||||||
|  | 
 | ||||||
|  |     let port_maping_string = port_map | ||||||
|  |         .iter() | ||||||
|  |         .map(|(host, container)| format!("-p {host}:{container}")) | ||||||
|  |         .collect::<Vec<_>>() | ||||||
|  |         .join(" "); | ||||||
|  | 
 | ||||||
|     println!("Deploying enclave: {:?}", enclave_path); |     println!("Deploying enclave: {:?}", enclave_path); | ||||||
|     let docker_deploy_str = format!( |     let docker_deploy_str = format!( | ||||||
|         "docker run -v {enclave_path}/enclave_packager:/enclave_packager --device /dev/sgx/enclave --device /dev/sgx/provision -p 34500:34500 noormohammedb/occlum-enclave:v1"); |         "docker run -v {enclave_path}/enclave_packager:/enclave_packager --device /dev/sgx/enclave --device /dev/sgx/provision {port_maping_string} noormohammedb/occlum-enclave:v1"); | ||||||
| 
 | 
 | ||||||
|     println!("{}", &docker_deploy_str); |     println!("{}", &docker_deploy_str); | ||||||
| 
 | 
 | ||||||
|     let child = Command::new("sh") |     let _child = Command::new("sh") | ||||||
|         .arg("-c") |         .arg("-c") | ||||||
|         .arg(docker_deploy_str) |         .arg(docker_deploy_str) | ||||||
|         .spawn()?; |         .spawn()?; | ||||||
| 
 | 
 | ||||||
|     dbg!(child); |  | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -69,3 +78,34 @@ pub async fn download_file(url: &str, file_path: &Path) -> Result<(), Box<dyn st | |||||||
| 
 | 
 | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | async fn prepare_port_map(mut publishing_ports: Vec<u32>) -> Vec<(u16, u16)> { | ||||||
|  |     publishing_ports.insert(0, 34500); | ||||||
|  |     let mut maped_ports = vec![]; | ||||||
|  |     for port in publishing_ports { | ||||||
|  |         if is_port_available(port as u16).await { | ||||||
|  |             maped_ports.push((port as u16, port as u16)); | ||||||
|  |         } else { | ||||||
|  |             let host_port = get_random_available_port().await.unwrap(); | ||||||
|  |             maped_ports.push((host_port, port as u16)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     maped_ports | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub async fn get_random_available_port() -> Option<u16> { | ||||||
|  |     let mut rng = rand::rngs::OsRng; | ||||||
|  |     for _ in 0..1000 { | ||||||
|  |         let port = rng.gen_range(15000..45000); | ||||||
|  |         if is_port_available(port).await { | ||||||
|  |             return Some(port); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     None | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async fn is_port_available(port: u16) -> bool { | ||||||
|  |     TcpListener::bind(&format!("127.0.0.1:{}", port)) | ||||||
|  |         .await | ||||||
|  |         .is_ok() | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user