canic_core/ids/fleet_topology/
mod.rs1use crate::{
8 cdk::types::Cycles,
9 ids::{
10 CanisterRole, ComponentInstanceId, ComponentSpecId, FleetBinding, ReleaseBuildId, SubnetId,
11 },
12};
13use candid::{CandidType, Principal};
14use serde::{Deserialize, Serialize};
15use std::fmt;
16
17#[derive(
24 CandidType, Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
25)]
26#[serde(transparent)]
27pub struct ComponentTopologyDigest([u8; 32]);
28
29impl ComponentTopologyDigest {
30 #[must_use]
31 pub const fn from_bytes(bytes: [u8; 32]) -> Self {
32 Self(bytes)
33 }
34
35 #[must_use]
36 pub const fn as_bytes(&self) -> &[u8; 32] {
37 &self.0
38 }
39
40 #[must_use]
41 pub const fn into_bytes(self) -> [u8; 32] {
42 self.0
43 }
44}
45
46impl fmt::Display for ComponentTopologyDigest {
47 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
48 for byte in self.0 {
49 write!(formatter, "{byte:02x}")?;
50 }
51 Ok(())
52 }
53}
54
55#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
62#[serde(deny_unknown_fields)]
63pub struct CyclesFundingBudget {
64 pub window_secs: u64,
65 pub maximum_cycles: Cycles,
66}
67
68#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
75#[serde(deny_unknown_fields)]
76pub struct FleetSubnetCanisterPoolConfig {
77 pub minimum_size: u32,
79 pub maximum_size: u32,
83 pub canister_cycles: Cycles,
85}
86
87#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94#[serde(deny_unknown_fields)]
95pub struct ComponentSpecAdmission {
96 pub component_spec: ComponentSpecId,
97 pub spec_hash: [u8; 32],
98 pub maximum_root_instances: u32,
99}
100
101#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
108#[serde(deny_unknown_fields)]
109pub struct FleetSubnetRootLimits {
110 pub maximum_component_instances: u32,
111 pub maximum_registry_bytes: u64,
112 pub maximum_wasm_store_bytes: u64,
113 pub canister_pool: FleetSubnetCanisterPoolConfig,
114 pub cycles_funding: CyclesFundingBudget,
115 pub maximum_group_placements: u32,
117}
118
119#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
126#[serde(deny_unknown_fields)]
127pub struct FleetCoordinatorBinding {
128 pub fleet: FleetBinding,
129 pub coordinator_subnet: SubnetId,
130 pub coordinator: Principal,
131}
132
133#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
140#[serde(deny_unknown_fields)]
141pub struct FleetRegistryAuthority {
142 pub binding: FleetCoordinatorBinding,
143 pub epoch: u64,
144}
145
146#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
153#[serde(deny_unknown_fields)]
154pub struct FleetSubnetRootBinding {
155 pub authority: FleetRegistryAuthority,
156 pub placement_subnet: SubnetId,
157 pub fleet_subnet_root: Principal,
158 pub component_admissions: Vec<ComponentSpecAdmission>,
159 pub component_topology_digest: ComponentTopologyDigest,
160 pub limits: FleetSubnetRootLimits,
161}
162
163#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
170#[serde(deny_unknown_fields)]
171pub struct FleetSubnetWasmStoreAuthority {
172 pub authority: FleetRegistryAuthority,
173 pub placement_subnet: SubnetId,
174 pub fleet_subnet_root: Principal,
175 pub wasm_store: Principal,
176 pub installation_controller: Principal,
177 pub release_build_id: ReleaseBuildId,
178 pub wasm_module_hash: [u8; 32],
179}
180
181#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
188#[serde(deny_unknown_fields)]
189pub struct ComponentBinding {
190 pub authority: FleetRegistryAuthority,
191 pub component: ComponentInstanceId,
192 pub component_spec: ComponentSpecId,
193 pub spec_hash: [u8; 32],
194 pub role: CanisterRole,
195 pub placement_subnet: SubnetId,
196 pub fleet_subnet_root: Principal,
197 pub canister_id: Principal,
198}
199
200#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
207#[serde(deny_unknown_fields)]
208pub struct ComponentChildBinding {
209 pub component: ComponentBinding,
210 pub parent_canister_id: Principal,
211 pub role: CanisterRole,
212 pub canister_id: Principal,
213}
214
215#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
222#[serde(deny_unknown_fields)]
223pub enum ManagedCanisterBinding {
224 Component(ComponentBinding),
225 ComponentChild(ComponentChildBinding),
226}