1use serde::{Deserialize, Serialize};
8
9#[derive(Clone, Debug, Deserialize, Serialize)]
17#[serde(deny_unknown_fields)]
18pub struct DeploymentBackupManifest {
19 pub manifest_version: u16,
20 pub backup_id: String,
21 pub created_at: String,
22 pub tool: ToolMetadata,
23 pub source: SourceMetadata,
24 pub consistency: ConsistencySection,
25 pub deployment: DeploymentSection,
26 pub verification: VerificationPlan,
27}
28
29#[derive(Clone, Debug, Deserialize, Serialize)]
37#[serde(deny_unknown_fields)]
38pub struct ToolMetadata {
39 pub name: String,
40 pub version: String,
41}
42
43#[derive(Clone, Debug, Deserialize, Serialize)]
51#[serde(deny_unknown_fields)]
52pub struct SourceMetadata {
53 pub environment: String,
54 pub root_canister: String,
55}
56
57#[derive(Clone, Debug, Deserialize, Serialize)]
65#[serde(deny_unknown_fields)]
66pub struct ConsistencySection {
67 pub backup_units: Vec<BackupUnit>,
68}
69
70#[derive(Clone, Debug, Deserialize, Serialize)]
78#[serde(deny_unknown_fields)]
79pub struct BackupUnit {
80 pub unit_id: String,
81 pub kind: BackupUnitKind,
82 pub roles: Vec<String>,
83}
84
85#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
93#[serde(rename_all = "kebab-case")]
94pub enum BackupUnitKind {
95 Single,
96 Subtree,
97}
98
99#[derive(Clone, Debug, Deserialize, Serialize)]
107#[serde(deny_unknown_fields)]
108pub struct DeploymentSection {
109 pub topology_hash_algorithm: String,
110 pub topology_hash_input: String,
111 pub discovery_topology_hash: String,
112 pub pre_snapshot_topology_hash: String,
113 pub topology_hash: String,
114 pub members: Vec<DeploymentMember>,
115}
116
117#[derive(Clone, Debug, Deserialize, Serialize)]
125#[serde(deny_unknown_fields)]
126pub struct DeploymentMember {
127 pub role: String,
128 pub canister_id: String,
129 #[serde(deserialize_with = "crate::serialization::required_option")]
130 pub parent_canister_id: Option<String>,
131 #[serde(deserialize_with = "crate::serialization::required_option")]
132 pub subnet_canister_id: Option<String>,
133 #[serde(deserialize_with = "crate::serialization::required_option")]
134 pub controller_hint: Option<String>,
135 pub identity_mode: IdentityMode,
136 pub verification_checks: Vec<VerificationCheck>,
137 pub source_snapshot: SourceSnapshot,
138}
139
140#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
148#[serde(rename_all = "kebab-case")]
149pub enum IdentityMode {
150 Fixed,
151 Relocatable,
152}
153
154#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
162#[serde(deny_unknown_fields)]
163pub struct SourceSnapshot {
164 pub snapshot_id: String,
165 #[serde(deserialize_with = "crate::serialization::required_option")]
166 pub module_hash: Option<String>,
167 #[serde(deserialize_with = "crate::serialization::required_option")]
168 pub code_version: Option<String>,
169 pub artifact_path: String,
170 pub checksum_algorithm: String,
171 #[serde(deserialize_with = "crate::serialization::required_option")]
172 pub checksum: Option<String>,
173}
174
175#[derive(Clone, Debug, Default, Deserialize, Serialize)]
183#[serde(deny_unknown_fields)]
184pub struct VerificationPlan {
185 pub deployment_checks: Vec<VerificationCheck>,
186 pub member_checks: Vec<MemberVerificationChecks>,
187}
188
189#[derive(Clone, Debug, Deserialize, Serialize)]
197#[serde(deny_unknown_fields)]
198pub struct MemberVerificationChecks {
199 pub role: String,
200 pub checks: Vec<VerificationCheck>,
201}
202
203#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
211#[serde(deny_unknown_fields)]
212pub struct VerificationCheck {
213 pub kind: String,
214 pub roles: Vec<String>,
215}
216
217pub const VERIFICATION_KIND_STATUS: &str = "status";