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/// AuthorityReceiptV1
150///
151#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
152pub struct AuthorityReceiptV1 {
153    pub schema_version: u32,
154    pub operation_id: String,
155    pub check_id: Option<String>,
156    pub reconciliation_plan_id: String,
157    pub authority_report_id: String,
158    pub inventory_id: String,
159    pub authority_profile_hash: Option<String>,
160    pub operation_status: DeploymentExecutionStatusV1,
161    pub started_at: String,
162    pub finished_at: Option<String>,
163    pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
164    pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
165    pub hard_failures: Vec<SafetyFindingV1>,
166    pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
167    pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
168    pub command_result: DeploymentCommandResultV1,
169}
170
171///
172/// AuthorityDryRunEvidenceV1
173///
174#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175pub struct AuthorityDryRunEvidenceV1 {
176    pub schema_version: u32,
177    pub evidence_id: String,
178    pub check_id: String,
179    pub generated_at: String,
180    pub reconciliation_plan: AuthorityReconciliationPlanV1,
181    pub authority_report: AuthorityReportV1,
182    pub authority_receipt: AuthorityReceiptV1,
183}
184
185///
186/// AuthorityAttemptedActionV1
187///
188#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
189pub struct AuthorityAttemptedActionV1 {
190    pub subject: String,
191    pub canister_id: Option<String>,
192    pub role: Option<String>,
193    pub action: AuthorityActionV1,
194    pub result: RolePhaseResultV1,
195    pub error: Option<String>,
196}
197
198///
199/// AuthorityControllerObservationV1
200///
201#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
202pub struct AuthorityControllerObservationV1 {
203    pub subject: String,
204    pub canister_id: Option<String>,
205    pub role: Option<String>,
206    pub state: AuthorityReconciliationStateV1,
207    pub action: AuthorityActionV1,
208    pub observed_controllers: Vec<String>,
209    pub desired_controllers: Vec<String>,
210    pub controller_delta: AuthorityControllerDeltaV1,
211}
212
213///
214/// RoleArtifactManifestV1
215///
216#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
217pub struct RoleArtifactManifestV1 {
218    pub schema_version: u32,
219    pub manifest_id: String,
220    pub network: String,
221    pub artifact_root: Option<String>,
222    pub role_artifacts: Vec<RoleArtifactV1>,
223    pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
224}
225
226///
227/// DeploymentDiffV1
228///
229#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
230pub struct DeploymentDiffV1 {
231    pub schema_version: u32,
232    pub plan_identity: DeploymentIdentityV1,
233    pub observed_identity: Option<DeploymentIdentityV1>,
234    pub artifact_diff: Vec<DiffItemV1>,
235    pub controller_diff: Vec<DiffItemV1>,
236    pub pool_diff: Vec<DiffItemV1>,
237    pub embedded_config_diff: Vec<DiffItemV1>,
238    pub module_hash_diff: Vec<DiffItemV1>,
239    pub verifier_readiness_diff: Vec<DiffItemV1>,
240    pub resume_safety: ResumeSafetyV1,
241    pub hard_failures: Vec<SafetyFindingV1>,
242    pub warnings: Vec<SafetyFindingV1>,
243    pub resumable_phases: Vec<String>,
244}
245
246///
247/// SafetyReportV1
248///
249#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
250pub struct SafetyReportV1 {
251    pub schema_version: u32,
252    pub report_id: String,
253    pub diff_id: Option<String>,
254    pub status: SafetyStatusV1,
255    pub summary: String,
256    pub hard_failures: Vec<SafetyFindingV1>,
257    pub warnings: Vec<SafetyFindingV1>,
258    pub next_actions: Vec<String>,
259}
260
261///
262/// DeploymentCheckV1
263///
264#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
265pub struct DeploymentCheckV1 {
266    pub schema_version: u32,
267    pub check_id: String,
268    pub plan: DeploymentPlanV1,
269    pub inventory: DeploymentInventoryV1,
270    pub diff: DeploymentDiffV1,
271    pub report: SafetyReportV1,
272}
273
274///
275/// AuthorityReconciliationPlanV1
276///
277#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
278pub struct AuthorityReconciliationPlanV1 {
279    pub schema_version: u32,
280    pub plan_id: String,
281    pub inventory_id: String,
282    pub authority_profile_hash: Option<String>,
283    pub canister_actions: Vec<CanisterAuthorityActionV1>,
284    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
285    pub hard_failures: Vec<SafetyFindingV1>,
286    pub external_actions_required: Vec<AuthorityExternalActionV1>,
287}
288
289///
290/// AuthorityAutomaticActionV1
291///
292#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
293pub struct AuthorityAutomaticActionV1 {
294    pub subject: String,
295    pub canister_id: String,
296    pub role: Option<String>,
297    pub action: AuthorityActionV1,
298    pub observed_controllers: Vec<String>,
299    pub desired_controllers: Vec<String>,
300    pub controller_delta: AuthorityControllerDeltaV1,
301    pub reason: String,
302}
303
304///
305/// AuthorityControllerDeltaV1
306///
307#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
308pub struct AuthorityControllerDeltaV1 {
309    pub add_controllers: Vec<String>,
310    pub remove_controllers: Vec<String>,
311}
312
313///
314/// AuthorityReportV1
315///
316#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
317pub struct AuthorityReportV1 {
318    pub schema_version: u32,
319    pub report_id: String,
320    pub check_id: Option<String>,
321    pub reconciliation_plan_id: String,
322    pub inventory_id: String,
323    pub authority_profile_hash: Option<String>,
324    pub status: SafetyStatusV1,
325    pub summary: String,
326    pub counts: AuthorityReportCountsV1,
327    pub apply_readiness: AuthorityApplyReadinessV1,
328    pub action_counts: Vec<AuthorityActionCountV1>,
329    pub control_class_counts: Vec<AuthorityControlClassCountV1>,
330    pub observation_gaps: Vec<DeploymentObservationGapV1>,
331    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
332    pub hard_failures: Vec<SafetyFindingV1>,
333    pub external_actions_required: Vec<AuthorityExternalActionV1>,
334    pub next_actions: Vec<String>,
335}
336
337///
338/// AuthorityApplyReadinessV1
339///
340#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
341pub struct AuthorityApplyReadinessV1 {
342    pub can_apply_automatically: bool,
343    pub automatic_action_count: usize,
344    pub blockers: Vec<AuthorityApplyBlockerV1>,
345}
346
347///
348/// AuthorityApplyBlockerV1
349///
350#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
351pub enum AuthorityApplyBlockerV1 {
352    UnsafeBlocked,
353    HardFailures,
354    ObservationGaps,
355    ExternalActions,
356}
357
358///
359/// AuthorityActionCountV1
360///
361#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
362pub struct AuthorityActionCountV1 {
363    pub action: AuthorityActionV1,
364    pub count: usize,
365}
366
367///
368/// AuthorityControlClassCountV1
369///
370#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371pub struct AuthorityControlClassCountV1 {
372    pub control_class: CanisterControlClassV1,
373    pub count: usize,
374}
375
376///
377/// AuthorityReportCountsV1
378///
379#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
380pub struct AuthorityReportCountsV1 {
381    pub already_correct: usize,
382    pub can_apply_automatically: usize,
383    pub requires_external_action: usize,
384    pub unsafe_blocked: usize,
385    pub unknown: usize,
386    pub hard_failures: usize,
387}
388
389///
390/// CanisterAuthorityActionV1
391///
392#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
393pub struct CanisterAuthorityActionV1 {
394    pub canister_id: Option<String>,
395    pub role: Option<String>,
396    pub control_classification: CanisterControlClassV1,
397    pub observed_controllers: Vec<String>,
398    pub desired_controllers: Vec<String>,
399    pub controller_delta: AuthorityControllerDeltaV1,
400    pub action: AuthorityActionV1,
401    pub state: AuthorityReconciliationStateV1,
402    pub can_apply: bool,
403    pub reason: String,
404}
405
406///
407/// AuthorityExternalActionV1
408///
409#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
410pub struct AuthorityExternalActionV1 {
411    pub subject: String,
412    pub canister_id: Option<String>,
413    pub role: Option<String>,
414    pub control_classification: CanisterControlClassV1,
415    pub state: AuthorityReconciliationStateV1,
416    pub action: AuthorityActionV1,
417    pub observed_controllers: Vec<String>,
418    pub desired_controllers: Vec<String>,
419    pub controller_delta: AuthorityControllerDeltaV1,
420    pub reason: String,
421}
422
423///
424/// AuthorityActionV1
425///
426#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
427pub enum AuthorityActionV1 {
428    None,
429    AddControllers,
430    RemoveControllers,
431    ReplaceControllerSet,
432    RequiresExternalController,
433    RequiresDestructiveImportConfirmation,
434    ObserveOnly,
435    AdoptPlanAvailable,
436    BlockedByPolicy,
437    UnknownObservation,
438}
439
440///
441/// AuthorityReconciliationStateV1
442///
443#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
444pub enum AuthorityReconciliationStateV1 {
445    AlreadyCorrect,
446    CanApplyAutomatically,
447    RequiresExternalAction,
448    UnsafeBlocked,
449    Unknown,
450}
451
452///
453/// DeploymentIdentityV1
454///
455#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
456pub struct DeploymentIdentityV1 {
457    pub deployment_name: String,
458    pub network: String,
459    pub root_principal: Option<String>,
460    pub authority_profile_hash: Option<String>,
461    pub role_topology_hash: Option<String>,
462    pub deployment_manifest_digest: Option<String>,
463    pub canonical_runtime_config_digest: Option<String>,
464    pub role_embedded_config_set_digest: Option<String>,
465    pub artifact_set_digest: Option<String>,
466    pub pool_identity_set_digest: Option<String>,
467    pub canic_version: Option<String>,
468    pub ic_memory_version: Option<String>,
469}
470
471///
472/// TrustDomainV1
473///
474#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
475pub struct TrustDomainV1 {
476    pub root_trust_anchor: Option<String>,
477    pub migration_from: Option<String>,
478}
479
480///
481/// AuthorityProfileV1
482///
483#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
484pub struct AuthorityProfileV1 {
485    pub profile_id: String,
486    pub expected_controllers: Vec<String>,
487    pub staging_controllers: Vec<String>,
488    pub emergency_controllers: Vec<String>,
489}
490
491///
492/// RoleArtifactV1
493///
494#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
495pub struct RoleArtifactV1 {
496    pub role: String,
497    pub source: ArtifactSourceV1,
498    pub build_profile: String,
499    pub wasm_path: Option<String>,
500    pub wasm_gz_path: Option<String>,
501    pub wasm_gz_size_bytes: Option<u64>,
502    pub wasm_sha256: Option<String>,
503    pub wasm_gz_sha256: Option<String>,
504    pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
505    pub observed_wasm_gz_file_sha256: Option<String>,
506    pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
507    pub installed_module_hash: Option<String>,
508    pub candid_path: Option<String>,
509    pub candid_sha256: Option<String>,
510    pub raw_config_sha256: Option<String>,
511    pub canonical_embedded_config_sha256: Option<String>,
512    pub embedded_topology_sha256: Option<String>,
513    pub builder_version: Option<String>,
514    pub rust_toolchain: Option<String>,
515    pub package_version: Option<String>,
516}
517
518///
519/// ArtifactDigestSourceV1
520///
521#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
522pub enum ArtifactDigestSourceV1 {
523    ReleaseSetManifest,
524    ObservedFileDigest,
525    InstalledModuleHash,
526}
527
528///
529/// ArtifactSourceV1
530///
531#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
532pub enum ArtifactSourceV1 {
533    LocalBuild,
534    ReleaseSet,
535    WasmStore,
536    External,
537    Unknown,
538}
539
540///
541/// ExpectedCanisterV1
542///
543#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
544pub struct ExpectedCanisterV1 {
545    pub role: String,
546    pub canister_id: Option<String>,
547    pub control_class: CanisterControlClassV1,
548}
549
550///
551/// ObservedCanisterV1
552///
553#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
554pub struct ObservedCanisterV1 {
555    pub canister_id: String,
556    pub role: Option<String>,
557    pub control_class: CanisterControlClassV1,
558    pub controllers: Vec<String>,
559    pub module_hash: Option<String>,
560    pub status: Option<String>,
561    pub root_trust_anchor: Option<String>,
562    pub canonical_embedded_config_digest: Option<String>,
563    pub role_assignment_source: Option<String>,
564}
565
566///
567/// CanisterControlClassV1
568///
569#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
570pub enum CanisterControlClassV1 {
571    DeploymentControlled,
572    CanicManagedPool,
573    ExternallyImported,
574    JointlyControlled,
575    UserControlled,
576    UnknownUnsafe,
577}
578
579///
580/// ExpectedPoolCanisterV1
581///
582#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
583pub struct ExpectedPoolCanisterV1 {
584    pub pool: String,
585    pub canister_id: Option<String>,
586    pub role: Option<String>,
587}
588
589///
590/// ObservedPoolCanisterV1
591///
592#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
593pub struct ObservedPoolCanisterV1 {
594    pub pool: String,
595    pub canister_id: String,
596    pub role: Option<String>,
597    pub control_class: CanisterControlClassV1,
598}
599
600///
601/// LocalDeploymentConfigV1
602///
603#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
604pub struct LocalDeploymentConfigV1 {
605    pub config_path: Option<String>,
606    pub raw_config_sha256: Option<String>,
607    pub canonical_embedded_config_sha256: Option<String>,
608}
609
610///
611/// ObservedArtifactV1
612///
613#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
614pub struct ObservedArtifactV1 {
615    pub role: String,
616    pub artifact_path: String,
617    pub file_sha256: Option<String>,
618    pub file_sha256_source: Option<ArtifactDigestSourceV1>,
619    pub payload_sha256: Option<String>,
620    pub payload_size_bytes: Option<u64>,
621    pub source: ArtifactSourceV1,
622}
623
624///
625/// VerifierReadinessExpectationV1
626///
627#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
628pub struct VerifierReadinessExpectationV1 {
629    pub required: bool,
630    pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
631}
632
633///
634/// VerifierReadinessObservationV1
635///
636#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
637pub struct VerifierReadinessObservationV1 {
638    pub status: ObservationStatusV1,
639    pub role_epochs: Vec<RoleEpochObservationV1>,
640}
641
642///
643/// RoleEpochExpectationV1
644///
645#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
646pub struct RoleEpochExpectationV1 {
647    pub role: String,
648    pub minimum_epoch: u64,
649}
650
651///
652/// RoleEpochObservationV1
653///
654#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
655pub struct RoleEpochObservationV1 {
656    pub role: String,
657    pub observed_epoch: Option<u64>,
658    pub status: ObservationStatusV1,
659}
660
661///
662/// DeploymentAssumptionV1
663///
664#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
665pub struct DeploymentAssumptionV1 {
666    pub key: String,
667    pub description: String,
668}
669
670///
671/// DeploymentObservationGapV1
672///
673#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
674pub struct DeploymentObservationGapV1 {
675    pub key: String,
676    pub description: String,
677}
678
679///
680/// PhaseReceiptV1
681///
682#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
683pub struct PhaseReceiptV1 {
684    pub phase: String,
685    pub started_at: String,
686    pub finished_at: Option<String>,
687    pub attempted_action: String,
688    pub verified_postcondition: VerifiedPostconditionV1,
689}
690
691///
692/// VerifiedPostconditionV1
693///
694#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
695pub struct VerifiedPostconditionV1 {
696    pub status: ObservationStatusV1,
697    pub evidence: Vec<String>,
698}
699
700///
701/// DeploymentExecutionStatusV1
702///
703#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
704pub enum DeploymentExecutionStatusV1 {
705    NotStarted,
706    InProgress,
707    FailedBeforeMutation,
708    PartiallyApplied,
709    FailedAfterMutation,
710    Complete,
711}
712
713///
714/// DeploymentCommandResultV1
715///
716#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
717pub enum DeploymentCommandResultV1 {
718    NotFinished,
719    Succeeded,
720    Failed { code: String, message: String },
721}
722
723///
724/// RolePhaseReceiptV1
725///
726#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
727pub struct RolePhaseReceiptV1 {
728    pub role: String,
729    pub phase: String,
730    pub result: RolePhaseResultV1,
731    pub previous_module_hash: Option<String>,
732    pub target_module_hash: Option<String>,
733    pub observed_module_hash_after: Option<String>,
734    pub artifact_digest: Option<String>,
735    pub canonical_embedded_config_sha256: Option<String>,
736    pub error: Option<String>,
737}
738
739///
740/// RolePhaseResultV1
741///
742#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
743pub enum RolePhaseResultV1 {
744    Applied,
745    Failed,
746    Skipped,
747    NotAttempted,
748    VerifiedAlreadyApplied,
749}
750
751///
752/// DiffItemV1
753///
754#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
755pub struct DiffItemV1 {
756    pub category: String,
757    pub subject: String,
758    pub expected: Option<String>,
759    pub observed: Option<String>,
760    pub severity: SafetySeverityV1,
761}
762
763///
764/// ResumeSafetyV1
765///
766#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
767pub struct ResumeSafetyV1 {
768    pub status: SafetyStatusV1,
769    pub reasons: Vec<String>,
770}
771
772///
773/// SafetyFindingV1
774///
775#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
776pub struct SafetyFindingV1 {
777    pub code: String,
778    pub message: String,
779    pub severity: SafetySeverityV1,
780    pub subject: Option<String>,
781}
782
783///
784/// SafetyStatusV1
785///
786#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
787pub enum SafetyStatusV1 {
788    NotEvaluated,
789    Safe,
790    Warning,
791    Blocked,
792}
793
794///
795/// SafetySeverityV1
796///
797#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
798pub enum SafetySeverityV1 {
799    Info,
800    Warning,
801    HardFailure,
802}
803
804///
805/// ObservationStatusV1
806///
807#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
808pub enum ObservationStatusV1 {
809    NotObserved,
810    Observed,
811    Missing,
812    Inconclusive,
813}