use crate::dto::{
env::EnvBootstrapArgs,
prelude::*,
topology::{FleetDirectoryInput, SubnetDirectoryInput},
};
use crate::ids::{FleetBinding, ReleaseBuildId};
#[derive(CandidType, Debug, Deserialize)]
pub struct CanisterInitPayload {
pub fleet: FleetBinding,
pub install_id: [u8; 32],
pub release_build_id: ReleaseBuildId,
pub env: EnvBootstrapArgs,
pub fleet_directory: FleetDirectoryInput,
pub subnet_directory: SubnetDirectoryInput,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
dto::topology::{DirectoryEntryInput, DirectoryProvenance},
ids::{
AppId, CanisterRole, CanonicalNetworkId, FleetId, FleetKey, ReleaseBuildNonce,
SubnetSlotId,
},
};
#[test]
fn managed_nonroot_init_payload_roundtrips_the_exact_fleet_identity_and_directories() {
let fleet = FleetBinding {
fleet: FleetKey {
network: CanonicalNetworkId::public_ic(),
fleet_id: FleetId::from_generated_bytes([1; 32]),
},
app: AppId::from("toko"),
};
let release_build_id =
ReleaseBuildId::from_nonce(ReleaseBuildNonce::from_random_bytes([2; 32]));
let principal = Principal::from_slice(&[3; 29]);
let payload = CanisterInitPayload {
fleet: fleet.clone(),
install_id: [4; 32],
release_build_id,
env: EnvBootstrapArgs {
fleet_root_pid: Some(principal),
subnet_slot: Some(SubnetSlotId::DEFAULT),
subnet_pid: Some(principal),
root_pid: Some(principal),
canister_role: Some(CanisterRole::new("app")),
parent_pid: Some(principal),
},
fleet_directory: FleetDirectoryInput {
provenance: DirectoryProvenance {
fleet: fleet.clone(),
source_root: principal,
},
entries: vec![DirectoryEntryInput {
role: CanisterRole::new("app"),
pid: principal,
}],
},
subnet_directory: SubnetDirectoryInput {
provenance: DirectoryProvenance {
fleet: fleet.clone(),
source_root: principal,
},
entries: Vec::new(),
},
};
let bytes = candid::encode_one(&payload).expect("encode managed non-root init payload");
let decoded: CanisterInitPayload =
candid::decode_one(&bytes).expect("decode managed non-root init payload");
assert_eq!(decoded.fleet, fleet);
assert_eq!(decoded.install_id, [4; 32]);
assert_eq!(decoded.release_build_id, release_build_id);
assert_eq!(decoded.fleet_directory.entries.len(), 1);
assert!(decoded.subnet_directory.entries.is_empty());
}
}