Skip to main content

canic_host/deployment_truth/model/inventory/
mod.rs

1use super::artifact::ObservedArtifactV1;
2use super::plan::DeploymentIdentityV1;
3use serde::{Deserialize, Serialize};
4
5///
6/// DeploymentInventoryV1
7///
8#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
9pub struct DeploymentInventoryV1 {
10    pub schema_version: u32,
11    pub inventory_id: String,
12    pub observed_at: String,
13    pub observed_identity: Option<DeploymentIdentityV1>,
14    pub observed_root: Option<DeploymentRootObservationV1>,
15    pub local_config: LocalDeploymentConfigV1,
16    pub observed_canisters: Vec<ObservedCanisterV1>,
17    pub observed_pool: Vec<ObservedPoolCanisterV1>,
18    pub observed_artifacts: Vec<ObservedArtifactV1>,
19    pub observed_verifier_readiness: VerifierReadinessObservationV1,
20    pub unresolved_observations: Vec<DeploymentObservationGapV1>,
21}
22
23///
24/// DeploymentRootObservationV1
25///
26#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
27pub struct DeploymentRootObservationV1 {
28    pub deployment_name: String,
29    pub network: String,
30    pub fleet_template: String,
31    pub root_principal: String,
32    pub observed_canister_id: String,
33    pub observation_source: DeploymentRootObservationSourceV1,
34    pub control_class: CanisterControlClassV1,
35    pub controllers: Vec<String>,
36    pub module_hash: Option<String>,
37    pub status: Option<String>,
38    pub role_assignment_source: Option<String>,
39}
40
41///
42/// DeploymentRootObservationSourceV1
43///
44#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
45pub enum DeploymentRootObservationSourceV1 {
46    IcpCanisterStatus,
47    LocalDeploymentState,
48}
49
50impl DeploymentRootObservationSourceV1 {
51    #[must_use]
52    pub const fn label(self) -> &'static str {
53        match self {
54            Self::IcpCanisterStatus => "IcpCanisterStatus",
55            Self::LocalDeploymentState => "LocalDeploymentState",
56        }
57    }
58}
59
60///
61/// ExpectedCanisterV1
62///
63#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
64pub struct ExpectedCanisterV1 {
65    pub role: String,
66    pub canister_id: Option<String>,
67    pub control_class: CanisterControlClassV1,
68}
69
70///
71/// ObservedCanisterV1
72///
73#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
74pub struct ObservedCanisterV1 {
75    pub canister_id: String,
76    pub role: Option<String>,
77    pub control_class: CanisterControlClassV1,
78    pub controllers: Vec<String>,
79    pub module_hash: Option<String>,
80    pub status: Option<String>,
81    pub root_trust_anchor: Option<String>,
82    pub canonical_embedded_config_digest: Option<String>,
83    pub role_assignment_source: Option<String>,
84}
85
86///
87/// CanisterControlClassV1
88///
89#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
90pub enum CanisterControlClassV1 {
91    DeploymentControlled,
92    CanicManagedPool,
93    ExternallyImported,
94    JointlyControlled,
95    UserControlled,
96    UnknownUnsafe,
97}
98
99///
100/// ExpectedPoolCanisterV1
101///
102#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
103pub struct ExpectedPoolCanisterV1 {
104    pub pool: String,
105    pub canister_id: Option<String>,
106    pub role: Option<String>,
107}
108
109///
110/// ObservedPoolCanisterV1
111///
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
113pub struct ObservedPoolCanisterV1 {
114    pub pool: String,
115    pub canister_id: String,
116    pub role: Option<String>,
117    pub control_class: CanisterControlClassV1,
118}
119
120///
121/// LocalDeploymentConfigV1
122///
123#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
124pub struct LocalDeploymentConfigV1 {
125    pub config_path: Option<String>,
126    pub raw_config_sha256: Option<String>,
127    pub canonical_embedded_config_sha256: Option<String>,
128}
129
130///
131/// VerifierReadinessExpectationV1
132///
133#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
134pub struct VerifierReadinessExpectationV1 {
135    pub required: bool,
136    pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
137}
138
139///
140/// VerifierReadinessObservationV1
141///
142#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct VerifierReadinessObservationV1 {
144    pub status: ObservationStatusV1,
145    pub role_epochs: Vec<RoleEpochObservationV1>,
146}
147
148///
149/// RoleEpochExpectationV1
150///
151#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct RoleEpochExpectationV1 {
153    pub role: String,
154    pub minimum_epoch: u64,
155}
156
157///
158/// RoleEpochObservationV1
159///
160#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
161pub struct RoleEpochObservationV1 {
162    pub role: String,
163    pub observed_epoch: Option<u64>,
164    pub status: ObservationStatusV1,
165}
166
167///
168/// DeploymentObservationGapV1
169///
170#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
171pub struct DeploymentObservationGapV1 {
172    pub key: String,
173    pub description: String,
174}
175
176///
177/// ObservationStatusV1
178///
179#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
180pub enum ObservationStatusV1 {
181    NotObserved,
182    Observed,
183    Missing,
184    Inconclusive,
185}
186
187#[cfg(test)]
188mod tests {
189    use super::*;
190
191    #[test]
192    fn deployment_root_observation_source_owns_text_labels() {
193        assert_eq!(
194            DeploymentRootObservationSourceV1::IcpCanisterStatus.label(),
195            "IcpCanisterStatus"
196        );
197        assert_eq!(
198            DeploymentRootObservationSourceV1::LocalDeploymentState.label(),
199            "LocalDeploymentState"
200        );
201    }
202}