use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentPlanV1 {
pub schema_version: u32,
pub plan_id: String,
pub deployment_identity: DeploymentIdentityV1,
pub trust_domain: TrustDomainV1,
pub fleet_template: String,
pub runtime_variant: String,
pub authority_profile: AuthorityProfileV1,
pub role_artifacts: Vec<RoleArtifactV1>,
pub expected_canisters: Vec<ExpectedCanisterV1>,
pub expected_pool: Vec<ExpectedPoolCanisterV1>,
pub expected_verifier_readiness: VerifierReadinessExpectationV1,
pub unresolved_assumptions: Vec<DeploymentAssumptionV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentInventoryV1 {
pub schema_version: u32,
pub inventory_id: String,
pub observed_at: String,
pub observed_identity: Option<DeploymentIdentityV1>,
pub local_config: LocalDeploymentConfigV1,
pub observed_canisters: Vec<ObservedCanisterV1>,
pub observed_pool: Vec<ObservedPoolCanisterV1>,
pub observed_artifacts: Vec<ObservedArtifactV1>,
pub observed_verifier_readiness: VerifierReadinessObservationV1,
pub unresolved_observations: Vec<DeploymentObservationGapV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentReceiptV1 {
pub schema_version: u32,
pub operation_id: String,
pub plan_id: String,
pub operation_status: DeploymentExecutionStatusV1,
pub started_at: String,
pub finished_at: Option<String>,
pub operator_principal: Option<String>,
pub root_principal: Option<String>,
pub previous_observed_deployment_epoch: Option<u64>,
pub phase_receipts: Vec<PhaseReceiptV1>,
pub role_phase_receipts: Vec<RolePhaseReceiptV1>,
pub final_inventory_id: Option<String>,
pub command_result: DeploymentCommandResultV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityReceiptV1 {
pub schema_version: u32,
pub operation_id: String,
pub reconciliation_plan_id: String,
pub operation_status: DeploymentExecutionStatusV1,
pub started_at: String,
pub finished_at: Option<String>,
pub attempted_actions: Vec<AuthorityAttemptedActionV1>,
pub verified_controller_observations: Vec<AuthorityControllerObservationV1>,
pub hard_failures: Vec<SafetyFindingV1>,
pub unresolved_external_actions: Vec<AuthorityExternalActionV1>,
pub command_result: DeploymentCommandResultV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityDryRunEvidenceV1 {
pub schema_version: u32,
pub evidence_id: String,
pub check_id: String,
pub generated_at: String,
pub reconciliation_plan: AuthorityReconciliationPlanV1,
pub authority_report: AuthorityReportV1,
pub authority_receipt: AuthorityReceiptV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityAttemptedActionV1 {
pub subject: String,
pub canister_id: Option<String>,
pub role: Option<String>,
pub action: AuthorityActionV1,
pub result: RolePhaseResultV1,
pub error: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityControllerObservationV1 {
pub subject: String,
pub canister_id: Option<String>,
pub role: Option<String>,
pub state: AuthorityReconciliationStateV1,
pub action: AuthorityActionV1,
pub observed_controllers: Vec<String>,
pub desired_controllers: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct RoleArtifactManifestV1 {
pub schema_version: u32,
pub manifest_id: String,
pub network: String,
pub artifact_root: Option<String>,
pub role_artifacts: Vec<RoleArtifactV1>,
pub unresolved_artifacts: Vec<DeploymentObservationGapV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentDiffV1 {
pub schema_version: u32,
pub plan_identity: DeploymentIdentityV1,
pub observed_identity: Option<DeploymentIdentityV1>,
pub artifact_diff: Vec<DiffItemV1>,
pub controller_diff: Vec<DiffItemV1>,
pub pool_diff: Vec<DiffItemV1>,
pub embedded_config_diff: Vec<DiffItemV1>,
pub module_hash_diff: Vec<DiffItemV1>,
pub verifier_readiness_diff: Vec<DiffItemV1>,
pub resume_safety: ResumeSafetyV1,
pub hard_failures: Vec<SafetyFindingV1>,
pub warnings: Vec<SafetyFindingV1>,
pub resumable_phases: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct SafetyReportV1 {
pub schema_version: u32,
pub report_id: String,
pub diff_id: Option<String>,
pub status: SafetyStatusV1,
pub summary: String,
pub hard_failures: Vec<SafetyFindingV1>,
pub warnings: Vec<SafetyFindingV1>,
pub next_actions: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentCheckV1 {
pub schema_version: u32,
pub check_id: String,
pub plan: DeploymentPlanV1,
pub inventory: DeploymentInventoryV1,
pub diff: DeploymentDiffV1,
pub report: SafetyReportV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityReconciliationPlanV1 {
pub schema_version: u32,
pub plan_id: String,
pub inventory_id: String,
pub authority_profile_hash: Option<String>,
pub canister_actions: Vec<CanisterAuthorityActionV1>,
pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
pub hard_failures: Vec<SafetyFindingV1>,
pub external_actions_required: Vec<AuthorityExternalActionV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityAutomaticActionV1 {
pub subject: String,
pub canister_id: String,
pub role: Option<String>,
pub action: AuthorityActionV1,
pub observed_controllers: Vec<String>,
pub desired_controllers: Vec<String>,
pub reason: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityReportV1 {
pub schema_version: u32,
pub report_id: String,
pub reconciliation_plan_id: String,
pub status: SafetyStatusV1,
pub summary: String,
pub counts: AuthorityReportCountsV1,
pub action_counts: Vec<AuthorityActionCountV1>,
pub control_class_counts: Vec<AuthorityControlClassCountV1>,
pub observation_gaps: Vec<DeploymentObservationGapV1>,
pub automatic_actions: Vec<AuthorityAutomaticActionV1>,
pub hard_failures: Vec<SafetyFindingV1>,
pub external_actions_required: Vec<AuthorityExternalActionV1>,
pub next_actions: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityActionCountV1 {
pub action: AuthorityActionV1,
pub count: usize,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityControlClassCountV1 {
pub control_class: CanisterControlClassV1,
pub count: usize,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityReportCountsV1 {
pub already_correct: usize,
pub can_apply_automatically: usize,
pub requires_external_action: usize,
pub unsafe_blocked: usize,
pub unknown: usize,
pub hard_failures: usize,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CanisterAuthorityActionV1 {
pub canister_id: Option<String>,
pub role: Option<String>,
pub control_classification: CanisterControlClassV1,
pub observed_controllers: Vec<String>,
pub desired_controllers: Vec<String>,
pub action: AuthorityActionV1,
pub state: AuthorityReconciliationStateV1,
pub can_apply: bool,
pub reason: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityExternalActionV1 {
pub subject: String,
pub canister_id: Option<String>,
pub role: Option<String>,
pub control_classification: CanisterControlClassV1,
pub state: AuthorityReconciliationStateV1,
pub action: AuthorityActionV1,
pub observed_controllers: Vec<String>,
pub desired_controllers: Vec<String>,
pub reason: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum AuthorityActionV1 {
None,
AddControllers,
RemoveControllers,
ReplaceControllerSet,
RequiresExternalController,
RequiresDestructiveImportConfirmation,
ObserveOnly,
AdoptPlanAvailable,
BlockedByPolicy,
UnknownObservation,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum AuthorityReconciliationStateV1 {
AlreadyCorrect,
CanApplyAutomatically,
RequiresExternalAction,
UnsafeBlocked,
Unknown,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentIdentityV1 {
pub deployment_name: String,
pub network: String,
pub root_principal: Option<String>,
pub authority_profile_hash: Option<String>,
pub role_topology_hash: Option<String>,
pub deployment_manifest_digest: Option<String>,
pub canonical_runtime_config_digest: Option<String>,
pub role_embedded_config_set_digest: Option<String>,
pub artifact_set_digest: Option<String>,
pub pool_identity_set_digest: Option<String>,
pub canic_version: Option<String>,
pub ic_memory_version: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct TrustDomainV1 {
pub root_trust_anchor: Option<String>,
pub migration_from: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct AuthorityProfileV1 {
pub profile_id: String,
pub expected_controllers: Vec<String>,
pub staging_controllers: Vec<String>,
pub emergency_controllers: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct RoleArtifactV1 {
pub role: String,
pub source: ArtifactSourceV1,
pub build_profile: String,
pub wasm_path: Option<String>,
pub wasm_gz_path: Option<String>,
pub wasm_gz_size_bytes: Option<u64>,
pub wasm_sha256: Option<String>,
pub wasm_gz_sha256: Option<String>,
pub wasm_gz_sha256_source: Option<ArtifactDigestSourceV1>,
pub observed_wasm_gz_file_sha256: Option<String>,
pub observed_wasm_gz_file_sha256_source: Option<ArtifactDigestSourceV1>,
pub installed_module_hash: Option<String>,
pub candid_path: Option<String>,
pub candid_sha256: Option<String>,
pub raw_config_sha256: Option<String>,
pub canonical_embedded_config_sha256: Option<String>,
pub embedded_topology_sha256: Option<String>,
pub builder_version: Option<String>,
pub rust_toolchain: Option<String>,
pub package_version: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ArtifactDigestSourceV1 {
ReleaseSetManifest,
ObservedFileDigest,
InstalledModuleHash,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ArtifactSourceV1 {
LocalBuild,
ReleaseSet,
WasmStore,
External,
Unknown,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ExpectedCanisterV1 {
pub role: String,
pub canister_id: Option<String>,
pub control_class: CanisterControlClassV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ObservedCanisterV1 {
pub canister_id: String,
pub role: Option<String>,
pub control_class: CanisterControlClassV1,
pub controllers: Vec<String>,
pub module_hash: Option<String>,
pub status: Option<String>,
pub root_trust_anchor: Option<String>,
pub canonical_embedded_config_digest: Option<String>,
pub role_assignment_source: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum CanisterControlClassV1 {
DeploymentControlled,
CanicManagedPool,
ExternallyImported,
JointlyControlled,
UserControlled,
UnknownUnsafe,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ExpectedPoolCanisterV1 {
pub pool: String,
pub canister_id: Option<String>,
pub role: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ObservedPoolCanisterV1 {
pub pool: String,
pub canister_id: String,
pub role: Option<String>,
pub control_class: CanisterControlClassV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LocalDeploymentConfigV1 {
pub config_path: Option<String>,
pub raw_config_sha256: Option<String>,
pub canonical_embedded_config_sha256: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ObservedArtifactV1 {
pub role: String,
pub artifact_path: String,
pub file_sha256: Option<String>,
pub file_sha256_source: Option<ArtifactDigestSourceV1>,
pub payload_sha256: Option<String>,
pub payload_size_bytes: Option<u64>,
pub source: ArtifactSourceV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct VerifierReadinessExpectationV1 {
pub required: bool,
pub expected_role_epochs: Vec<RoleEpochExpectationV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct VerifierReadinessObservationV1 {
pub status: ObservationStatusV1,
pub role_epochs: Vec<RoleEpochObservationV1>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct RoleEpochExpectationV1 {
pub role: String,
pub minimum_epoch: u64,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct RoleEpochObservationV1 {
pub role: String,
pub observed_epoch: Option<u64>,
pub status: ObservationStatusV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentAssumptionV1 {
pub key: String,
pub description: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DeploymentObservationGapV1 {
pub key: String,
pub description: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct PhaseReceiptV1 {
pub phase: String,
pub started_at: String,
pub finished_at: Option<String>,
pub attempted_action: String,
pub verified_postcondition: VerifiedPostconditionV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct VerifiedPostconditionV1 {
pub status: ObservationStatusV1,
pub evidence: Vec<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum DeploymentExecutionStatusV1 {
NotStarted,
InProgress,
FailedBeforeMutation,
PartiallyApplied,
FailedAfterMutation,
Complete,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum DeploymentCommandResultV1 {
NotFinished,
Succeeded,
Failed { code: String, message: String },
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct RolePhaseReceiptV1 {
pub role: String,
pub phase: String,
pub result: RolePhaseResultV1,
pub previous_module_hash: Option<String>,
pub target_module_hash: Option<String>,
pub observed_module_hash_after: Option<String>,
pub artifact_digest: Option<String>,
pub canonical_embedded_config_sha256: Option<String>,
pub error: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum RolePhaseResultV1 {
Applied,
Failed,
Skipped,
NotAttempted,
VerifiedAlreadyApplied,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DiffItemV1 {
pub category: String,
pub subject: String,
pub expected: Option<String>,
pub observed: Option<String>,
pub severity: SafetySeverityV1,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ResumeSafetyV1 {
pub status: SafetyStatusV1,
pub reasons: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct SafetyFindingV1 {
pub code: String,
pub message: String,
pub severity: SafetySeverityV1,
pub subject: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum SafetyStatusV1 {
NotEvaluated,
Safe,
Warning,
Blocked,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum SafetySeverityV1 {
Info,
Warning,
HardFailure,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ObservationStatusV1 {
NotObserved,
Observed,
Missing,
Inconclusive,
}