1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7pub struct DeploymentPlanV1 {
8 pub schema_version: u32,
9 pub plan_id: String,
10 pub deployment_identity: DeploymentIdentityV1,
11 pub trust_domain: TrustDomainV1,
12 pub fleet_template: String,
13 pub runtime_variant: String,
14 pub authority_profile: AuthorityProfileV1,
15 pub role_artifacts: Vec<RoleArtifactV1>,
16 pub expected_canisters: Vec<ExpectedCanisterV1>,
17 pub expected_pool: Vec<ExpectedPoolCanisterV1>,
18 pub expected_verifier_readiness: VerifierReadinessExpectationV1,
19 pub unresolved_assumptions: Vec<DeploymentAssumptionV1>,
20}
21
22#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
26pub struct DeploymentInventoryV1 {
27 pub schema_version: u32,
28 pub inventory_id: String,
29 pub observed_at: String,
30 pub observed_identity: Option<DeploymentIdentityV1>,
31 pub local_config: LocalDeploymentConfigV1,
32 pub observed_canisters: Vec<ObservedCanisterV1>,
33 pub observed_pool: Vec<ObservedPoolCanisterV1>,
34 pub observed_artifacts: Vec<ObservedArtifactV1>,
35 pub observed_verifier_readiness: VerifierReadinessObservationV1,
36 pub unresolved_observations: Vec<DeploymentObservationGapV1>,
37}
38
39#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
43pub struct DeploymentReceiptV1 {
44 pub schema_version: u32,
45 pub operation_id: String,
46 pub plan_id: String,
47 pub started_at: String,
48 pub finished_at: Option<String>,
49 pub operator_principal: Option<String>,
50 pub root_principal: Option<String>,
51 pub previous_observed_deployment_epoch: Option<u64>,
52 pub phase_receipts: Vec<PhaseReceiptV1>,
53 pub final_inventory_id: Option<String>,
54 pub command_result: DeploymentCommandResultV1,
55}
56
57#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
61pub struct RoleArtifactManifestV1 {
62 pub schema_version: u32,
63 pub manifest_id: String,
64 pub network: String,
65 pub artifact_root: Option<String>,
66 pub role_artifacts: Vec<RoleArtifactV1>,
67 pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
68}
69
70#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
74pub struct DeploymentDiffV1 {
75 pub schema_version: u32,
76 pub plan_identity: DeploymentIdentityV1,
77 pub observed_identity: Option<DeploymentIdentityV1>,
78 pub artifact_diff: Vec<DiffItemV1>,
79 pub controller_diff: Vec<DiffItemV1>,
80 pub pool_diff: Vec<DiffItemV1>,
81 pub embedded_config_diff: Vec<DiffItemV1>,
82 pub module_hash_diff: Vec<DiffItemV1>,
83 pub verifier_readiness_diff: Vec<DiffItemV1>,
84 pub resume_safety: ResumeSafetyV1,
85 pub hard_failures: Vec<SafetyFindingV1>,
86 pub warnings: Vec<SafetyFindingV1>,
87 pub resumable_phases: Vec<String>,
88}
89
90#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94pub struct SafetyReportV1 {
95 pub schema_version: u32,
96 pub report_id: String,
97 pub diff_id: Option<String>,
98 pub status: SafetyStatusV1,
99 pub summary: String,
100 pub hard_failures: Vec<SafetyFindingV1>,
101 pub warnings: Vec<SafetyFindingV1>,
102 pub next_actions: Vec<String>,
103}
104
105#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
109pub struct DeploymentCheckV1 {
110 pub schema_version: u32,
111 pub check_id: String,
112 pub plan: DeploymentPlanV1,
113 pub inventory: DeploymentInventoryV1,
114 pub diff: DeploymentDiffV1,
115 pub report: SafetyReportV1,
116}
117
118#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
122pub struct DeploymentIdentityV1 {
123 pub deployment_name: String,
124 pub network: String,
125 pub root_principal: Option<String>,
126 pub authority_profile_hash: Option<String>,
127 pub role_topology_hash: Option<String>,
128 pub deployment_manifest_digest: Option<String>,
129 pub canonical_runtime_config_digest: Option<String>,
130 pub role_embedded_config_set_digest: Option<String>,
131 pub artifact_set_digest: Option<String>,
132 pub pool_identity_set_digest: Option<String>,
133 pub canic_version: Option<String>,
134 pub ic_memory_version: Option<String>,
135}
136
137#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
141pub struct TrustDomainV1 {
142 pub root_trust_anchor: Option<String>,
143 pub migration_from: Option<String>,
144}
145
146#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct AuthorityProfileV1 {
151 pub profile_id: String,
152 pub expected_controllers: Vec<String>,
153 pub staging_controllers: Vec<String>,
154 pub emergency_controllers: Vec<String>,
155}
156
157#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
161pub struct RoleArtifactV1 {
162 pub role: String,
163 pub source: ArtifactSourceV1,
164 pub build_profile: String,
165 pub wasm_path: Option<String>,
166 pub wasm_gz_path: Option<String>,
167 pub wasm_gz_size_bytes: Option<u64>,
168 pub wasm_sha256: Option<String>,
169 pub wasm_gz_sha256: Option<String>,
170 pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
171 pub observed_wasm_gz_file_sha256: Option<String>,
172 pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
173 pub installed_module_hash: Option<String>,
174 pub candid_path: Option<String>,
175 pub candid_sha256: Option<String>,
176 pub raw_config_sha256: Option<String>,
177 pub canonical_embedded_config_sha256: Option<String>,
178 pub embedded_topology_sha256: Option<String>,
179 pub builder_version: Option<String>,
180 pub rust_toolchain: Option<String>,
181 pub package_version: Option<String>,
182}
183
184#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
188pub enum ArtifactDigestSourceV1 {
189 ReleaseSetManifest,
190 ObservedFileDigest,
191 InstalledModuleHash,
192}
193
194#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
198pub enum ArtifactSourceV1 {
199 LocalBuild,
200 ReleaseSet,
201 WasmStore,
202 External,
203 Unknown,
204}
205
206#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
210pub struct ExpectedCanisterV1 {
211 pub role: String,
212 pub canister_id: Option<String>,
213 pub control_class: CanisterControlClassV1,
214}
215
216#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
220pub struct ObservedCanisterV1 {
221 pub canister_id: String,
222 pub role: Option<String>,
223 pub control_class: CanisterControlClassV1,
224 pub controllers: Vec<String>,
225 pub module_hash: Option<String>,
226 pub status: Option<String>,
227 pub root_trust_anchor: Option<String>,
228 pub canonical_embedded_config_digest: Option<String>,
229 pub role_assignment_source: Option<String>,
230}
231
232#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
236pub enum CanisterControlClassV1 {
237 DeploymentControlled,
238 CanicManagedPool,
239 ExternallyImported,
240 JointlyControlled,
241 UserControlled,
242 UnknownUnsafe,
243}
244
245#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
249pub struct ExpectedPoolCanisterV1 {
250 pub pool: String,
251 pub canister_id: Option<String>,
252 pub role: Option<String>,
253}
254
255#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
259pub struct ObservedPoolCanisterV1 {
260 pub pool: String,
261 pub canister_id: String,
262 pub role: Option<String>,
263 pub control_class: CanisterControlClassV1,
264}
265
266#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
270pub struct LocalDeploymentConfigV1 {
271 pub config_path: Option<String>,
272 pub raw_config_sha256: Option<String>,
273 pub canonical_embedded_config_sha256: Option<String>,
274}
275
276#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
280pub struct ObservedArtifactV1 {
281 pub role: String,
282 pub artifact_path: String,
283 pub file_sha256: Option<String>,
284 pub file_sha256_source: Option<ArtifactDigestSourceV1>,
285 pub payload_sha256: Option<String>,
286 pub payload_size_bytes: Option<u64>,
287 pub source: ArtifactSourceV1,
288}
289
290#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
294pub struct VerifierReadinessExpectationV1 {
295 pub required: bool,
296 pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
297}
298
299#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
303pub struct VerifierReadinessObservationV1 {
304 pub status: ObservationStatusV1,
305 pub role_epochs: Vec<RoleEpochObservationV1>,
306}
307
308#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
312pub struct RoleEpochExpectationV1 {
313 pub role: String,
314 pub minimum_epoch: u64,
315}
316
317#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
321pub struct RoleEpochObservationV1 {
322 pub role: String,
323 pub observed_epoch: Option<u64>,
324 pub status: ObservationStatusV1,
325}
326
327#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
331pub struct DeploymentAssumptionV1 {
332 pub key: String,
333 pub description: String,
334}
335
336#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
340pub struct DeploymentObservationGapV1 {
341 pub key: String,
342 pub description: String,
343}
344
345#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
349pub struct PhaseReceiptV1 {
350 pub phase: String,
351 pub started_at: String,
352 pub finished_at: Option<String>,
353 pub attempted_action: String,
354 pub verified_postcondition: VerifiedPostconditionV1,
355}
356
357#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
361pub struct VerifiedPostconditionV1 {
362 pub status: ObservationStatusV1,
363 pub evidence: Vec<String>,
364}
365
366#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
370pub enum DeploymentCommandResultV1 {
371 NotFinished,
372 Succeeded,
373 Failed { code: String, message: String },
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
380pub struct DiffItemV1 {
381 pub category: String,
382 pub subject: String,
383 pub expected: Option<String>,
384 pub observed: Option<String>,
385 pub severity: SafetySeverityV1,
386}
387
388#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
392pub struct ResumeSafetyV1 {
393 pub status: SafetyStatusV1,
394 pub reasons: Vec<String>,
395}
396
397#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
401pub struct SafetyFindingV1 {
402 pub code: String,
403 pub message: String,
404 pub severity: SafetySeverityV1,
405 pub subject: Option<String>,
406}
407
408#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
412pub enum SafetyStatusV1 {
413 NotEvaluated,
414 Safe,
415 Warning,
416 Blocked,
417}
418
419#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
423pub enum SafetySeverityV1 {
424 Info,
425 Warning,
426 HardFailure,
427}
428
429#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
433pub enum ObservationStatusV1 {
434 NotObserved,
435 Observed,
436 Missing,
437 Inconclusive,
438}