ic_backup/policy/ic_snapshot_upload/
mod.rs1#[cfg(test)]
4mod tests;
5
6use crate::model::{
7 attempt_journal::AttemptJournalRecord,
8 ic_mutation::IcMutationAcknowledgement,
9 ic_snapshot_upload::{
10 IcSnapshotUploadAttempt, IcSnapshotUploadAttemptError, IcSnapshotUploadError,
11 IcSnapshotUploadReply,
12 },
13};
14use thiserror::Error;
15
16#[derive(Debug)]
18pub struct IcSnapshotUploadAcknowledgementView<'request, 'source> {
19 acknowledgement: &'request IcMutationAcknowledgement,
20 reply: IcSnapshotUploadReply<'request, 'source>,
21}
22impl<'request, 'source> IcSnapshotUploadAcknowledgementView<'request, 'source> {
23 #[must_use]
25 pub const fn acknowledgement(&self) -> &'request IcMutationAcknowledgement {
26 self.acknowledgement
27 }
28 #[must_use]
30 pub const fn reply(&self) -> &IcSnapshotUploadReply<'request, 'source> {
31 &self.reply
32 }
33}
34
35pub fn validate_acknowledgement<'request, 'source>(
46 request: &IcSnapshotUploadAttempt<'request, 'source>,
47 journal: &AttemptJournalRecord,
48 acknowledgement: &'request IcMutationAcknowledgement,
49) -> Result<IcSnapshotUploadAcknowledgementView<'request, 'source>, IcSnapshotUploadAssociationError>
50{
51 request.validate_journal(journal)?;
52 let input = acknowledgement.input();
53 if input.authority != request.authority().digest() {
54 return Err(IcSnapshotUploadAssociationError::AuthorityMismatch);
55 }
56 if input.mutation_attempt != request.mutation_attempt() {
57 return Err(IcSnapshotUploadAssociationError::AttemptMismatch);
58 }
59 if &input.context != request.plan().context() {
60 return Err(IcSnapshotUploadAssociationError::ContextMismatch);
61 }
62 if input.target != request.payload().target() {
63 return Err(IcSnapshotUploadAssociationError::TargetMismatch);
64 }
65 let reply = IcSnapshotUploadReply::decode(request.payload(), &input.reply)?;
66 Ok(IcSnapshotUploadAcknowledgementView {
67 acknowledgement,
68 reply,
69 })
70}
71
72#[derive(Debug, Error)]
74pub enum IcSnapshotUploadAssociationError {
75 #[error(transparent)]
77 Reservation(#[from] IcSnapshotUploadAttemptError),
78 #[error("snapshot upload acknowledgement authority mismatch")]
80 AuthorityMismatch,
81 #[error("snapshot upload acknowledgement attempt mismatch")]
83 AttemptMismatch,
84 #[error("snapshot upload acknowledgement context mismatch")]
86 ContextMismatch,
87 #[error("snapshot upload acknowledgement target mismatch")]
89 TargetMismatch,
90 #[error(transparent)]
92 Reply(#[from] IcSnapshotUploadError),
93}