use anyhow::{anyhow, Result};
use tracing::info;
use crate::vault::autounseal;
use crate::vault::common::{check_vault_status, wait_for_vault_availability};
use crate::vault::init::InitResult;
use crate::vault::pki;
#[derive(Debug, Clone)]
pub struct SubSetupConfig {
pub sub_addr: String,
pub domain: String,
pub ttl: String,
pub root_addr: String,
pub root_token: String,
}
#[derive(Debug, Clone)]
pub struct SubSetupResult {
pub sub_init: InitResult,
pub pki_roles: (String, String),
}
pub async fn setup_sub_vault(config: SubSetupConfig) -> Result<SubSetupResult> {
let SubSetupConfig {
sub_addr,
domain,
ttl,
root_addr,
root_token,
} = config;
wait_for_vault_availability(&sub_addr, std::time::Duration::from_secs(30)).await?;
let status = check_vault_status(&sub_addr).await?;
if status.initialized {
return Err(anyhow!(
"Sub vault is already initialized. If you're re-running, provide sub's root token."
));
}
info!("Initializing sub vault with auto-unseal at {}...", sub_addr);
let sub_init = autounseal::init_with_autounseal(&sub_addr).await?;
info!("Sub vault root token = {}", sub_init.root_token);
info!(
"Setting up intermediate PKI on sub vault. Root vault at {}",
root_addr
);
let (_int_cert, int_role) = pki::setup_pki_intermediate(
&root_addr,
&root_token,
&sub_addr,
&sub_init.root_token,
&domain,
&ttl,
)
.await?;
info!("Intermediate PKI is set: role={} chain-len=?", int_role);
Ok(SubSetupResult {
sub_init,
pki_roles: ("root-role??".to_string(), int_role),
})
}