ic_backup/ops/persistence/execution_progress/
mod.rs1use super::{
4 AttemptJournalError, BackupLayoutGuard, OperationPlanPersistenceError, read_operation_plan,
5};
6use crate::{
7 model::{
8 artifacts::ArtifactChecksumRecord, attempt_journal::AttemptJournalRecord,
9 operation_plan::OperationPlanError,
10 },
11 policy::execution_progress::{
12 ExecutionProgressError, ExecutionProgressRequest, ExecutionProgressView, progress,
13 },
14};
15use thiserror::Error;
16
17pub fn read_execution_progress(
27 layout: &BackupLayoutGuard,
28 expected_plan: &ArtifactChecksumRecord,
29) -> Result<ExecutionProgressView, ExecutionProgressPersistenceError> {
30 read_with_current(layout, expected_plan, None)
31}
32
33pub(super) fn read_with_current(
34 layout: &BackupLayoutGuard,
35 expected_plan: &ArtifactChecksumRecord,
36 current: Option<&AttemptJournalRecord>,
37) -> Result<ExecutionProgressView, ExecutionProgressPersistenceError> {
38 let plan = read_operation_plan(layout, expected_plan)?;
39 let authorities = plan.attempt_authorities()?;
40 let journals = super::attempt_journal::read_original_journals(layout, &authorities, current)?;
41 let references: Vec<_> = journals.iter().collect();
42 Ok(progress(&ExecutionProgressRequest {
43 plan: &plan,
44 journals: &references,
45 })?)
46}
47
48#[derive(Debug, Error)]
50pub enum ExecutionProgressPersistenceError {
51 #[error(transparent)]
53 Plan(#[from] OperationPlanPersistenceError),
54 #[error(transparent)]
56 Authority(#[from] OperationPlanError),
57 #[error(transparent)]
59 Journal(#[from] AttemptJournalError),
60 #[error(transparent)]
62 Policy(#[from] ExecutionProgressError),
63 #[error("operation {0} has unapplied prerequisites")]
65 DependenciesUnapplied(u64),
66}
67
68#[cfg(all(test, unix))]
69mod tests;