diff options
author | Alex Auvolat <alex@adnab.me> | 2020-04-19 17:15:48 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2020-04-19 17:15:48 +0200 |
commit | a6129d8626f5b87462b70eadbce2db08c9761cfd (patch) | |
tree | 7e0e0d348bc8f8672db57680f8aeedf9c6c03523 /src/bucket_table.rs | |
parent | 302502f4c10b4c1cd03d3b098b3e55a3f70054f2 (diff) | |
download | garage-a6129d8626f5b87462b70eadbce2db08c9761cfd.tar.gz garage-a6129d8626f5b87462b70eadbce2db08c9761cfd.zip |
Begin implement bucket management & admin commands
Diffstat (limited to 'src/bucket_table.rs')
-rw-r--r-- | src/bucket_table.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/bucket_table.rs b/src/bucket_table.rs new file mode 100644 index 00000000..be7dd348 --- /dev/null +++ b/src/bucket_table.rs @@ -0,0 +1,79 @@ +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; + +use crate::table::*; + +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct Bucket { + // Primary key + pub name: String, + + // Timestamp and deletion + // Upon version increment, all info is replaced + pub timestamp: u64, + pub deleted: bool, + + // Authorized keys + pub authorized_keys: Vec<AllowedKey>, +} + +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct AllowedKey { + pub access_key_id: String, + pub timestamp: u64, + pub allowed_read: bool, + pub allowed_write: bool, +} + +impl Entry<EmptyKey, String> for Bucket { + fn partition_key(&self) -> &EmptyKey { + &EmptyKey + } + fn sort_key(&self) -> &String { + &self.name + } + + fn merge(&mut self, other: &Self) { + if other.timestamp < self.timestamp { + *self = other.clone(); + return; + } + if self.timestamp > other.timestamp { + return; + } + for ak in other.authorized_keys.iter() { + match self + .authorized_keys + .binary_search_by(|our_ak| our_ak.access_key_id.cmp(&ak.access_key_id)) + { + Ok(i) => { + let our_ak = &mut self.authorized_keys[i]; + if ak.timestamp > our_ak.timestamp { + our_ak.timestamp = ak.timestamp; + our_ak.allowed_read = ak.allowed_read; + our_ak.allowed_write = ak.allowed_write; + } + } + Err(i) => { + self.authorized_keys.insert(i, ak.clone()); + } + } + } + } +} + +pub struct BucketTable; + +#[async_trait] +impl TableSchema for BucketTable { + type P = EmptyKey; + type S = String; + type E = Bucket; + type Filter = (); + + async fn updated(&self, _old: Option<Self::E>, _new: Option<Self::E>) {} + + fn matches_filter(entry: &Self::E, _filter: &Self::Filter) -> bool { + !entry.deleted + } +} |