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