use super::{DownloadIntegrityError, DownloadJournalGuard, DownloadManifestError};
use crate::{
model::{operation_plan::OperationPlanRecord, restore_safety::RestoreSafetyRequirementRecord},
ops::persistence::{
BackupLayoutGuard, RestoreSafetyPersistenceError, read_restore_safety_requirement,
},
policy::local_restore_source::{
LocalRestoreSourcePolicyError, LocalRestoreSourceView, validate,
},
};
use thiserror::Error;
impl DownloadJournalGuard<'_> {
pub fn verify_local_restore_source<'a>(
&'a self,
restore_layout: &'a BackupLayoutGuard,
restore: &'a OperationPlanRecord,
source: &'a OperationPlanRecord,
requirement: &'a RestoreSafetyRequirementRecord,
) -> Result<LocalRestoreSourceView<'a>, LocalRestoreSourceError> {
self.admit_local_restore_source(restore_layout, restore, source, requirement)?;
self.verify_durable_artifacts(source)?;
self.admit_local_restore_source(restore_layout, restore, source, requirement)
}
pub(super) fn admit_local_restore_source<'a>(
&'a self,
restore_layout: &'a BackupLayoutGuard,
restore: &'a OperationPlanRecord,
source: &'a OperationPlanRecord,
requirement: &'a RestoreSafetyRequirementRecord,
) -> Result<LocalRestoreSourceView<'a>, LocalRestoreSourceError> {
read_restore_safety_requirement(
restore_layout,
self.layout,
restore,
source,
&requirement.digest(),
)?;
self.read_download_manifest(source, requirement.source_artifacts())?;
restore_layout
.check_root()
.map_err(DownloadIntegrityError::from)?;
Ok(validate(
restore,
source,
requirement,
self.record().map_err(DownloadIntegrityError::from)?,
)?)
}
}
#[derive(Debug, Error)]
pub enum LocalRestoreSourceError {
#[error(transparent)]
Requirement(#[from] RestoreSafetyPersistenceError),
#[error(transparent)]
Manifest(#[from] DownloadManifestError),
#[error(transparent)]
Policy(#[from] LocalRestoreSourcePolicyError),
#[error(transparent)]
Integrity(#[from] DownloadIntegrityError),
}
#[cfg(all(test, unix))]
mod tests;