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 pub parent_canister_id: Option<String>,
130 pub subnet_canister_id: Option<String>,
131 pub controller_hint: Option<String>,
132 pub identity_mode: IdentityMode,
133 pub verification_checks: Vec<VerificationCheck>,
134 pub source_snapshot: SourceSnapshot,
135}
136
137#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
145#[serde(rename_all = "kebab-case")]
146pub enum IdentityMode {
147 Fixed,
148 Relocatable,
149}
150
151#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
159#[serde(deny_unknown_fields)]
160pub struct SourceSnapshot {
161 pub snapshot_id: String,
162 pub module_hash: Option<String>,
163 pub code_version: Option<String>,
164 pub artifact_path: String,
165 pub checksum_algorithm: String,
166 #[serde(default)]
167 pub checksum: Option<String>,
168}
169
170#[derive(Clone, Debug, Default, Deserialize, Serialize)]
178#[serde(deny_unknown_fields)]
179pub struct VerificationPlan {
180 pub deployment_checks: Vec<VerificationCheck>,
181 pub member_checks: Vec<MemberVerificationChecks>,
182}
183
184#[derive(Clone, Debug, Deserialize, Serialize)]
192#[serde(deny_unknown_fields)]
193pub struct MemberVerificationChecks {
194 pub role: String,
195 pub checks: Vec<VerificationCheck>,
196}
197
198#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
206#[serde(deny_unknown_fields)]
207pub struct VerificationCheck {
208 pub kind: String,
209 pub roles: Vec<String>,
210}
211
212pub const VERIFICATION_KIND_STATUS: &str = "status";