use super::*;
#[must_use]
pub fn artifact_gate_phase_receipt(
check: &DeploymentCheckV1,
started_at: impl Into<String>,
finished_at: Option<String>,
) -> PhaseReceiptV1 {
let missing = check
.report
.hard_failures
.iter()
.filter(|finding| finding.code == "artifact_missing")
.collect::<Vec<_>>();
let mut evidence = check
.inventory
.observed_artifacts
.iter()
.filter_map(|artifact| {
artifact
.file_sha256
.as_ref()
.map(|hash| format!("artifact:{}:sha256:{hash}", artifact.role))
})
.collect::<Vec<_>>();
evidence.extend(
missing
.iter()
.filter_map(|finding| finding.subject.as_ref())
.map(|role| format!("artifact:{role}:missing")),
);
let status = if missing.is_empty() {
ObservationStatusV1::Observed
} else {
ObservationStatusV1::Missing
};
phase_receipt(
"materialize_artifacts",
started_at,
finished_at,
"verify configured role artifacts are materialized",
status,
evidence,
)
}
#[must_use]
pub fn phase_receipt(
phase: impl Into<String>,
started_at: impl Into<String>,
finished_at: Option<String>,
attempted_action: impl Into<String>,
status: ObservationStatusV1,
evidence: Vec<String>,
) -> PhaseReceiptV1 {
PhaseReceiptV1 {
phase: phase.into(),
started_at: started_at.into(),
finished_at,
attempted_action: attempted_action.into(),
verified_postcondition: VerifiedPostconditionV1 { status, evidence },
}
}
#[must_use]
pub fn deployment_receipt_from_check(
check: &DeploymentCheckV1,
operation_id: impl Into<String>,
started_at: impl Into<String>,
finished_at: Option<String>,
phase_receipts: Vec<PhaseReceiptV1>,
command_result: DeploymentCommandResultV1,
) -> DeploymentReceiptV1 {
DeploymentReceiptV1 {
schema_version: DEPLOYMENT_TRUTH_SCHEMA_VERSION,
operation_id: operation_id.into(),
plan_id: check.plan.plan_id.clone(),
started_at: started_at.into(),
finished_at,
operator_principal: None,
root_principal: check
.inventory
.observed_identity
.as_ref()
.and_then(|identity| identity.root_principal.clone())
.or_else(|| check.plan.deployment_identity.root_principal.clone()),
previous_observed_deployment_epoch: None,
phase_receipts,
final_inventory_id: Some(check.inventory.inventory_id.clone()),
command_result,
}
}