in src/enclave_proc/resource_manager.rs [550:624]
fn create_enclave(
&mut self,
enclave_name: String,
connection: Option<&Connection>,
) -> NitroCliResult<String> {
self.init_memory(connection)
.map_err(|e| e.add_subaction("Memory initialization issue".to_string()))?;
self.init_cpus()
.map_err(|e| e.add_subaction("vCPUs initialization issue".to_string()))?;
let sockaddr = VsockAddr::new(VMADDR_CID_PARENT, ENCLAVE_READY_VSOCK_PORT);
let listener = VsockListener::bind(&sockaddr).map_err(|_| {
new_nitro_cli_failure!(
"Enclave boot heartbeat vsock connection - vsock bind error",
NitroCliErrorEnum::EnclaveBootFailure
)
})?;
let enclave_start = self
.start(connection)
.map_err(|e| e.add_subaction("Enclave start issue".to_string()))?;
// Get eif size to feed it to calculate_necessary_timeout helper function
let eif_size = self
.eif_file
.as_ref()
.ok_or_else(|| {
new_nitro_cli_failure!(
"Failed to get EIF file",
NitroCliErrorEnum::FileOperationFailure
)
})?
.metadata()
.map_err(|e| {
new_nitro_cli_failure!(
&format!("Failed to get enclave image file metadata: {:?}", e),
NitroCliErrorEnum::FileOperationFailure
)
})?
.len();
// Update the poll timeout based on the eif size or allocated memory
let poll_timeout = calculate_necessary_timeout(eif_size, self.allocated_memory_mib * MiB);
enclave_ready(listener, poll_timeout).map_err(|err| {
let err_msg = format!("Waiting on enclave to boot failed with error {:?}", err);
self.terminate_enclave_error(&err_msg);
new_nitro_cli_failure!(&err_msg, NitroCliErrorEnum::EnclaveBootFailure)
})?;
self.enclave_cid = Some(enclave_start.enclave_cid);
let info = get_run_enclaves_info(
enclave_name,
enclave_start.enclave_cid,
self.slot_uid,
self.cpu_ids.clone(),
self.allocated_memory_mib,
)
.map_err(|e| e.add_subaction("Get RunEnclaves information issue".to_string()))?;
safe_conn_println(
connection,
serde_json::to_string_pretty(&info)
.map_err(|err| {
new_nitro_cli_failure!(
&format!("Failed to display RunEnclaves data: {:?}", err),
NitroCliErrorEnum::SerdeError
)
})?
.as_str(),
)?;
Ok(info.enclave_id)
}