Skip to main content

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

1use super::proposal::{
2    ExternalUpgradeConsentEvidenceV1, ExternalUpgradeConsentStateV1, ExternalUpgradeProposalV1,
3    ExternalUpgradeVerificationResultV1,
4};
5use super::verification::{
6    ExternalUpgradeVerificationCheckV1, ExternalVerificationObservationSourceV1,
7};
8use serde::{Deserialize, Serialize};
9
10///
11/// ExternalUpgradeCompletionReportV1
12///
13#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
14pub struct ExternalUpgradeCompletionReportV1 {
15    pub schema_version: u32,
16    pub report_id: String,
17    pub report_digest: String,
18    pub proposal_id: String,
19    pub proposal_digest: String,
20    pub consent_evidence_id: String,
21    pub consent_evidence_digest: String,
22    pub verification_check_id: String,
23    pub verification_check_digest: String,
24    pub subject: String,
25    pub canister_id: Option<String>,
26    pub role: Option<String>,
27    pub consent_state: ExternalUpgradeConsentStateV1,
28    pub verification_result: ExternalUpgradeVerificationResultV1,
29    pub verification_observation_source: ExternalVerificationObservationSourceV1,
30    pub completion_status: ExternalUpgradeCompletionStatusV1,
31    pub blockers: Vec<String>,
32    pub next_actions: Vec<String>,
33    pub status_summary: String,
34}
35
36///
37/// ExternalUpgradeCompletionStatusV1
38///
39#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
40pub enum ExternalUpgradeCompletionStatusV1 {
41    AwaitingConsent,
42    ConsentRefused,
43    SuppliedEvidenceConsistent,
44    AwaitingVerification,
45    VerifiedComplete,
46    VerificationFailed,
47}
48
49impl ExternalUpgradeCompletionStatusV1 {
50    #[must_use]
51    pub const fn label(self) -> &'static str {
52        match self {
53            Self::AwaitingConsent => "awaiting_consent",
54            Self::ConsentRefused => "consent_refused",
55            Self::SuppliedEvidenceConsistent => "supplied_evidence_consistent",
56            Self::AwaitingVerification => "awaiting_verification",
57            Self::VerifiedComplete => "verified_complete",
58            Self::VerificationFailed => "verification_failed",
59        }
60    }
61}
62
63///
64/// ExternalUpgradeCompletionReportRequest
65///
66#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
67pub struct ExternalUpgradeCompletionReportRequest {
68    pub report_id: String,
69    pub proposal: ExternalUpgradeProposalV1,
70    pub consent_evidence: ExternalUpgradeConsentEvidenceV1,
71    pub verification_check: ExternalUpgradeVerificationCheckV1,
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn external_upgrade_completion_status_owns_text_labels() {
80        assert_eq!(
81            ExternalUpgradeCompletionStatusV1::AwaitingConsent.label(),
82            "awaiting_consent"
83        );
84        assert_eq!(
85            ExternalUpgradeCompletionStatusV1::ConsentRefused.label(),
86            "consent_refused"
87        );
88        assert_eq!(
89            ExternalUpgradeCompletionStatusV1::SuppliedEvidenceConsistent.label(),
90            "supplied_evidence_consistent"
91        );
92        assert_eq!(
93            ExternalUpgradeCompletionStatusV1::AwaitingVerification.label(),
94            "awaiting_verification"
95        );
96        assert_eq!(
97            ExternalUpgradeCompletionStatusV1::VerifiedComplete.label(),
98            "verified_complete"
99        );
100        assert_eq!(
101            ExternalUpgradeCompletionStatusV1::VerificationFailed.label(),
102            "verification_failed"
103        );
104    }
105}