Skip to main content

canic_host/deployment_truth/model/plan/
mod.rs

1use super::artifact::RoleArtifactV1;
2use super::inventory::{
3    ExpectedCanisterV1, ExpectedPoolCanisterV1, VerifierReadinessExpectationV1,
4};
5use canic_core::ids::{CanonicalNetworkId, FleetId};
6use serde::{Deserialize, Serialize};
7
8///
9/// DeploymentPlanV1
10///
11#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12#[serde(deny_unknown_fields)]
13pub struct DeploymentPlanV1 {
14    pub schema_version: u32,
15    pub plan_id: String,
16    pub deployment_identity: DeploymentIdentityV1,
17    pub trust_domain: TrustDomainV1,
18    pub runtime_variant: String,
19    pub authority_profile: AuthorityProfileV1,
20    pub role_artifacts: Vec<RoleArtifactV1>,
21    pub expected_canisters: Vec<ExpectedCanisterV1>,
22    pub expected_pool: Vec<ExpectedPoolCanisterV1>,
23    pub expected_verifier_readiness: VerifierReadinessExpectationV1,
24    pub unresolved_assumptions: Vec<DeploymentAssumptionV1>,
25}
26
27///
28/// DeploymentIdentityV1
29///
30#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
31#[serde(deny_unknown_fields)]
32pub struct DeploymentIdentityV1 {
33    pub canonical_network_id: Option<CanonicalNetworkId>,
34    pub fleet_id: Option<FleetId>,
35    pub fleet_name: String,
36    pub app: String,
37    /// Non-authoritative environment-profile provenance.
38    pub environment: String,
39    pub root_principal: Option<String>,
40    pub authority_profile_hash: Option<String>,
41    pub role_topology_hash: Option<String>,
42    pub deployment_manifest_digest: Option<String>,
43    pub canonical_runtime_config_digest: Option<String>,
44    pub role_embedded_config_set_digest: Option<String>,
45    pub artifact_set_digest: Option<String>,
46    pub pool_identity_set_digest: Option<String>,
47    pub canic_version: Option<String>,
48    pub ic_memory_version: Option<String>,
49}
50
51///
52/// TrustDomainV1
53///
54#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
55#[serde(deny_unknown_fields)]
56pub struct TrustDomainV1 {
57    pub root_trust_anchor: Option<String>,
58}
59
60///
61/// AuthorityProfileV1
62///
63#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
64pub struct AuthorityProfileV1 {
65    pub profile_id: String,
66    pub expected_controllers: Vec<String>,
67    pub staging_controllers: Vec<String>,
68    pub emergency_controllers: Vec<String>,
69}
70
71///
72/// DeploymentAssumptionV1
73///
74#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
75pub struct DeploymentAssumptionV1 {
76    pub key: String,
77    pub description: String,
78}
79
80impl DeploymentAssumptionV1 {
81    #[must_use]
82    pub fn has_kind(&self, kind: DeploymentAssumptionKindV1) -> bool {
83        self.key == kind.key()
84    }
85}
86
87///
88/// DeploymentAssumptionKindV1
89///
90/// Machine-readable owner for Fleet-catalog assumption distinctions.
91///
92
93#[derive(Clone, Copy, Debug, Eq, PartialEq)]
94pub enum DeploymentAssumptionKindV1 {
95    FleetCatalogMissing,
96    FleetCatalogReadFailed,
97}
98
99impl DeploymentAssumptionKindV1 {
100    #[must_use]
101    pub const fn key(self) -> &'static str {
102        match self {
103            Self::FleetCatalogMissing => "fleet_catalog.root_principal.missing",
104            Self::FleetCatalogReadFailed => "fleet_catalog.root_principal.read_failed",
105        }
106    }
107}