ic_backup/ops/persistence/inventory/
mod.rs1use super::json::check_json_size;
4use super::{
5 BackupLayoutGuard, JournalLock, JournalLockError, PersistenceError, create_json_durable,
6 read_json,
7};
8use crate::model::{
9 artifacts::ArtifactChecksumRecord,
10 inventory::{InventoryRecord, MAX_INVENTORY_BYTES},
11};
12use thiserror::Error;
13
14pub fn create_inventory(
19 layout: &BackupLayoutGuard,
20 record: &InventoryRecord,
21) -> Result<(), InventoryError> {
22 layout.check_root()?;
23 let path = layout.root().join("inventory.json");
24 let _lock = JournalLock::acquire(&path)?;
25 check_json_size(record, MAX_INVENTORY_BYTES)?;
26 create_json_durable(&path, record)?;
27 Ok(())
28}
29
30pub fn read_inventory(
38 layout: &BackupLayoutGuard,
39 expected: &ArtifactChecksumRecord,
40) -> Result<InventoryRecord, InventoryError> {
41 layout.check_root()?;
42 let path = layout.root().join("inventory.json");
43 let _lock = JournalLock::acquire(&path)?;
44 let record: InventoryRecord = read_json(&path, MAX_INVENTORY_BYTES)?;
45 check_json_size(&record, MAX_INVENTORY_BYTES)?;
46 if &record.digest() != expected {
47 return Err(InventoryError::DigestMismatch);
48 }
49 Ok(record)
50}
51
52#[derive(Debug, Error)]
54pub enum InventoryError {
55 #[error("inventory digest mismatch")]
57 DigestMismatch,
58 #[error(transparent)]
60 Lock(#[from] JournalLockError),
61 #[error(transparent)]
63 Persistence(#[from] PersistenceError),
64}
65
66#[cfg(all(test, unix))]
67mod tests;