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