Skip to main content

canic_host/deployment_truth/
model.rs

1use serde::{Deserialize, Serialize};
2
3///
4/// DeploymentPlanV1
5///
6#[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///
23/// DeploymentInventoryV1
24///
25#[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///
40/// DeploymentReceiptV1
41///
42#[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 execution_context: Option<DeploymentExecutionContextV1>,
48    pub operation_status: DeploymentExecutionStatusV1,
49    pub started_at: String,
50    pub finished_at: Option<String>,
51    pub operator_principal: Option<String>,
52    pub root_principal: Option<String>,
53    pub previous_observed_deployment_epoch: Option<u64>,
54    pub phase_receipts: Vec<PhaseReceiptV1>,
55    pub role_phase_receipts: Vec<RolePhaseReceiptV1>,
56    pub final_inventory_id: Option<String>,
57    pub command_result: DeploymentCommandResultV1,
58}
59
60///
61/// DeploymentExecutionContextV1
62///
63#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
64pub struct DeploymentExecutionContextV1 {
65    pub workspace_root: Option<String>,
66    pub icp_root: Option<String>,
67    pub artifact_roots: Vec<String>,
68    pub backend: DeploymentExecutorBackendV1,
69    pub backend_capabilities: Vec<DeploymentExecutorCapabilityV1>,
70}
71
72///
73/// DeploymentExecutionPreflightV1
74///
75#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
76pub struct DeploymentExecutionPreflightV1 {
77    pub schema_version: u32,
78    pub plan_id: String,
79    pub safety_report_id: String,
80    pub authority_plan_id: String,
81    pub backend: DeploymentExecutorBackendV1,
82    pub status: DeploymentExecutionPreflightStatusV1,
83    pub planned_phases: Vec<String>,
84    pub required_capabilities: Vec<DeploymentExecutorCapabilityV1>,
85    pub missing_capabilities: Vec<DeploymentExecutorCapabilityV1>,
86    pub blockers: Vec<SafetyFindingV1>,
87}
88
89///
90/// DeploymentExecutionPreflightStatusV1
91///
92#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub enum DeploymentExecutionPreflightStatusV1 {
94    Ready,
95    Blocked,
96}
97
98///
99/// DeploymentExecutorBackendV1
100///
101#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102pub enum DeploymentExecutorBackendV1 {
103    CurrentCli,
104    PocketIc,
105    DirectAgent,
106    Other { name: String },
107}
108
109///
110/// DeploymentExecutorCapabilityV1
111///
112#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
113pub enum DeploymentExecutorCapabilityV1 {
114    CreateCanister,
115    CanisterStatus,
116    UpdateSettings,
117    InstallCode,
118    Call,
119    Query,
120    StageArtifact,
121}
122
123///
124/// ArtifactTransportV1
125///
126#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
127pub enum ArtifactTransportV1 {
128    LocalCli,
129    WasmStore,
130    DirectAgent,
131}
132
133///
134/// StagingReceiptV1
135///
136#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
137pub struct StagingReceiptV1 {
138    pub schema_version: u32,
139    pub role: String,
140    pub artifact_identity: String,
141    pub transport: ArtifactTransportV1,
142    pub wasm_store_locator: Option<String>,
143    pub prepared_chunk_hashes: Vec<String>,
144    pub published_chunk_count: usize,
145    pub verified_postcondition: VerifiedPostconditionV1,
146}
147
148///
149/// RoleArtifactSourceV1
150///
151#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct RoleArtifactSourceV1 {
153    pub role: String,
154    pub kind: RoleArtifactSourceKindV1,
155    pub locator: Option<String>,
156    pub previous_receipt_kind: Option<PreviousArtifactReceiptKindV1>,
157    pub previous_receipt_lineage_digest: Option<String>,
158    pub expected_wasm_sha256: Option<String>,
159    pub expected_wasm_gz_sha256: Option<String>,
160    pub expected_candid_sha256: Option<String>,
161    pub expected_canonical_embedded_config_sha256: Option<String>,
162}
163
164///
165/// RolePromotionInputV1
166///
167#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
168pub struct RolePromotionInputV1 {
169    pub role: String,
170    pub promotion_level: PromotionArtifactLevelV1,
171    pub source: RoleArtifactSourceV1,
172    pub require_byte_identical_wasm: bool,
173    pub require_target_embedded_config: bool,
174    pub target_store_has_artifact: Option<bool>,
175}
176
177///
178/// RolePromotionPolicyV1
179///
180#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
181pub struct RolePromotionPolicyV1 {
182    pub role: String,
183    pub allowed_promotion_levels: Vec<PromotionArtifactLevelV1>,
184    pub requirements: Vec<PromotionPolicyRequirementV1>,
185}
186
187///
188/// PromotionPolicyRequirementV1
189///
190#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
191pub enum PromotionPolicyRequirementV1 {
192    SameSourceRevision,
193    SameCargoFeatures,
194    TargetConfigDigest,
195    ByteIdenticalWasm,
196    SealedBytes,
197}
198
199///
200/// PromotionPolicyClaimV1
201///
202#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
203pub enum PromotionPolicyClaimV1 {
204    ByteIdenticalWasm,
205    TargetConfigDigest,
206}
207
208///
209/// PromotionPolicyCheckV1
210///
211#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
212pub struct PromotionPolicyCheckV1 {
213    pub schema_version: u32,
214    pub check_id: String,
215    pub status: PromotionReadinessStatusV1,
216    pub roles: Vec<RolePromotionPolicyDecisionV1>,
217    pub blockers: Vec<SafetyFindingV1>,
218}
219
220///
221/// RolePromotionPolicyDecisionV1
222///
223#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
224pub struct RolePromotionPolicyDecisionV1 {
225    pub role: String,
226    pub requested_promotion_level: PromotionArtifactLevelV1,
227    pub allowed_promotion_levels: Vec<PromotionArtifactLevelV1>,
228    pub requirements: Vec<PromotionPolicyRequirementV1>,
229    pub claims: Vec<PromotionPolicyClaimV1>,
230    pub level_allowed: bool,
231    pub policy_satisfied: bool,
232}
233
234///
235/// PromotionArtifactLevelV1
236///
237#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
238pub enum PromotionArtifactLevelV1 {
239    SealedWasm,
240    SourceBuild,
241}
242
243///
244/// BuildRecipeIdentityV1
245///
246#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
247pub struct BuildRecipeIdentityV1 {
248    pub recipe_id: String,
249    pub source_kind: RoleArtifactSourceKindV1,
250    pub source_revision: String,
251    pub source_tree_clean: bool,
252    pub package_or_role_selector: String,
253    pub cargo_profile: String,
254    pub cargo_features_digest: String,
255    pub cargo_lock_digest: String,
256    pub rust_toolchain: String,
257    pub builder_version: String,
258    pub target_triple: String,
259    pub linker_identity: String,
260    pub deterministic_build_mode: String,
261    pub wasm_opt_version: String,
262    pub compression_identity: String,
263}
264
265///
266/// BuildMaterializationInputV1
267///
268#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
269pub struct BuildMaterializationInputV1 {
270    pub materialization_input_id: String,
271    pub build_recipe_id: String,
272    pub canonical_embedded_config_sha256: String,
273    pub network: String,
274    pub root_trust_anchor: String,
275    pub runtime_variant: String,
276}
277
278///
279/// BuildMaterializationResultV1
280///
281#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
282pub struct BuildMaterializationResultV1 {
283    pub materialization_result_id: String,
284    pub build_recipe_id: String,
285    pub materialization_input_digest: String,
286    pub wasm_sha256: String,
287    pub wasm_gz_sha256: String,
288    pub installed_module_hash: String,
289    pub candid_sha256: String,
290}
291
292///
293/// BuildMaterializationEvidenceV1
294///
295#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
296pub struct BuildMaterializationEvidenceV1 {
297    pub schema_version: u32,
298    pub evidence_id: String,
299    pub recipe: BuildRecipeIdentityV1,
300    pub materialization_input: BuildMaterializationInputV1,
301    pub materialization_result: BuildMaterializationResultV1,
302    pub computed_materialization_input_digest: String,
303    pub recipe_id_matches_input: bool,
304    pub recipe_id_matches_result: bool,
305    pub materialization_input_digest_matches_result: bool,
306}
307
308///
309/// PromotionArtifactIdentityReportV1
310///
311#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
312pub struct PromotionArtifactIdentityReportV1 {
313    pub schema_version: u32,
314    pub report_id: String,
315    pub status: PromotionReadinessStatusV1,
316    pub roles: Vec<RolePromotionArtifactIdentityV1>,
317    pub identity_groups: Vec<PromotionArtifactIdentityGroupV1>,
318    pub blockers: Vec<SafetyFindingV1>,
319}
320
321///
322/// PromotionArtifactIdentityGroupV1
323///
324#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
325pub struct PromotionArtifactIdentityGroupV1 {
326    pub identity_key: String,
327    pub identity_kind: PromotionArtifactIdentityKindV1,
328    pub roles: Vec<String>,
329    pub source_kinds: Vec<RoleArtifactSourceKindV1>,
330    pub source_locators: Vec<String>,
331    pub digest_pinned: bool,
332    pub wasm_sha256: Option<String>,
333    pub wasm_gz_sha256: Option<String>,
334    pub candid_sha256: Option<String>,
335    pub canonical_embedded_config_sha256: Option<String>,
336}
337
338///
339/// RolePromotionArtifactIdentityV1
340///
341#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
342pub struct RolePromotionArtifactIdentityV1 {
343    pub role: String,
344    pub promotion_level: PromotionArtifactLevelV1,
345    pub source_kind: RoleArtifactSourceKindV1,
346    pub source_locator: Option<String>,
347    pub identity_kind: PromotionArtifactIdentityKindV1,
348    pub digest_pinned: bool,
349    pub wasm_sha256: Option<String>,
350    pub wasm_gz_sha256: Option<String>,
351    pub candid_sha256: Option<String>,
352    pub canonical_embedded_config_sha256: Option<String>,
353}
354
355///
356/// PromotionArtifactIdentityKindV1
357///
358#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
359pub enum PromotionArtifactIdentityKindV1 {
360    SealedWasm,
361    SealedCompressedWasm,
362    SealedWasmAndCompressedWasm,
363    SourceBuild,
364    Deferred,
365}
366
367///
368/// PromotionReadinessV1
369///
370#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371pub struct PromotionReadinessV1 {
372    pub schema_version: u32,
373    pub readiness_id: String,
374    pub target_plan_id: String,
375    pub status: PromotionReadinessStatusV1,
376    pub roles: Vec<RolePromotionReadinessV1>,
377    pub blockers: Vec<SafetyFindingV1>,
378    pub warnings: Vec<SafetyFindingV1>,
379}
380
381///
382/// PromotionPlanTransformV1
383///
384#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
385pub struct PromotionPlanTransformV1 {
386    pub schema_version: u32,
387    pub transform_id: String,
388    pub target_plan_id: String,
389    pub promoted_plan_id: String,
390    pub promotion_plan_lineage_digest: String,
391    pub promoted_plan: DeploymentPlanV1,
392    pub roles: Vec<RolePromotionPlanTransformV1>,
393}
394
395///
396/// ArtifactPromotionPlanV1
397///
398#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
399pub struct ArtifactPromotionPlanV1 {
400    pub schema_version: u32,
401    pub plan_id: String,
402    pub generated_at: String,
403    pub status: PromotionReadinessStatusV1,
404    pub target_plan_id: String,
405    pub promoted_plan_id: String,
406    pub promotion_plan_lineage_digest: String,
407    pub readiness: PromotionReadinessV1,
408    pub artifact_identity_report: PromotionArtifactIdentityReportV1,
409    pub transform: PromotionPlanTransformV1,
410    pub target_execution_lineage: Option<PromotionTargetExecutionLineageV1>,
411    pub blockers: Vec<SafetyFindingV1>,
412}
413
414///
415/// PromotionPlanTransformEvidenceV1
416///
417#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
418pub struct PromotionPlanTransformEvidenceV1 {
419    pub schema_version: u32,
420    pub evidence_id: String,
421    pub generated_at: String,
422    pub transform: PromotionPlanTransformV1,
423}
424
425///
426/// PromotionTargetExecutionLineageV1
427///
428#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
429pub struct PromotionTargetExecutionLineageV1 {
430    pub schema_version: u32,
431    pub lineage_id: String,
432    pub generated_at: String,
433    pub target_execution_lineage_digest: String,
434    pub transform: PromotionPlanTransformV1,
435    pub execution_preflight: DeploymentExecutionPreflightV1,
436    pub execution_attempted: bool,
437}
438
439///
440/// RolePromotionPlanTransformV1
441///
442#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
443pub struct RolePromotionPlanTransformV1 {
444    pub role: String,
445    pub promotion_level: PromotionArtifactLevelV1,
446    pub source_kind: RoleArtifactSourceKindV1,
447    pub source_locator: Option<String>,
448    pub artifact_source_before: ArtifactSourceV1,
449    pub artifact_source_after: ArtifactSourceV1,
450    pub wasm_sha256_before: Option<String>,
451    pub wasm_sha256_after: Option<String>,
452    pub wasm_gz_sha256_before: Option<String>,
453    pub wasm_gz_sha256_after: Option<String>,
454    pub candid_sha256_before: Option<String>,
455    pub candid_sha256_after: Option<String>,
456    pub canonical_embedded_config_sha256_before: Option<String>,
457    pub canonical_embedded_config_sha256_after: Option<String>,
458    pub artifact_identity_changed: bool,
459    pub embedded_config_changed: bool,
460    pub target_materialization_preserved: bool,
461    pub source_build_materialization: Option<RolePromotionMaterializationLinkV1>,
462}
463
464///
465/// RolePromotionMaterializationLinkV1
466///
467#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
468pub struct RolePromotionMaterializationLinkV1 {
469    pub role: String,
470    pub evidence_id: String,
471    pub recipe_id: String,
472    pub materialization_input_id: String,
473    pub materialization_result_id: String,
474    pub materialization_input_digest: String,
475    pub wasm_sha256: String,
476    pub wasm_gz_sha256: String,
477    pub installed_module_hash: String,
478    pub candid_sha256: String,
479}
480
481///
482/// PromotionReadinessStatusV1
483///
484#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
485pub enum PromotionReadinessStatusV1 {
486    Ready,
487    Blocked,
488}
489
490///
491/// RolePromotionReadinessV1
492///
493#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
494pub struct RolePromotionReadinessV1 {
495    pub role: String,
496    pub promotion_level: PromotionArtifactLevelV1,
497    pub source_kind: RoleArtifactSourceKindV1,
498    pub source_locator: Option<String>,
499    pub source_wasm_sha256: Option<String>,
500    pub source_wasm_gz_sha256: Option<String>,
501    pub target_wasm_sha256: Option<String>,
502    pub target_wasm_gz_sha256: Option<String>,
503    pub source_canonical_embedded_config_sha256: Option<String>,
504    pub target_canonical_embedded_config_sha256: Option<String>,
505    pub byte_identical_wasm: Option<bool>,
506    pub embedded_config_identical: Option<bool>,
507    pub target_store_has_artifact: Option<bool>,
508    pub restage_required: bool,
509}
510
511///
512/// RoleArtifactSourceKindV1
513///
514#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
515pub enum RoleArtifactSourceKindV1 {
516    WorkspacePackage,
517    PublishedPackage,
518    LocalWasm,
519    LocalWasmGz,
520    PreviousReceiptArtifact,
521    CanonicalWasmStoreDefault,
522}
523
524///
525/// PreviousArtifactReceiptKindV1
526///
527#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
528pub enum PreviousArtifactReceiptKindV1 {
529    DeploymentReceipt,
530    StagingReceipt,
531}
532
533///
534/// AuthorityReceiptV1
535///
536#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
537pub struct AuthorityReceiptV1 {
538    pub schema_version: u32,
539    pub operation_id: String,
540    pub check_id: Option<String>,
541    pub reconciliation_plan_id: String,
542    pub authority_report_id: String,
543    pub inventory_id: String,
544    pub authority_profile_hash: Option<String>,
545    pub operation_status: DeploymentExecutionStatusV1,
546    pub started_at: String,
547    pub finished_at: Option<String>,
548    pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
549    pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
550    pub hard_failures: Vec<SafetyFindingV1>,
551    pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
552    pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
553    pub command_result: DeploymentCommandResultV1,
554}
555
556///
557/// AuthorityDryRunEvidenceV1
558///
559#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
560pub struct AuthorityDryRunEvidenceV1 {
561    pub schema_version: u32,
562    pub evidence_id: String,
563    pub check_id: String,
564    pub generated_at: String,
565    pub reconciliation_plan: AuthorityReconciliationPlanV1,
566    pub authority_report: AuthorityReportV1,
567    pub authority_receipt: AuthorityReceiptV1,
568}
569
570///
571/// AuthorityAttemptedActionV1
572///
573#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
574pub struct AuthorityAttemptedActionV1 {
575    pub subject: String,
576    pub canister_id: Option<String>,
577    pub role: Option<String>,
578    pub action: AuthorityActionV1,
579    pub result: RolePhaseResultV1,
580    pub error: Option<String>,
581}
582
583///
584/// AuthorityControllerObservationV1
585///
586#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
587pub struct AuthorityControllerObservationV1 {
588    pub subject: String,
589    pub canister_id: Option<String>,
590    pub role: Option<String>,
591    pub state: AuthorityReconciliationStateV1,
592    pub action: AuthorityActionV1,
593    pub observed_controllers: Vec<String>,
594    pub desired_controllers: Vec<String>,
595    pub controller_delta: AuthorityControllerDeltaV1,
596}
597
598///
599/// RoleArtifactManifestV1
600///
601#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
602pub struct RoleArtifactManifestV1 {
603    pub schema_version: u32,
604    pub manifest_id: String,
605    pub network: String,
606    pub artifact_root: Option<String>,
607    pub role_artifacts: Vec<RoleArtifactV1>,
608    pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
609}
610
611///
612/// DeploymentDiffV1
613///
614#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
615pub struct DeploymentDiffV1 {
616    pub schema_version: u32,
617    pub plan_identity: DeploymentIdentityV1,
618    pub observed_identity: Option<DeploymentIdentityV1>,
619    pub artifact_diff: Vec<DiffItemV1>,
620    pub controller_diff: Vec<DiffItemV1>,
621    pub pool_diff: Vec<DiffItemV1>,
622    pub embedded_config_diff: Vec<DiffItemV1>,
623    pub module_hash_diff: Vec<DiffItemV1>,
624    pub verifier_readiness_diff: Vec<DiffItemV1>,
625    pub resume_safety: ResumeSafetyV1,
626    pub hard_failures: Vec<SafetyFindingV1>,
627    pub warnings: Vec<SafetyFindingV1>,
628    pub resumable_phases: Vec<String>,
629}
630
631///
632/// SafetyReportV1
633///
634#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
635pub struct SafetyReportV1 {
636    pub schema_version: u32,
637    pub report_id: String,
638    pub diff_id: Option<String>,
639    pub status: SafetyStatusV1,
640    pub summary: String,
641    pub hard_failures: Vec<SafetyFindingV1>,
642    pub warnings: Vec<SafetyFindingV1>,
643    pub next_actions: Vec<String>,
644}
645
646///
647/// DeploymentCheckV1
648///
649#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
650pub struct DeploymentCheckV1 {
651    pub schema_version: u32,
652    pub check_id: String,
653    pub plan: DeploymentPlanV1,
654    pub inventory: DeploymentInventoryV1,
655    pub diff: DeploymentDiffV1,
656    pub report: SafetyReportV1,
657}
658
659///
660/// AuthorityReconciliationPlanV1
661///
662#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
663pub struct AuthorityReconciliationPlanV1 {
664    pub schema_version: u32,
665    pub plan_id: String,
666    pub inventory_id: String,
667    pub authority_profile_hash: Option<String>,
668    pub canister_actions: Vec<CanisterAuthorityActionV1>,
669    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
670    pub hard_failures: Vec<SafetyFindingV1>,
671    pub external_actions_required: Vec<AuthorityExternalActionV1>,
672}
673
674///
675/// AuthorityAutomaticActionV1
676///
677#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
678pub struct AuthorityAutomaticActionV1 {
679    pub subject: String,
680    pub canister_id: String,
681    pub role: Option<String>,
682    pub action: AuthorityActionV1,
683    pub observed_controllers: Vec<String>,
684    pub desired_controllers: Vec<String>,
685    pub controller_delta: AuthorityControllerDeltaV1,
686    pub reason: String,
687}
688
689///
690/// AuthorityControllerDeltaV1
691///
692#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
693pub struct AuthorityControllerDeltaV1 {
694    pub add_controllers: Vec<String>,
695    pub remove_controllers: Vec<String>,
696}
697
698///
699/// AuthorityReportV1
700///
701#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
702pub struct AuthorityReportV1 {
703    pub schema_version: u32,
704    pub report_id: String,
705    pub check_id: Option<String>,
706    pub reconciliation_plan_id: String,
707    pub inventory_id: String,
708    pub authority_profile_hash: Option<String>,
709    pub status: SafetyStatusV1,
710    pub summary: String,
711    pub counts: AuthorityReportCountsV1,
712    pub apply_readiness: AuthorityApplyReadinessV1,
713    pub action_counts: Vec<AuthorityActionCountV1>,
714    pub control_class_counts: Vec<AuthorityControlClassCountV1>,
715    pub observation_gaps: Vec<DeploymentObservationGapV1>,
716    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
717    pub hard_failures: Vec<SafetyFindingV1>,
718    pub external_actions_required: Vec<AuthorityExternalActionV1>,
719    pub next_actions: Vec<String>,
720}
721
722///
723/// AuthorityApplyReadinessV1
724///
725#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
726pub struct AuthorityApplyReadinessV1 {
727    pub can_apply_automatically: bool,
728    pub automatic_action_count: usize,
729    pub blockers: Vec<AuthorityApplyBlockerV1>,
730}
731
732///
733/// AuthorityApplyBlockerV1
734///
735#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
736pub enum AuthorityApplyBlockerV1 {
737    UnsafeBlocked,
738    HardFailures,
739    ObservationGaps,
740    ExternalActions,
741}
742
743///
744/// AuthorityActionCountV1
745///
746#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
747pub struct AuthorityActionCountV1 {
748    pub action: AuthorityActionV1,
749    pub count: usize,
750}
751
752///
753/// AuthorityControlClassCountV1
754///
755#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
756pub struct AuthorityControlClassCountV1 {
757    pub control_class: CanisterControlClassV1,
758    pub count: usize,
759}
760
761///
762/// AuthorityReportCountsV1
763///
764#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
765pub struct AuthorityReportCountsV1 {
766    pub already_correct: usize,
767    pub can_apply_automatically: usize,
768    pub requires_external_action: usize,
769    pub unsafe_blocked: usize,
770    pub unknown: usize,
771    pub hard_failures: usize,
772}
773
774///
775/// CanisterAuthorityActionV1
776///
777#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
778pub struct CanisterAuthorityActionV1 {
779    pub canister_id: Option<String>,
780    pub role: Option<String>,
781    pub control_classification: CanisterControlClassV1,
782    pub observed_controllers: Vec<String>,
783    pub desired_controllers: Vec<String>,
784    pub controller_delta: AuthorityControllerDeltaV1,
785    pub action: AuthorityActionV1,
786    pub state: AuthorityReconciliationStateV1,
787    pub can_apply: bool,
788    pub reason: String,
789}
790
791///
792/// AuthorityExternalActionV1
793///
794#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
795pub struct AuthorityExternalActionV1 {
796    pub subject: String,
797    pub canister_id: Option<String>,
798    pub role: Option<String>,
799    pub control_classification: CanisterControlClassV1,
800    pub state: AuthorityReconciliationStateV1,
801    pub action: AuthorityActionV1,
802    pub observed_controllers: Vec<String>,
803    pub desired_controllers: Vec<String>,
804    pub controller_delta: AuthorityControllerDeltaV1,
805    pub reason: String,
806}
807
808///
809/// AuthorityActionV1
810///
811#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
812pub enum AuthorityActionV1 {
813    None,
814    AddControllers,
815    RemoveControllers,
816    ReplaceControllerSet,
817    RequiresExternalController,
818    RequiresDestructiveImportConfirmation,
819    ObserveOnly,
820    AdoptPlanAvailable,
821    BlockedByPolicy,
822    UnknownObservation,
823}
824
825///
826/// AuthorityReconciliationStateV1
827///
828#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
829pub enum AuthorityReconciliationStateV1 {
830    AlreadyCorrect,
831    CanApplyAutomatically,
832    RequiresExternalAction,
833    UnsafeBlocked,
834    Unknown,
835}
836
837///
838/// DeploymentIdentityV1
839///
840#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
841pub struct DeploymentIdentityV1 {
842    pub deployment_name: String,
843    pub network: String,
844    pub root_principal: Option<String>,
845    pub authority_profile_hash: Option<String>,
846    pub role_topology_hash: Option<String>,
847    pub deployment_manifest_digest: Option<String>,
848    pub canonical_runtime_config_digest: Option<String>,
849    pub role_embedded_config_set_digest: Option<String>,
850    pub artifact_set_digest: Option<String>,
851    pub pool_identity_set_digest: Option<String>,
852    pub canic_version: Option<String>,
853    pub ic_memory_version: Option<String>,
854}
855
856///
857/// TrustDomainV1
858///
859#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
860pub struct TrustDomainV1 {
861    pub root_trust_anchor: Option<String>,
862    pub migration_from: Option<String>,
863}
864
865///
866/// AuthorityProfileV1
867///
868#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
869pub struct AuthorityProfileV1 {
870    pub profile_id: String,
871    pub expected_controllers: Vec<String>,
872    pub staging_controllers: Vec<String>,
873    pub emergency_controllers: Vec<String>,
874}
875
876///
877/// RoleArtifactV1
878///
879#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
880pub struct RoleArtifactV1 {
881    pub role: String,
882    pub source: ArtifactSourceV1,
883    pub build_profile: String,
884    pub wasm_path: Option<String>,
885    pub wasm_gz_path: Option<String>,
886    pub wasm_gz_size_bytes: Option<u64>,
887    pub wasm_sha256: Option<String>,
888    pub wasm_gz_sha256: Option<String>,
889    pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
890    pub observed_wasm_gz_file_sha256: Option<String>,
891    pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
892    pub installed_module_hash: Option<String>,
893    pub candid_path: Option<String>,
894    pub candid_sha256: Option<String>,
895    pub raw_config_sha256: Option<String>,
896    pub canonical_embedded_config_sha256: Option<String>,
897    pub embedded_topology_sha256: Option<String>,
898    pub builder_version: Option<String>,
899    pub rust_toolchain: Option<String>,
900    pub package_version: Option<String>,
901}
902
903///
904/// ArtifactDigestSourceV1
905///
906#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
907pub enum ArtifactDigestSourceV1 {
908    ReleaseSetManifest,
909    ObservedFileDigest,
910    InstalledModuleHash,
911}
912
913///
914/// ArtifactSourceV1
915///
916#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
917pub enum ArtifactSourceV1 {
918    LocalBuild,
919    ReleaseSet,
920    WasmStore,
921    External,
922    Unknown,
923}
924
925///
926/// ExpectedCanisterV1
927///
928#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
929pub struct ExpectedCanisterV1 {
930    pub role: String,
931    pub canister_id: Option<String>,
932    pub control_class: CanisterControlClassV1,
933}
934
935///
936/// ObservedCanisterV1
937///
938#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
939pub struct ObservedCanisterV1 {
940    pub canister_id: String,
941    pub role: Option<String>,
942    pub control_class: CanisterControlClassV1,
943    pub controllers: Vec<String>,
944    pub module_hash: Option<String>,
945    pub status: Option<String>,
946    pub root_trust_anchor: Option<String>,
947    pub canonical_embedded_config_digest: Option<String>,
948    pub role_assignment_source: Option<String>,
949}
950
951///
952/// CanisterControlClassV1
953///
954#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
955pub enum CanisterControlClassV1 {
956    DeploymentControlled,
957    CanicManagedPool,
958    ExternallyImported,
959    JointlyControlled,
960    UserControlled,
961    UnknownUnsafe,
962}
963
964///
965/// ExpectedPoolCanisterV1
966///
967#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
968pub struct ExpectedPoolCanisterV1 {
969    pub pool: String,
970    pub canister_id: Option<String>,
971    pub role: Option<String>,
972}
973
974///
975/// ObservedPoolCanisterV1
976///
977#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
978pub struct ObservedPoolCanisterV1 {
979    pub pool: String,
980    pub canister_id: String,
981    pub role: Option<String>,
982    pub control_class: CanisterControlClassV1,
983}
984
985///
986/// LocalDeploymentConfigV1
987///
988#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
989pub struct LocalDeploymentConfigV1 {
990    pub config_path: Option<String>,
991    pub raw_config_sha256: Option<String>,
992    pub canonical_embedded_config_sha256: Option<String>,
993}
994
995///
996/// ObservedArtifactV1
997///
998#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
999pub struct ObservedArtifactV1 {
1000    pub role: String,
1001    pub artifact_path: String,
1002    pub file_sha256: Option<String>,
1003    pub file_sha256_source: Option<ArtifactDigestSourceV1>,
1004    pub payload_sha256: Option<String>,
1005    pub payload_size_bytes: Option<u64>,
1006    pub source: ArtifactSourceV1,
1007}
1008
1009///
1010/// VerifierReadinessExpectationV1
1011///
1012#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1013pub struct VerifierReadinessExpectationV1 {
1014    pub required: bool,
1015    pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
1016}
1017
1018///
1019/// VerifierReadinessObservationV1
1020///
1021#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1022pub struct VerifierReadinessObservationV1 {
1023    pub status: ObservationStatusV1,
1024    pub role_epochs: Vec<RoleEpochObservationV1>,
1025}
1026
1027///
1028/// RoleEpochExpectationV1
1029///
1030#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1031pub struct RoleEpochExpectationV1 {
1032    pub role: String,
1033    pub minimum_epoch: u64,
1034}
1035
1036///
1037/// RoleEpochObservationV1
1038///
1039#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1040pub struct RoleEpochObservationV1 {
1041    pub role: String,
1042    pub observed_epoch: Option<u64>,
1043    pub status: ObservationStatusV1,
1044}
1045
1046///
1047/// DeploymentAssumptionV1
1048///
1049#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1050pub struct DeploymentAssumptionV1 {
1051    pub key: String,
1052    pub description: String,
1053}
1054
1055///
1056/// DeploymentObservationGapV1
1057///
1058#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1059pub struct DeploymentObservationGapV1 {
1060    pub key: String,
1061    pub description: String,
1062}
1063
1064///
1065/// PhaseReceiptV1
1066///
1067#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1068pub struct PhaseReceiptV1 {
1069    pub phase: String,
1070    pub started_at: String,
1071    pub finished_at: Option<String>,
1072    pub attempted_action: String,
1073    pub verified_postcondition: VerifiedPostconditionV1,
1074}
1075
1076///
1077/// VerifiedPostconditionV1
1078///
1079#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1080pub struct VerifiedPostconditionV1 {
1081    pub status: ObservationStatusV1,
1082    pub evidence: Vec<String>,
1083}
1084
1085///
1086/// DeploymentExecutionStatusV1
1087///
1088#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1089pub enum DeploymentExecutionStatusV1 {
1090    NotStarted,
1091    InProgress,
1092    FailedBeforeMutation,
1093    PartiallyApplied,
1094    FailedAfterMutation,
1095    Complete,
1096}
1097
1098///
1099/// DeploymentCommandResultV1
1100///
1101#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1102pub enum DeploymentCommandResultV1 {
1103    NotFinished,
1104    Succeeded,
1105    Failed { code: String, message: String },
1106}
1107
1108///
1109/// RolePhaseReceiptV1
1110///
1111#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1112pub struct RolePhaseReceiptV1 {
1113    pub role: String,
1114    pub phase: String,
1115    pub result: RolePhaseResultV1,
1116    pub previous_module_hash: Option<String>,
1117    pub target_module_hash: Option<String>,
1118    pub observed_module_hash_after: Option<String>,
1119    pub artifact_digest: Option<String>,
1120    pub canonical_embedded_config_sha256: Option<String>,
1121    pub error: Option<String>,
1122}
1123
1124///
1125/// RolePhaseResultV1
1126///
1127#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1128pub enum RolePhaseResultV1 {
1129    Applied,
1130    Failed,
1131    Skipped,
1132    NotAttempted,
1133    VerifiedAlreadyApplied,
1134}
1135
1136///
1137/// DiffItemV1
1138///
1139#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1140pub struct DiffItemV1 {
1141    pub category: String,
1142    pub subject: String,
1143    pub expected: Option<String>,
1144    pub observed: Option<String>,
1145    pub severity: SafetySeverityV1,
1146}
1147
1148///
1149/// ResumeSafetyV1
1150///
1151#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1152pub struct ResumeSafetyV1 {
1153    pub status: SafetyStatusV1,
1154    pub reasons: Vec<String>,
1155}
1156
1157///
1158/// SafetyFindingV1
1159///
1160#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
1161pub struct SafetyFindingV1 {
1162    pub code: String,
1163    pub message: String,
1164    pub severity: SafetySeverityV1,
1165    pub subject: Option<String>,
1166}
1167
1168///
1169/// SafetyStatusV1
1170///
1171#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1172pub enum SafetyStatusV1 {
1173    NotEvaluated,
1174    Safe,
1175    Warning,
1176    Blocked,
1177}
1178
1179///
1180/// SafetySeverityV1
1181///
1182#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1183pub enum SafetySeverityV1 {
1184    Info,
1185    Warning,
1186    HardFailure,
1187}
1188
1189///
1190/// ObservationStatusV1
1191///
1192#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
1193pub enum ObservationStatusV1 {
1194    NotObserved,
1195    Observed,
1196    Missing,
1197    Inconclusive,
1198}