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
125///
126/// ExternalUpgradeVerificationCheckV1
127///
128#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
129pub struct ExternalUpgradeVerificationCheckV1 {
130    pub schema_version: u32,
131    pub check_id: String,
132    pub check_digest: String,
133    pub policy_id: String,
134    pub policy_digest: String,
135    pub proposal_id: String,
136    pub proposal_digest: String,
137    pub subject: String,
138    pub canister_id: Option<String>,
139    pub role: Option<String>,
140    pub observation: ExternalUpgradeVerificationObservationV1,
141    pub requirement_results: Vec<ExternalUpgradeVerificationCheckRequirementV1>,
142    pub verification_result: ExternalUpgradeVerificationResultV1,
143    pub status_summary: String,
144}
145
146///
147/// ExternalUpgradeVerificationCheckRequirementV1
148///
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct ExternalUpgradeVerificationCheckRequirementV1 {
151    pub requirement: LifecycleVerificationRequirementV1,
152    pub status: ExternalUpgradeVerificationRequirementStatusV1,
153    pub expected_value: Option<String>,
154    pub observed_value: Option<String>,
155    pub satisfied: Option<bool>,
156}
157
158///
159/// ExternalUpgradeVerificationCheckRequest
160///
161#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
162pub struct ExternalUpgradeVerificationCheckRequest {
163    pub check_id: String,
164    pub policy: ExternalUpgradeVerificationPolicyV1,
165    pub observation: Option<ExternalUpgradeVerificationObservationV1>,
166    pub deployment_check: Option<DeploymentCheckV1>,
167}
168
169#[cfg(test)]
170mod tests {
171    use super::*;
172
173    #[test]
174    fn external_upgrade_verification_requirement_status_owns_text_labels() {
175        assert_eq!(
176            ExternalUpgradeVerificationRequirementStatusV1::Required.label(),
177            "required"
178        );
179        assert_eq!(
180            ExternalUpgradeVerificationRequirementStatusV1::NotRequired.label(),
181            "not_required"
182        );
183    }
184}