Skip to main content

canic_host/deployment_truth/model/lifecycle/verification/
mod.rs

1use super::super::{CanisterControlClassV1, DeploymentCheckV1};
2use super::authority::LifecycleVerificationRequirementV1;
3use super::proposal::{
4    ExternalUpgradeProposalV1, ExternalUpgradeReceiptV1, ExternalUpgradeVerificationResultV1,
5};
6use serde::{Deserialize, Serialize};
7
8///
9/// ExternalUpgradeVerificationReportV1
10///
11#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12pub struct ExternalUpgradeVerificationReportV1 {
13    pub schema_version: u32,
14    pub report_id: String,
15    pub report_digest: String,
16    pub proposal_id: String,
17    pub proposal_digest: String,
18    pub receipt_id: String,
19    pub receipt_digest: String,
20    pub subject: String,
21    pub canister_id: Option<String>,
22    pub role: Option<String>,
23    pub verification_result: ExternalUpgradeVerificationResultV1,
24    pub verification_notes: Vec<String>,
25    pub live_inventory_required: bool,
26    pub status_summary: String,
27}
28
29///
30/// ExternalUpgradeVerificationReportRequest
31///
32#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
33pub struct ExternalUpgradeVerificationReportRequest {
34    pub report_id: String,
35    pub proposal: ExternalUpgradeProposalV1,
36    pub receipt: ExternalUpgradeReceiptV1,
37}
38
39///
40/// ExternalUpgradeVerificationPolicyV1
41///
42#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
43pub struct ExternalUpgradeVerificationPolicyV1 {
44    pub schema_version: u32,
45    pub policy_id: String,
46    pub policy_digest: String,
47    pub proposal_id: String,
48    pub proposal_digest: String,
49    pub deployment_plan_id: String,
50    pub deployment_plan_digest: String,
51    pub subject: String,
52    pub canister_id: Option<String>,
53    pub role: Option<String>,
54    pub required_verification: Vec<LifecycleVerificationRequirementV1>,
55    pub verification_requirements: Vec<ExternalUpgradeVerificationPolicyRequirementV1>,
56    pub max_observation_age_seconds: Option<u64>,
57    pub status_summary: String,
58}
59
60///
61/// ExternalUpgradeVerificationPolicyRequirementV1
62///
63#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
64pub struct ExternalUpgradeVerificationPolicyRequirementV1 {
65    pub requirement: LifecycleVerificationRequirementV1,
66    pub status: ExternalUpgradeVerificationRequirementStatusV1,
67    pub expected_value: Option<String>,
68}
69
70///
71/// ExternalUpgradeVerificationRequirementStatusV1
72///
73#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
74pub enum ExternalUpgradeVerificationRequirementStatusV1 {
75    Required,
76    NotRequired,
77}
78
79impl ExternalUpgradeVerificationRequirementStatusV1 {
80    #[must_use]
81    pub const fn label(self) -> &'static str {
82        match self {
83            Self::Required => "required",
84            Self::NotRequired => "not_required",
85        }
86    }
87}
88
89///
90/// ExternalUpgradeVerificationPolicyRequest
91///
92#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub struct ExternalUpgradeVerificationPolicyRequest {
94    pub policy_id: String,
95    pub proposal: ExternalUpgradeProposalV1,
96}
97
98///
99/// ExternalUpgradeVerificationObservationV1
100///
101#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102pub struct ExternalUpgradeVerificationObservationV1 {
103    pub source: ExternalVerificationObservationSourceV1,
104    pub deployment_check_id: Option<String>,
105    pub deployment_check_digest: Option<String>,
106    pub inventory_id: Option<String>,
107    pub observed_at: Option<String>,
108    pub live_inventory_observed: bool,
109    pub controller_observation_present: bool,
110    pub observed_control_class: Option<CanisterControlClassV1>,
111    pub observed_module_hash: Option<String>,
112    pub observed_canonical_embedded_config_sha256: Option<String>,
113    pub protected_call_ready: Option<bool>,
114}
115
116///
117/// ExternalVerificationObservationSourceV1
118///
119#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
120pub enum ExternalVerificationObservationSourceV1 {
121    SuppliedObservation,
122    DeploymentTruthInventory,
123}
124
125impl ExternalVerificationObservationSourceV1 {
126    #[must_use]
127    pub const fn label(self) -> &'static str {
128        match self {
129            Self::SuppliedObservation => "supplied_observation",
130            Self::DeploymentTruthInventory => "deployment_truth_inventory",
131        }
132    }
133}
134
135///
136/// ExternalUpgradeVerificationCheckV1
137///
138#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
139pub struct ExternalUpgradeVerificationCheckV1 {
140    pub schema_version: u32,
141    pub check_id: String,
142    pub check_digest: String,
143    pub policy_id: String,
144    pub policy_digest: String,
145    pub proposal_id: String,
146    pub proposal_digest: String,
147    pub subject: String,
148    pub canister_id: Option<String>,
149    pub role: Option<String>,
150    pub observation: ExternalUpgradeVerificationObservationV1,
151    pub requirement_results: Vec<ExternalUpgradeVerificationCheckRequirementV1>,
152    pub verification_result: ExternalUpgradeVerificationResultV1,
153    pub status_summary: String,
154}
155
156///
157/// ExternalUpgradeVerificationCheckRequirementV1
158///
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
160pub struct ExternalUpgradeVerificationCheckRequirementV1 {
161    pub requirement: LifecycleVerificationRequirementV1,
162    pub status: ExternalUpgradeVerificationRequirementStatusV1,
163    pub expected_value: Option<String>,
164    pub observed_value: Option<String>,
165    pub satisfied: Option<bool>,
166}
167
168///
169/// ExternalUpgradeVerificationCheckRequest
170///
171#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
172pub struct ExternalUpgradeVerificationCheckRequest {
173    pub check_id: String,
174    pub policy: ExternalUpgradeVerificationPolicyV1,
175    pub observation: Option<ExternalUpgradeVerificationObservationV1>,
176    pub deployment_check: Option<DeploymentCheckV1>,
177}
178
179#[cfg(test)]
180mod tests {
181    use super::*;
182
183    #[test]
184    fn external_upgrade_verification_requirement_status_owns_text_labels() {
185        assert_eq!(
186            ExternalUpgradeVerificationRequirementStatusV1::Required.label(),
187            "required"
188        );
189        assert_eq!(
190            ExternalUpgradeVerificationRequirementStatusV1::NotRequired.label(),
191            "not_required"
192        );
193    }
194
195    #[test]
196    fn external_verification_observation_source_owns_text_labels() {
197        assert_eq!(
198            ExternalVerificationObservationSourceV1::SuppliedObservation.label(),
199            "supplied_observation"
200        );
201        assert_eq!(
202            ExternalVerificationObservationSourceV1::DeploymentTruthInventory.label(),
203            "deployment_truth_inventory"
204        );
205    }
206}