use crate::{
InternalError,
cdk::types::Principal,
dto::{abi::v1::CanisterInitPayload, env::EnvBootstrapArgs},
ids::CanisterRole,
ops::{
config::ConfigOps,
runtime::env::EnvOps,
storage::{
StorageOpsError,
directory::{fleet::FleetDirectoryOps, subnet::SubnetDirectoryOps},
fleet_activation::FleetActivationOps,
},
topology::directory::current_provenance,
},
workflow::ic::provision::ProvisionWorkflow,
};
impl ProvisionWorkflow {
pub fn build_nonroot_init_payload(
role: &CanisterRole,
parent_pid: Principal,
) -> Result<CanisterInitPayload, InternalError> {
let component_spec = if role.is_wasm_store() {
None
} else if EnvOps::is_root() {
Some(ConfigOps::try_get_component_spec_id_by_role(role)?)
} else {
Some(EnvOps::component_spec()?)
};
let env = EnvBootstrapArgs {
fleet_root_pid: Some(EnvOps::fleet_root_pid()?),
component_spec,
subnet_pid: Some(EnvOps::subnet_pid()?),
root_pid: Some(EnvOps::root_pid()?),
canister_role: Some(role.clone()),
parent_pid: Some(parent_pid),
};
let provenance = current_provenance()?;
let fleet_directory = FleetDirectoryOps::snapshot_args(provenance.clone());
let subnet_directory = SubnetDirectoryOps::snapshot_args(provenance);
let identity = FleetActivationOps::status(EnvOps::is_root())
.map_err(StorageOpsError::from)?
.identity;
Ok(CanisterInitPayload {
fleet: identity.fleet,
install_id: identity.operation_id,
release_build_id: identity.release_build_id,
env,
fleet_directory,
subnet_directory,
})
}
}