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 operation_status: DeploymentExecutionStatusV1,
48 pub started_at: String,
49 pub finished_at: Option<String>,
50 pub operator_principal: Option<String>,
51 pub root_principal: Option<String>,
52 pub previous_observed_deployment_epoch: Option<u64>,
53 pub phase_receipts: Vec<PhaseReceiptV1>,
54 pub role_phase_receipts: Vec<RolePhaseReceiptV1>,
55 pub final_inventory_id: Option<String>,
56 pub command_result: DeploymentCommandResultV1,
57}
58
59#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
63pub struct RoleArtifactManifestV1 {
64 pub schema_version: u32,
65 pub manifest_id: String,
66 pub network: String,
67 pub artifact_root: Option<String>,
68 pub role_artifacts: Vec<RoleArtifactV1>,
69 pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
70}
71
72#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
76pub struct DeploymentDiffV1 {
77 pub schema_version: u32,
78 pub plan_identity: DeploymentIdentityV1,
79 pub observed_identity: Option<DeploymentIdentityV1>,
80 pub artifact_diff: Vec<DiffItemV1>,
81 pub controller_diff: Vec<DiffItemV1>,
82 pub pool_diff: Vec<DiffItemV1>,
83 pub embedded_config_diff: Vec<DiffItemV1>,
84 pub module_hash_diff: Vec<DiffItemV1>,
85 pub verifier_readiness_diff: Vec<DiffItemV1>,
86 pub resume_safety: ResumeSafetyV1,
87 pub hard_failures: Vec<SafetyFindingV1>,
88 pub warnings: Vec<SafetyFindingV1>,
89 pub resumable_phases: Vec<String>,
90}
91
92#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
96pub struct SafetyReportV1 {
97 pub schema_version: u32,
98 pub report_id: String,
99 pub diff_id: Option<String>,
100 pub status: SafetyStatusV1,
101 pub summary: String,
102 pub hard_failures: Vec<SafetyFindingV1>,
103 pub warnings: Vec<SafetyFindingV1>,
104 pub next_actions: Vec<String>,
105}
106
107#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
111pub struct DeploymentCheckV1 {
112 pub schema_version: u32,
113 pub check_id: String,
114 pub plan: DeploymentPlanV1,
115 pub inventory: DeploymentInventoryV1,
116 pub diff: DeploymentDiffV1,
117 pub report: SafetyReportV1,
118}
119
120#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
124pub struct DeploymentIdentityV1 {
125 pub deployment_name: String,
126 pub network: String,
127 pub root_principal: Option<String>,
128 pub authority_profile_hash: Option<String>,
129 pub role_topology_hash: Option<String>,
130 pub deployment_manifest_digest: Option<String>,
131 pub canonical_runtime_config_digest: Option<String>,
132 pub role_embedded_config_set_digest: Option<String>,
133 pub artifact_set_digest: Option<String>,
134 pub pool_identity_set_digest: Option<String>,
135 pub canic_version: Option<String>,
136 pub ic_memory_version: Option<String>,
137}
138
139#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct TrustDomainV1 {
144 pub root_trust_anchor: Option<String>,
145 pub migration_from: Option<String>,
146}
147
148#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct AuthorityProfileV1 {
153 pub profile_id: String,
154 pub expected_controllers: Vec<String>,
155 pub staging_controllers: Vec<String>,
156 pub emergency_controllers: Vec<String>,
157}
158
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
163pub struct RoleArtifactV1 {
164 pub role: String,
165 pub source: ArtifactSourceV1,
166 pub build_profile: String,
167 pub wasm_path: Option<String>,
168 pub wasm_gz_path: Option<String>,
169 pub wasm_gz_size_bytes: Option<u64>,
170 pub wasm_sha256: Option<String>,
171 pub wasm_gz_sha256: Option<String>,
172 pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
173 pub observed_wasm_gz_file_sha256: Option<String>,
174 pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
175 pub installed_module_hash: Option<String>,
176 pub candid_path: Option<String>,
177 pub candid_sha256: Option<String>,
178 pub raw_config_sha256: Option<String>,
179 pub canonical_embedded_config_sha256: Option<String>,
180 pub embedded_topology_sha256: Option<String>,
181 pub builder_version: Option<String>,
182 pub rust_toolchain: Option<String>,
183 pub package_version: Option<String>,
184}
185
186#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
190pub enum ArtifactDigestSourceV1 {
191 ReleaseSetManifest,
192 ObservedFileDigest,
193 InstalledModuleHash,
194}
195
196#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
200pub enum ArtifactSourceV1 {
201 LocalBuild,
202 ReleaseSet,
203 WasmStore,
204 External,
205 Unknown,
206}
207
208#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
212pub struct ExpectedCanisterV1 {
213 pub role: String,
214 pub canister_id: Option<String>,
215 pub control_class: CanisterControlClassV1,
216}
217
218#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
222pub struct ObservedCanisterV1 {
223 pub canister_id: String,
224 pub role: Option<String>,
225 pub control_class: CanisterControlClassV1,
226 pub controllers: Vec<String>,
227 pub module_hash: Option<String>,
228 pub status: Option<String>,
229 pub root_trust_anchor: Option<String>,
230 pub canonical_embedded_config_digest: Option<String>,
231 pub role_assignment_source: Option<String>,
232}
233
234#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
238pub enum CanisterControlClassV1 {
239 DeploymentControlled,
240 CanicManagedPool,
241 ExternallyImported,
242 JointlyControlled,
243 UserControlled,
244 UnknownUnsafe,
245}
246
247#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
251pub struct ExpectedPoolCanisterV1 {
252 pub pool: String,
253 pub canister_id: Option<String>,
254 pub role: Option<String>,
255}
256
257#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
261pub struct ObservedPoolCanisterV1 {
262 pub pool: String,
263 pub canister_id: String,
264 pub role: Option<String>,
265 pub control_class: CanisterControlClassV1,
266}
267
268#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
272pub struct LocalDeploymentConfigV1 {
273 pub config_path: Option<String>,
274 pub raw_config_sha256: Option<String>,
275 pub canonical_embedded_config_sha256: Option<String>,
276}
277
278#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
282pub struct ObservedArtifactV1 {
283 pub role: String,
284 pub artifact_path: String,
285 pub file_sha256: Option<String>,
286 pub file_sha256_source: Option<ArtifactDigestSourceV1>,
287 pub payload_sha256: Option<String>,
288 pub payload_size_bytes: Option<u64>,
289 pub source: ArtifactSourceV1,
290}
291
292#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
296pub struct VerifierReadinessExpectationV1 {
297 pub required: bool,
298 pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
299}
300
301#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
305pub struct VerifierReadinessObservationV1 {
306 pub status: ObservationStatusV1,
307 pub role_epochs: Vec<RoleEpochObservationV1>,
308}
309
310#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
314pub struct RoleEpochExpectationV1 {
315 pub role: String,
316 pub minimum_epoch: u64,
317}
318
319#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
323pub struct RoleEpochObservationV1 {
324 pub role: String,
325 pub observed_epoch: Option<u64>,
326 pub status: ObservationStatusV1,
327}
328
329#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
333pub struct DeploymentAssumptionV1 {
334 pub key: String,
335 pub description: String,
336}
337
338#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
342pub struct DeploymentObservationGapV1 {
343 pub key: String,
344 pub description: String,
345}
346
347#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
351pub struct PhaseReceiptV1 {
352 pub phase: String,
353 pub started_at: String,
354 pub finished_at: Option<String>,
355 pub attempted_action: String,
356 pub verified_postcondition: VerifiedPostconditionV1,
357}
358
359#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
363pub struct VerifiedPostconditionV1 {
364 pub status: ObservationStatusV1,
365 pub evidence: Vec<String>,
366}
367
368#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
372pub enum DeploymentExecutionStatusV1 {
373 NotStarted,
374 InProgress,
375 FailedBeforeMutation,
376 PartiallyApplied,
377 FailedAfterMutation,
378 Complete,
379}
380
381#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
385pub enum DeploymentCommandResultV1 {
386 NotFinished,
387 Succeeded,
388 Failed { code: String, message: String },
389}
390
391#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
395pub struct RolePhaseReceiptV1 {
396 pub role: String,
397 pub phase: String,
398 pub result: RolePhaseResultV1,
399 pub previous_module_hash: Option<String>,
400 pub target_module_hash: Option<String>,
401 pub observed_module_hash_after: Option<String>,
402 pub artifact_digest: Option<String>,
403 pub canonical_embedded_config_sha256: Option<String>,
404 pub error: Option<String>,
405}
406
407#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
411pub enum RolePhaseResultV1 {
412 Applied,
413 Failed,
414 Skipped,
415 NotAttempted,
416 VerifiedAlreadyApplied,
417}
418
419#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
423pub struct DiffItemV1 {
424 pub category: String,
425 pub subject: String,
426 pub expected: Option<String>,
427 pub observed: Option<String>,
428 pub severity: SafetySeverityV1,
429}
430
431#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
435pub struct ResumeSafetyV1 {
436 pub status: SafetyStatusV1,
437 pub reasons: Vec<String>,
438}
439
440#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
444pub struct SafetyFindingV1 {
445 pub code: String,
446 pub message: String,
447 pub severity: SafetySeverityV1,
448 pub subject: Option<String>,
449}
450
451#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
455pub enum SafetyStatusV1 {
456 NotEvaluated,
457 Safe,
458 Warning,
459 Blocked,
460}
461
462#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
466pub enum SafetySeverityV1 {
467 Info,
468 Warning,
469 HardFailure,
470}
471
472#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
476pub enum ObservationStatusV1 {
477 NotObserved,
478 Observed,
479 Missing,
480 Inconclusive,
481}