ic_backup/ops/persistence/download_journal/local_restore_source/
mod.rs1use super::{DownloadIntegrityError, DownloadJournalGuard, DownloadManifestError};
4use crate::{
5 model::{operation_plan::OperationPlanRecord, restore_safety::RestoreSafetyRequirementRecord},
6 ops::persistence::{
7 BackupLayoutGuard, RestoreSafetyPersistenceError, read_restore_safety_requirement,
8 },
9 policy::local_restore_source::{
10 LocalRestoreSourcePolicyError, LocalRestoreSourceView, validate,
11 },
12};
13use thiserror::Error;
14
15impl DownloadJournalGuard<'_> {
16 pub fn verify_local_restore_source<'a>(
31 &'a self,
32 restore_layout: &'a BackupLayoutGuard,
33 restore: &'a OperationPlanRecord,
34 source: &'a OperationPlanRecord,
35 requirement: &'a RestoreSafetyRequirementRecord,
36 ) -> Result<LocalRestoreSourceView<'a>, LocalRestoreSourceError> {
37 self.admit_local_restore_source(restore_layout, restore, source, requirement)?;
38 self.verify_durable_artifacts(source)?;
39 self.admit_local_restore_source(restore_layout, restore, source, requirement)
40 }
41
42 pub(super) fn admit_local_restore_source<'a>(
43 &'a self,
44 restore_layout: &'a BackupLayoutGuard,
45 restore: &'a OperationPlanRecord,
46 source: &'a OperationPlanRecord,
47 requirement: &'a RestoreSafetyRequirementRecord,
48 ) -> Result<LocalRestoreSourceView<'a>, LocalRestoreSourceError> {
49 read_restore_safety_requirement(
50 restore_layout,
51 self.layout,
52 restore,
53 source,
54 &requirement.digest(),
55 )?;
56 self.read_download_manifest(source, requirement.source_artifacts())?;
57 restore_layout
58 .check_root()
59 .map_err(DownloadIntegrityError::from)?;
60 Ok(validate(
61 restore,
62 source,
63 requirement,
64 self.record().map_err(DownloadIntegrityError::from)?,
65 )?)
66 }
67}
68
69#[derive(Debug, Error)]
71pub enum LocalRestoreSourceError {
72 #[error(transparent)]
74 Requirement(#[from] RestoreSafetyPersistenceError),
75 #[error(transparent)]
77 Manifest(#[from] DownloadManifestError),
78 #[error(transparent)]
80 Policy(#[from] LocalRestoreSourcePolicyError),
81 #[error(transparent)]
83 Integrity(#[from] DownloadIntegrityError),
84}
85
86#[cfg(all(test, unix))]
87mod tests;