use super::{
ComponentInstanceId, ComponentSpecId, FleetBinding, FleetCoordinatorBinding,
ManagedCanisterBinding, SubnetId,
};
use candid::{CandidType, Principal};
use serde::{Deserialize, Serialize};
pub const FLEET_ADMISSION_SCHEMA_VERSION: u16 = 1;
pub const FLEET_ADMISSION_INITIAL_GENERATION: u64 = 1;
pub const MAX_FLEET_ADMISSION_PRINCIPALS: usize = 256;
pub const MAX_FLEET_ADMISSION_RULES: usize = 32;
pub const MAX_FLEET_ADMISSION_RULE_PRINCIPAL_REFERENCES: usize = 128;
pub const MAX_FLEET_ADMISSION_PROJECTION_RECORD_BYTES: u32 = 32 * 1024;
pub const MAX_FLEET_ADMISSION_PROJECTION_PAGE: u64 = 128;
#[derive(CandidType, Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
pub enum FleetAdmissionSelector {
#[serde(rename = "fleet")]
Fleet,
#[serde(rename = "component_spec")]
ComponentSpec(ComponentSpecId),
#[serde(rename = "component_instance")]
ComponentInstance(ComponentInstanceId),
#[serde(rename = "fleet_subnet_root")]
FleetSubnetRoot(SubnetId),
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
#[serde(deny_unknown_fields)]
pub struct FleetAdmissionRule {
pub selector: FleetAdmissionSelector,
pub principals: Vec<Principal>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct FleetAdmissionPolicyTemplate {
pub schema_version: u16,
pub fleet_principals: Vec<Principal>,
pub rules: Vec<FleetAdmissionRule>,
pub template_digest: [u8; 32],
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct FleetAdmissionPolicy {
pub schema_version: u16,
pub fleet: FleetBinding,
pub generation: u64,
pub fleet_principals: Vec<Principal>,
pub rules: Vec<FleetAdmissionRule>,
pub policy_digest: [u8; 32],
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct FleetAdmissionTarget {
pub component_spec: ComponentSpecId,
pub component_instance: Option<ComponentInstanceId>,
pub fleet_subnet_root: SubnetId,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct FleetAdmissionProjection {
pub schema_version: u16,
pub authority: FleetCoordinatorBinding,
pub target: ManagedCanisterBinding,
pub generation: u64,
pub policy_digest: [u8; 32],
pub projection_digest: [u8; 32],
pub principals: Vec<Principal>,
}
#[cfg(test)]
mod tests {
use super::*;
use candid::{Decode, Encode};
#[test]
fn selector_candid_labels_round_trip_through_serde() {
let encoded = Encode!(&FleetAdmissionSelector::Fleet).expect("encode Fleet selector");
let decoded = Decode!(&encoded, FleetAdmissionSelector).expect("decode Fleet selector");
assert_eq!(decoded, FleetAdmissionSelector::Fleet);
}
}