diff options
author | Alex Auvolat <alex@adnab.me> | 2022-09-08 15:49:17 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-09-08 15:49:17 +0200 |
commit | d9d199a6c9c0ae2a6ee2b04103c78ef1eb311956 (patch) | |
tree | 53429d4faa2e696dd798515e2db493bc78ba5e48 /src/model/prev/v051/bucket_table.rs | |
parent | d23b3a14fc28de164080e762f0e97e6cbc868940 (diff) | |
parent | 03c40a0b24dd5bd2a51d3cd3df0ca1a42fb2d328 (diff) | |
download | garage-d9d199a6c9c0ae2a6ee2b04103c78ef1eb311956.tar.gz garage-d9d199a6c9c0ae2a6ee2b04103c78ef1eb311956.zip |
Merge branch 'main' into lx-perf-improvements
Diffstat (limited to 'src/model/prev/v051/bucket_table.rs')
-rw-r--r-- | src/model/prev/v051/bucket_table.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/model/prev/v051/bucket_table.rs b/src/model/prev/v051/bucket_table.rs new file mode 100644 index 00000000..0c52b6ea --- /dev/null +++ b/src/model/prev/v051/bucket_table.rs @@ -0,0 +1,63 @@ +use serde::{Deserialize, Serialize}; + +use garage_table::crdt::Crdt; +use garage_table::*; + +use super::key_table::PermissionSet; + +/// A bucket is a collection of objects +/// +/// Its parameters are not directly accessible as: +/// - It must be possible to merge paramaters, hence the use of a LWW CRDT. +/// - A bucket has 2 states, Present or Deleted and parameters make sense only if present. +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct Bucket { + /// Name of the bucket + pub name: String, + /// State, and configuration if not deleted, of the bucket + pub state: crdt::Lww<BucketState>, +} + +/// State of a bucket +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub enum BucketState { + /// The bucket is deleted + Deleted, + /// The bucket exists + Present(BucketParams), +} + +impl Crdt for BucketState { + fn merge(&mut self, o: &Self) { + match o { + BucketState::Deleted => *self = BucketState::Deleted, + BucketState::Present(other_params) => { + if let BucketState::Present(params) = self { + params.merge(other_params); + } + } + } + } +} + +/// Configuration for a bucket +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct BucketParams { + /// Map of key with access to the bucket, and what kind of access they give + pub authorized_keys: crdt::LwwMap<String, PermissionSet>, + /// Is the bucket served as http + pub website: crdt::Lww<bool>, +} + +impl Crdt for BucketParams { + fn merge(&mut self, o: &Self) { + self.authorized_keys.merge(&o.authorized_keys); + self.website.merge(&o.website); + } +} + +impl Crdt for Bucket { + fn merge(&mut self, other: &Self) { + self.state.merge(&other.state); + } +} |