Skip to main content

canic_backup/restore/plan/
mod.rs

1mod error;
2mod mapping;
3mod members;
4mod ordering;
5mod summary;
6mod types;
7
8pub use error::RestorePlanError;
9pub use types::*;
10
11use crate::manifest::FleetBackupManifest;
12use mapping::{validate_mapping, validate_mapping_sources};
13use members::resolve_members;
14use ordering::{order_members, restore_ordering_summary};
15use summary::{
16    restore_identity_summary, restore_operation_summary, restore_readiness_summary,
17    restore_snapshot_summary, restore_verification_summary,
18};
19
20///
21/// RestorePlanner
22///
23
24pub struct RestorePlanner;
25
26impl RestorePlanner {
27    /// Build a no-mutation restore plan from the manifest and optional target mapping.
28    pub fn plan(
29        manifest: &FleetBackupManifest,
30        mapping: Option<&RestoreMapping>,
31    ) -> Result<RestorePlan, RestorePlanError> {
32        manifest.validate()?;
33        if let Some(mapping) = mapping {
34            validate_mapping(mapping)?;
35            validate_mapping_sources(manifest, mapping)?;
36        }
37
38        let members = resolve_members(manifest, mapping)?;
39        let identity_summary = restore_identity_summary(&members, mapping.is_some());
40        let snapshot_summary = restore_snapshot_summary(&members);
41        let verification_summary = restore_verification_summary(manifest, &members);
42        let readiness_summary = restore_readiness_summary(&snapshot_summary, &verification_summary);
43        let members = order_members(members)?;
44        let ordering_summary = restore_ordering_summary(&members);
45        let operation_summary =
46            restore_operation_summary(manifest.fleet.members.len(), &verification_summary);
47
48        Ok(RestorePlan {
49            backup_id: manifest.backup_id.clone(),
50            source_environment: manifest.source.environment.clone(),
51            source_root_canister: manifest.source.root_canister.clone(),
52            topology_hash: manifest.fleet.topology_hash.clone(),
53            member_count: manifest.fleet.members.len(),
54            identity_summary,
55            snapshot_summary,
56            verification_summary,
57            readiness_summary,
58            operation_summary,
59            ordering_summary,
60            fleet_verification_checks: manifest.verification.fleet_checks.clone(),
61            members,
62        })
63    }
64}