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