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
125#[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#[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#[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}