use manta_backend_dispatcher::error::Error;
use csm_rs::ims;
const EPHEMERAL_IMAGE_NAME: &str = "__ephemeral_image";
pub async fn exec(
shasta_base_url: &str,
shasta_root_cert: &[u8],
socks5_proxy: Option<&str>,
token: &str,
image_id: &str,
) -> Result<(), Error> {
let user_public_key_name =
csm_rs::common::jwt_ops::get_preferred_username(token)
.map_err(|e| {
Error::JwtMalformed(format!(
"claim 'preferred_user' not found in JWT token: {e}"
))
})?;
tracing::info!("Looking for user '{}' public SSH key", user_public_key_name);
let user_public_ssh_id_value = if let Ok(Some(user_public_ssh_value)) =
ims::public_keys::http_client::v3::get_single(
token,
shasta_base_url,
shasta_root_cert,
socks5_proxy,
&user_public_key_name,
)
.await
{
user_public_ssh_value["id"].clone()
} else {
return Err(Error::NotFound(format!(
"User '{}' does not have an SSH public \
key in Alps, Please contact platform \
sys admins.",
user_public_key_name
)));
};
tracing::info!("SSH key found with ID {}", user_public_ssh_id_value);
tracing::info!(
"Creating ephemeral environment based on image ID {}",
image_id
);
let resp_json = ims::job::http_client::post_customize(
token,
shasta_base_url,
shasta_root_cert,
socks5_proxy,
EPHEMERAL_IMAGE_NAME,
image_id,
user_public_ssh_id_value
.as_str()
.ok_or_else(|| Error::MissingField("SSH key ID is not a string".to_string()))?,
)
.await
.map_err(|e| {
Error::BadRequest(format!(
"Could not create ephemeral environment \
based on image ID {image_id}: {e}"
))
})?;
let hostname_value = resp_json
.pointer("/ssh_containers/0/connection_info/customer_access/host")
.cloned()
.ok_or_else(|| {
Error::MissingField(
"Failed to get SSH container hostname \
from ephemeral env response"
.to_string(),
)
})?;
tracing::info!(
"Ephemeral environment successfully created! \
hostname with ssh enabled: {}",
hostname_value.as_str().unwrap_or("unknown")
);
println!("{}", hostname_value.as_str().unwrap_or("unknown"));
Ok(())
}