canic_host/deployment_truth/model/lifecycle/verification/
mod.rs1use super::super::{CanisterControlClassV1, DeploymentCheckV1};
2use super::authority::LifecycleVerificationRequirementV1;
3use super::proposal::{
4 ExternalUpgradeProposalV1, ExternalUpgradeReceiptV1, ExternalUpgradeVerificationResultV1,
5};
6use serde::{Deserialize, Serialize};
7
8#[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#[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#[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#[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#[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#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub struct ExternalUpgradeVerificationPolicyRequest {
94 pub policy_id: String,
95 pub proposal: ExternalUpgradeProposalV1,
96}
97
98#[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#[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#[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#[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#[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}