canic_host/deployment_truth/model/inventory/
mod.rs1use super::artifact::ObservedArtifactV1;
2use super::plan::DeploymentIdentityV1;
3use serde::{Deserialize, Serialize};
4
5#[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#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
134pub struct VerifierReadinessExpectationV1 {
135 pub required: bool,
136 pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
137}
138
139#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct VerifierReadinessObservationV1 {
144 pub status: ObservationStatusV1,
145 pub role_epochs: Vec<RoleEpochObservationV1>,
146}
147
148#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct RoleEpochExpectationV1 {
153 pub role: String,
154 pub minimum_epoch: u64,
155}
156
157#[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#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
171pub struct DeploymentObservationGapV1 {
172 pub key: String,
173 pub description: String,
174}
175
176#[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}