1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7pub struct DeploymentPlanV1 {
8 pub schema_version: u32,
9 pub plan_id: String,
10 pub deployment_identity: DeploymentIdentityV1,
11 pub trust_domain: TrustDomainV1,
12 pub fleet_template: String,
13 pub runtime_variant: String,
14 pub authority_profile: AuthorityProfileV1,
15 pub role_artifacts: Vec<RoleArtifactV1>,
16 pub expected_canisters: Vec<ExpectedCanisterV1>,
17 pub expected_pool: Vec<ExpectedPoolCanisterV1>,
18 pub expected_verifier_readiness: VerifierReadinessExpectationV1,
19 pub unresolved_assumptions: Vec<DeploymentAssumptionV1>,
20}
21
22#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
26pub struct DeploymentInventoryV1 {
27 pub schema_version: u32,
28 pub inventory_id: String,
29 pub observed_at: String,
30 pub observed_identity: Option<DeploymentIdentityV1>,
31 pub local_config: LocalDeploymentConfigV1,
32 pub observed_canisters: Vec<ObservedCanisterV1>,
33 pub observed_pool: Vec<ObservedPoolCanisterV1>,
34 pub observed_artifacts: Vec<ObservedArtifactV1>,
35 pub observed_verifier_readiness: VerifierReadinessObservationV1,
36 pub unresolved_observations: Vec<DeploymentObservationGapV1>,
37}
38
39#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
43pub struct DeploymentReceiptV1 {
44 pub schema_version: u32,
45 pub operation_id: String,
46 pub plan_id: String,
47 pub 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#[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#[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#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
93pub enum DeploymentExecutionPreflightStatusV1 {
94 Ready,
95 Blocked,
96}
97
98#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102pub enum DeploymentExecutorBackendV1 {
103 CurrentCli,
104 PocketIc,
105 DirectAgent,
106 Other { name: String },
107}
108
109#[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#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
127pub struct AuthorityReceiptV1 {
128 pub schema_version: u32,
129 pub operation_id: String,
130 pub check_id: Option<String>,
131 pub reconciliation_plan_id: String,
132 pub authority_report_id: String,
133 pub inventory_id: String,
134 pub authority_profile_hash: Option<String>,
135 pub operation_status: DeploymentExecutionStatusV1,
136 pub started_at: String,
137 pub finished_at: Option<String>,
138 pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
139 pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
140 pub hard_failures: Vec<SafetyFindingV1>,
141 pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
142 pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
143 pub command_result: DeploymentCommandResultV1,
144}
145
146#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct AuthorityDryRunEvidenceV1 {
151 pub schema_version: u32,
152 pub evidence_id: String,
153 pub check_id: String,
154 pub generated_at: String,
155 pub reconciliation_plan: AuthorityReconciliationPlanV1,
156 pub authority_report: AuthorityReportV1,
157 pub authority_receipt: AuthorityReceiptV1,
158}
159
160#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
164pub struct AuthorityAttemptedActionV1 {
165 pub subject: String,
166 pub canister_id: Option<String>,
167 pub role: Option<String>,
168 pub action: AuthorityActionV1,
169 pub result: RolePhaseResultV1,
170 pub error: Option<String>,
171}
172
173#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
177pub struct AuthorityControllerObservationV1 {
178 pub subject: String,
179 pub canister_id: Option<String>,
180 pub role: Option<String>,
181 pub state: AuthorityReconciliationStateV1,
182 pub action: AuthorityActionV1,
183 pub observed_controllers: Vec<String>,
184 pub desired_controllers: Vec<String>,
185 pub controller_delta: AuthorityControllerDeltaV1,
186}
187
188#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
192pub struct RoleArtifactManifestV1 {
193 pub schema_version: u32,
194 pub manifest_id: String,
195 pub network: String,
196 pub artifact_root: Option<String>,
197 pub role_artifacts: Vec<RoleArtifactV1>,
198 pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
199}
200
201#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
205pub struct DeploymentDiffV1 {
206 pub schema_version: u32,
207 pub plan_identity: DeploymentIdentityV1,
208 pub observed_identity: Option<DeploymentIdentityV1>,
209 pub artifact_diff: Vec<DiffItemV1>,
210 pub controller_diff: Vec<DiffItemV1>,
211 pub pool_diff: Vec<DiffItemV1>,
212 pub embedded_config_diff: Vec<DiffItemV1>,
213 pub module_hash_diff: Vec<DiffItemV1>,
214 pub verifier_readiness_diff: Vec<DiffItemV1>,
215 pub resume_safety: ResumeSafetyV1,
216 pub hard_failures: Vec<SafetyFindingV1>,
217 pub warnings: Vec<SafetyFindingV1>,
218 pub resumable_phases: Vec<String>,
219}
220
221#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
225pub struct SafetyReportV1 {
226 pub schema_version: u32,
227 pub report_id: String,
228 pub diff_id: Option<String>,
229 pub status: SafetyStatusV1,
230 pub summary: String,
231 pub hard_failures: Vec<SafetyFindingV1>,
232 pub warnings: Vec<SafetyFindingV1>,
233 pub next_actions: Vec<String>,
234}
235
236#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
240pub struct DeploymentCheckV1 {
241 pub schema_version: u32,
242 pub check_id: String,
243 pub plan: DeploymentPlanV1,
244 pub inventory: DeploymentInventoryV1,
245 pub diff: DeploymentDiffV1,
246 pub report: SafetyReportV1,
247}
248
249#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
253pub struct AuthorityReconciliationPlanV1 {
254 pub schema_version: u32,
255 pub plan_id: String,
256 pub inventory_id: String,
257 pub authority_profile_hash: Option<String>,
258 pub canister_actions: Vec<CanisterAuthorityActionV1>,
259 pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
260 pub hard_failures: Vec<SafetyFindingV1>,
261 pub external_actions_required: Vec<AuthorityExternalActionV1>,
262}
263
264#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
268pub struct AuthorityAutomaticActionV1 {
269 pub subject: String,
270 pub canister_id: String,
271 pub role: Option<String>,
272 pub action: AuthorityActionV1,
273 pub observed_controllers: Vec<String>,
274 pub desired_controllers: Vec<String>,
275 pub controller_delta: AuthorityControllerDeltaV1,
276 pub reason: String,
277}
278
279#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
283pub struct AuthorityControllerDeltaV1 {
284 pub add_controllers: Vec<String>,
285 pub remove_controllers: Vec<String>,
286}
287
288#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
292pub struct AuthorityReportV1 {
293 pub schema_version: u32,
294 pub report_id: String,
295 pub check_id: Option<String>,
296 pub reconciliation_plan_id: String,
297 pub inventory_id: String,
298 pub authority_profile_hash: Option<String>,
299 pub status: SafetyStatusV1,
300 pub summary: String,
301 pub counts: AuthorityReportCountsV1,
302 pub apply_readiness: AuthorityApplyReadinessV1,
303 pub action_counts: Vec<AuthorityActionCountV1>,
304 pub control_class_counts: Vec<AuthorityControlClassCountV1>,
305 pub observation_gaps: Vec<DeploymentObservationGapV1>,
306 pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
307 pub hard_failures: Vec<SafetyFindingV1>,
308 pub external_actions_required: Vec<AuthorityExternalActionV1>,
309 pub next_actions: Vec<String>,
310}
311
312#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
316pub struct AuthorityApplyReadinessV1 {
317 pub can_apply_automatically: bool,
318 pub automatic_action_count: usize,
319 pub blockers: Vec<AuthorityApplyBlockerV1>,
320}
321
322#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
326pub enum AuthorityApplyBlockerV1 {
327 UnsafeBlocked,
328 HardFailures,
329 ObservationGaps,
330 ExternalActions,
331}
332
333#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337pub struct AuthorityActionCountV1 {
338 pub action: AuthorityActionV1,
339 pub count: usize,
340}
341
342#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
346pub struct AuthorityControlClassCountV1 {
347 pub control_class: CanisterControlClassV1,
348 pub count: usize,
349}
350
351#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
355pub struct AuthorityReportCountsV1 {
356 pub already_correct: usize,
357 pub can_apply_automatically: usize,
358 pub requires_external_action: usize,
359 pub unsafe_blocked: usize,
360 pub unknown: usize,
361 pub hard_failures: usize,
362}
363
364#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
368pub struct CanisterAuthorityActionV1 {
369 pub canister_id: Option<String>,
370 pub role: Option<String>,
371 pub control_classification: CanisterControlClassV1,
372 pub observed_controllers: Vec<String>,
373 pub desired_controllers: Vec<String>,
374 pub controller_delta: AuthorityControllerDeltaV1,
375 pub action: AuthorityActionV1,
376 pub state: AuthorityReconciliationStateV1,
377 pub can_apply: bool,
378 pub reason: String,
379}
380
381#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
385pub struct AuthorityExternalActionV1 {
386 pub subject: String,
387 pub canister_id: Option<String>,
388 pub role: Option<String>,
389 pub control_classification: CanisterControlClassV1,
390 pub state: AuthorityReconciliationStateV1,
391 pub action: AuthorityActionV1,
392 pub observed_controllers: Vec<String>,
393 pub desired_controllers: Vec<String>,
394 pub controller_delta: AuthorityControllerDeltaV1,
395 pub reason: String,
396}
397
398#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
402pub enum AuthorityActionV1 {
403 None,
404 AddControllers,
405 RemoveControllers,
406 ReplaceControllerSet,
407 RequiresExternalController,
408 RequiresDestructiveImportConfirmation,
409 ObserveOnly,
410 AdoptPlanAvailable,
411 BlockedByPolicy,
412 UnknownObservation,
413}
414
415#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
419pub enum AuthorityReconciliationStateV1 {
420 AlreadyCorrect,
421 CanApplyAutomatically,
422 RequiresExternalAction,
423 UnsafeBlocked,
424 Unknown,
425}
426
427#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
431pub struct DeploymentIdentityV1 {
432 pub deployment_name: String,
433 pub network: String,
434 pub root_principal: Option<String>,
435 pub authority_profile_hash: Option<String>,
436 pub role_topology_hash: Option<String>,
437 pub deployment_manifest_digest: Option<String>,
438 pub canonical_runtime_config_digest: Option<String>,
439 pub role_embedded_config_set_digest: Option<String>,
440 pub artifact_set_digest: Option<String>,
441 pub pool_identity_set_digest: Option<String>,
442 pub canic_version: Option<String>,
443 pub ic_memory_version: Option<String>,
444}
445
446#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
450pub struct TrustDomainV1 {
451 pub root_trust_anchor: Option<String>,
452 pub migration_from: Option<String>,
453}
454
455#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
459pub struct AuthorityProfileV1 {
460 pub profile_id: String,
461 pub expected_controllers: Vec<String>,
462 pub staging_controllers: Vec<String>,
463 pub emergency_controllers: Vec<String>,
464}
465
466#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
470pub struct RoleArtifactV1 {
471 pub role: String,
472 pub source: ArtifactSourceV1,
473 pub build_profile: String,
474 pub wasm_path: Option<String>,
475 pub wasm_gz_path: Option<String>,
476 pub wasm_gz_size_bytes: Option<u64>,
477 pub wasm_sha256: Option<String>,
478 pub wasm_gz_sha256: Option<String>,
479 pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
480 pub observed_wasm_gz_file_sha256: Option<String>,
481 pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
482 pub installed_module_hash: Option<String>,
483 pub candid_path: Option<String>,
484 pub candid_sha256: Option<String>,
485 pub raw_config_sha256: Option<String>,
486 pub canonical_embedded_config_sha256: Option<String>,
487 pub embedded_topology_sha256: Option<String>,
488 pub builder_version: Option<String>,
489 pub rust_toolchain: Option<String>,
490 pub package_version: Option<String>,
491}
492
493#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
497pub enum ArtifactDigestSourceV1 {
498 ReleaseSetManifest,
499 ObservedFileDigest,
500 InstalledModuleHash,
501}
502
503#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
507pub enum ArtifactSourceV1 {
508 LocalBuild,
509 ReleaseSet,
510 WasmStore,
511 External,
512 Unknown,
513}
514
515#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
519pub struct ExpectedCanisterV1 {
520 pub role: String,
521 pub canister_id: Option<String>,
522 pub control_class: CanisterControlClassV1,
523}
524
525#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
529pub struct ObservedCanisterV1 {
530 pub canister_id: String,
531 pub role: Option<String>,
532 pub control_class: CanisterControlClassV1,
533 pub controllers: Vec<String>,
534 pub module_hash: Option<String>,
535 pub status: Option<String>,
536 pub root_trust_anchor: Option<String>,
537 pub canonical_embedded_config_digest: Option<String>,
538 pub role_assignment_source: Option<String>,
539}
540
541#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
545pub enum CanisterControlClassV1 {
546 DeploymentControlled,
547 CanicManagedPool,
548 ExternallyImported,
549 JointlyControlled,
550 UserControlled,
551 UnknownUnsafe,
552}
553
554#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
558pub struct ExpectedPoolCanisterV1 {
559 pub pool: String,
560 pub canister_id: Option<String>,
561 pub role: Option<String>,
562}
563
564#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
568pub struct ObservedPoolCanisterV1 {
569 pub pool: String,
570 pub canister_id: String,
571 pub role: Option<String>,
572 pub control_class: CanisterControlClassV1,
573}
574
575#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
579pub struct LocalDeploymentConfigV1 {
580 pub config_path: Option<String>,
581 pub raw_config_sha256: Option<String>,
582 pub canonical_embedded_config_sha256: Option<String>,
583}
584
585#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
589pub struct ObservedArtifactV1 {
590 pub role: String,
591 pub artifact_path: String,
592 pub file_sha256: Option<String>,
593 pub file_sha256_source: Option<ArtifactDigestSourceV1>,
594 pub payload_sha256: Option<String>,
595 pub payload_size_bytes: Option<u64>,
596 pub source: ArtifactSourceV1,
597}
598
599#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
603pub struct VerifierReadinessExpectationV1 {
604 pub required: bool,
605 pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
606}
607
608#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
612pub struct VerifierReadinessObservationV1 {
613 pub status: ObservationStatusV1,
614 pub role_epochs: Vec<RoleEpochObservationV1>,
615}
616
617#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
621pub struct RoleEpochExpectationV1 {
622 pub role: String,
623 pub minimum_epoch: u64,
624}
625
626#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
630pub struct RoleEpochObservationV1 {
631 pub role: String,
632 pub observed_epoch: Option<u64>,
633 pub status: ObservationStatusV1,
634}
635
636#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
640pub struct DeploymentAssumptionV1 {
641 pub key: String,
642 pub description: String,
643}
644
645#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
649pub struct DeploymentObservationGapV1 {
650 pub key: String,
651 pub description: String,
652}
653
654#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
658pub struct PhaseReceiptV1 {
659 pub phase: String,
660 pub started_at: String,
661 pub finished_at: Option<String>,
662 pub attempted_action: String,
663 pub verified_postcondition: VerifiedPostconditionV1,
664}
665
666#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
670pub struct VerifiedPostconditionV1 {
671 pub status: ObservationStatusV1,
672 pub evidence: Vec<String>,
673}
674
675#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
679pub enum DeploymentExecutionStatusV1 {
680 NotStarted,
681 InProgress,
682 FailedBeforeMutation,
683 PartiallyApplied,
684 FailedAfterMutation,
685 Complete,
686}
687
688#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
692pub enum DeploymentCommandResultV1 {
693 NotFinished,
694 Succeeded,
695 Failed { code: String, message: String },
696}
697
698#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
702pub struct RolePhaseReceiptV1 {
703 pub role: String,
704 pub phase: String,
705 pub result: RolePhaseResultV1,
706 pub previous_module_hash: Option<String>,
707 pub target_module_hash: Option<String>,
708 pub observed_module_hash_after: Option<String>,
709 pub artifact_digest: Option<String>,
710 pub canonical_embedded_config_sha256: Option<String>,
711 pub error: Option<String>,
712}
713
714#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
718pub enum RolePhaseResultV1 {
719 Applied,
720 Failed,
721 Skipped,
722 NotAttempted,
723 VerifiedAlreadyApplied,
724}
725
726#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
730pub struct DiffItemV1 {
731 pub category: String,
732 pub subject: String,
733 pub expected: Option<String>,
734 pub observed: Option<String>,
735 pub severity: SafetySeverityV1,
736}
737
738#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
742pub struct ResumeSafetyV1 {
743 pub status: SafetyStatusV1,
744 pub reasons: Vec<String>,
745}
746
747#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
751pub struct SafetyFindingV1 {
752 pub code: String,
753 pub message: String,
754 pub severity: SafetySeverityV1,
755 pub subject: Option<String>,
756}
757
758#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
762pub enum SafetyStatusV1 {
763 NotEvaluated,
764 Safe,
765 Warning,
766 Blocked,
767}
768
769#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
773pub enum SafetySeverityV1 {
774 Info,
775 Warning,
776 HardFailure,
777}
778
779#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
783pub enum ObservationStatusV1 {
784 NotObserved,
785 Observed,
786 Missing,
787 Inconclusive,
788}