Skip to main content

canic_host/deployment_truth/model/authority/
mod.rs

1use super::{
2    CanisterControlClassV1, DeploymentCommandResultV1, DeploymentExecutionStatusV1,
3    DeploymentObservationGapV1, RolePhaseResultV1, SafetyFindingV1, SafetyStatusV1,
4};
5use serde::{Deserialize, Serialize};
6
7///
8/// AuthorityReceiptV1
9///
10#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
11pub struct AuthorityReceiptV1 {
12    pub schema_version: u32,
13    pub operation_id: String,
14    pub check_id: Option<String>,
15    pub reconciliation_plan_id: String,
16    pub authority_report_id: String,
17    pub inventory_id: String,
18    pub authority_profile_hash: Option<String>,
19    pub operation_status: DeploymentExecutionStatusV1,
20    pub started_at: String,
21    pub finished_at: Option<String>,
22    pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
23    pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
24    pub hard_failures: Vec<SafetyFindingV1>,
25    pub unresolved_observation_gaps: Vec<DeploymentObservationGapV1>,
26    pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
27    pub command_result: DeploymentCommandResultV1,
28}
29
30///
31/// AuthorityDryRunEvidenceV1
32///
33#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
34pub struct AuthorityDryRunEvidenceV1 {
35    pub schema_version: u32,
36    pub evidence_id: String,
37    pub check_id: String,
38    pub generated_at: String,
39    pub reconciliation_plan: AuthorityReconciliationPlanV1,
40    pub authority_report: AuthorityReportV1,
41    pub authority_receipt: AuthorityReceiptV1,
42}
43
44///
45/// AuthorityAttemptedActionV1
46///
47#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
48pub struct AuthorityAttemptedActionV1 {
49    pub subject: String,
50    pub canister_id: Option<String>,
51    pub role: Option<String>,
52    pub action: AuthorityActionV1,
53    pub result: RolePhaseResultV1,
54    pub error: Option<String>,
55}
56
57///
58/// AuthorityControllerObservationV1
59///
60#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
61pub struct AuthorityControllerObservationV1 {
62    pub subject: String,
63    pub canister_id: Option<String>,
64    pub role: Option<String>,
65    pub state: AuthorityReconciliationStateV1,
66    pub action: AuthorityActionV1,
67    pub observed_controllers: Vec<String>,
68    pub desired_controllers: Vec<String>,
69    pub controller_delta: AuthorityControllerDeltaV1,
70}
71
72///
73/// AuthorityReconciliationPlanV1
74///
75#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
76pub struct AuthorityReconciliationPlanV1 {
77    pub schema_version: u32,
78    pub plan_id: String,
79    pub inventory_id: String,
80    pub authority_profile_hash: Option<String>,
81    pub canister_actions: Vec<CanisterAuthorityActionV1>,
82    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
83    pub hard_failures: Vec<SafetyFindingV1>,
84    pub external_actions_required: Vec<AuthorityExternalActionV1>,
85}
86
87///
88/// AuthorityAutomaticActionV1
89///
90#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
91pub struct AuthorityAutomaticActionV1 {
92    pub subject: String,
93    pub canister_id: String,
94    pub role: Option<String>,
95    pub action: AuthorityActionV1,
96    pub observed_controllers: Vec<String>,
97    pub desired_controllers: Vec<String>,
98    pub controller_delta: AuthorityControllerDeltaV1,
99    pub reason: String,
100}
101
102///
103/// AuthorityControllerDeltaV1
104///
105#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
106pub struct AuthorityControllerDeltaV1 {
107    pub add_controllers: Vec<String>,
108    pub remove_controllers: Vec<String>,
109}
110
111///
112/// AuthorityReportV1
113///
114#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
115pub struct AuthorityReportV1 {
116    pub schema_version: u32,
117    pub report_id: String,
118    pub check_id: Option<String>,
119    pub reconciliation_plan_id: String,
120    pub inventory_id: String,
121    pub authority_profile_hash: Option<String>,
122    pub status: SafetyStatusV1,
123    pub summary: String,
124    pub counts: AuthorityReportCountsV1,
125    pub apply_readiness: AuthorityApplyReadinessV1,
126    pub action_counts: Vec<AuthorityActionCountV1>,
127    pub control_class_counts: Vec<AuthorityControlClassCountV1>,
128    pub observation_gaps: Vec<DeploymentObservationGapV1>,
129    pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
130    pub hard_failures: Vec<SafetyFindingV1>,
131    pub external_actions_required: Vec<AuthorityExternalActionV1>,
132    pub next_actions: Vec<String>,
133}
134
135///
136/// AuthorityApplyReadinessV1
137///
138#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
139pub struct AuthorityApplyReadinessV1 {
140    pub can_apply_automatically: bool,
141    pub automatic_action_count: usize,
142    pub blockers: Vec<AuthorityApplyBlockerV1>,
143}
144
145///
146/// AuthorityApplyBlockerV1
147///
148#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
149pub enum AuthorityApplyBlockerV1 {
150    UnsafeBlocked,
151    HardFailures,
152    ObservationGaps,
153    ExternalActions,
154}
155
156///
157/// AuthorityActionCountV1
158///
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
160pub struct AuthorityActionCountV1 {
161    pub action: AuthorityActionV1,
162    pub count: usize,
163}
164
165///
166/// AuthorityControlClassCountV1
167///
168#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
169pub struct AuthorityControlClassCountV1 {
170    pub control_class: CanisterControlClassV1,
171    pub count: usize,
172}
173
174///
175/// AuthorityReportCountsV1
176///
177#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
178pub struct AuthorityReportCountsV1 {
179    pub already_correct: usize,
180    pub can_apply_automatically: usize,
181    pub requires_external_action: usize,
182    pub unsafe_blocked: usize,
183    pub unknown: usize,
184    pub hard_failures: usize,
185}
186
187///
188/// CanisterAuthorityActionV1
189///
190#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
191pub struct CanisterAuthorityActionV1 {
192    pub canister_id: Option<String>,
193    pub role: Option<String>,
194    pub control_classification: CanisterControlClassV1,
195    pub observed_controllers: Vec<String>,
196    pub desired_controllers: Vec<String>,
197    pub controller_delta: AuthorityControllerDeltaV1,
198    pub action: AuthorityActionV1,
199    pub state: AuthorityReconciliationStateV1,
200    pub can_apply: bool,
201    pub reason: String,
202}
203
204///
205/// AuthorityExternalActionV1
206///
207#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
208pub struct AuthorityExternalActionV1 {
209    pub subject: String,
210    pub canister_id: Option<String>,
211    pub role: Option<String>,
212    pub control_classification: CanisterControlClassV1,
213    pub state: AuthorityReconciliationStateV1,
214    pub action: AuthorityActionV1,
215    pub observed_controllers: Vec<String>,
216    pub desired_controllers: Vec<String>,
217    pub controller_delta: AuthorityControllerDeltaV1,
218    pub reason: String,
219}
220
221///
222/// AuthorityActionV1
223///
224#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
225pub enum AuthorityActionV1 {
226    None,
227    AddControllers,
228    RemoveControllers,
229    ReplaceControllerSet,
230    RequiresExternalController,
231    RequiresDestructiveImportConfirmation,
232    ObserveOnly,
233    AdoptPlanAvailable,
234    BlockedByPolicy,
235    UnknownObservation,
236}
237
238///
239/// AuthorityReconciliationStateV1
240///
241#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
242pub enum AuthorityReconciliationStateV1 {
243    AlreadyCorrect,
244    CanApplyAutomatically,
245    RequiresExternalAction,
246    UnsafeBlocked,
247    Unknown,
248}