simple deployment functionality and package handling

This commit is contained in:
Noor 2025-01-21 02:46:33 +05:30
parent eb811bb2db
commit 577a39fe1f
Signed by: noormohammedb
GPG Key ID: D83EFB8B3B967146

@ -3,6 +3,7 @@ use flate2::read::GzDecoder;
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::sync::Arc; use std::sync::Arc;
use std::{net::SocketAddr, str::FromStr}; use std::{net::SocketAddr, str::FromStr};
use tar::Archive; use tar::Archive;
@ -54,17 +55,25 @@ impl DaemonServicePB for DaemonServer {
) -> Result<tonic::Response<NewContainerRes>, tonic::Status> { ) -> Result<tonic::Response<NewContainerRes>, tonic::Status> {
let req_data = request.into_inner(); let req_data = request.into_inner();
if let Some(package_url) = req_data.package_url { if req_data.package_url.is_none() {
handle_package(package_url) return Err(tonic::Status::data_loss("Package URL not provided"));
.await
.map_err(|err| tonic::Status::internal(err.to_string()))?;
} }
Ok(tonic::Response::new(NewContainerRes::default())) let package_url = req_data.package_url.unwrap_or_default();
let unarchive_dir = handle_package(package_url)
.await
.map_err(|err| tonic::Status::internal(err.to_string()))?;
deploy_enclave(unarchive_dir)
.await
.map_err(|err| tonic::Status::internal(err.to_string()))?;
return Ok(tonic::Response::new(NewContainerRes {
status: "success".to_string(),
}));
} }
} }
async fn handle_package(package_url: String) -> Result<(), Box<dyn std::error::Error>> { async fn handle_package(package_url: String) -> Result<String, Box<dyn std::error::Error>> {
let dir_path = Path::new("./enclave_archives"); let dir_path = Path::new("./enclave_archives");
fs::create_dir_all(dir_path).await?; fs::create_dir_all(dir_path).await?;
@ -88,8 +97,31 @@ async fn handle_package(package_url: String) -> Result<(), Box<dyn std::error::E
let unarchive_dir = format!("./enclaves/{}", utc_time); let unarchive_dir = format!("./enclaves/{}", utc_time);
fs::create_dir_all(Path::new(&unarchive_dir)).await?; fs::create_dir_all(Path::new(&unarchive_dir)).await?;
archive.unpack(unarchive_dir)?; archive.unpack(&unarchive_dir)?;
Ok(unarchive_dir)
}
async fn deploy_enclave(
enclave_path: String,
// enclave_name: String,
// publishing_ports: Vec<u32>,
// ...
) -> Result<(), Box<dyn std::error::Error>> {
println!("Deploying enclave: {:?}", enclave_path);
let docker_deploy_str = format!(
"docker run --rm -v {enclave_path}:/enclave_packager --device /dev/sgx/enclave --device /dev/sgx/provision -p 34500:34500 -p 8080-8099:8080-8099 noormohammedb/occlum-enclave:v1");
println!("{}", &docker_deploy_str);
let mut child = Command::new("sh")
.arg("-c")
.arg(docker_deploy_str)
.spawn()?;
child.wait()?;
dbg!(child);
Ok(()) Ok(())
} }