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/key_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/key_table.rs')
-rw-r--r-- | src/model/prev/v051/key_table.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/model/prev/v051/key_table.rs b/src/model/prev/v051/key_table.rs new file mode 100644 index 00000000..fee24741 --- /dev/null +++ b/src/model/prev/v051/key_table.rs @@ -0,0 +1,50 @@ +use serde::{Deserialize, Serialize}; + +use garage_table::crdt::*; +use garage_table::*; + +/// An api key +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +pub struct Key { + /// The id of the key (immutable), used as partition key + pub key_id: String, + + /// The secret_key associated + pub secret_key: String, + + /// Name for the key + pub name: crdt::Lww<String>, + + /// Is the key deleted + pub deleted: crdt::Bool, + + /// Buckets in which the key is authorized. Empty if `Key` is deleted + // CRDT interaction: deleted implies authorized_buckets is empty + pub authorized_buckets: crdt::LwwMap<String, PermissionSet>, +} + +/// Permission given to a key in a bucket +#[derive(PartialOrd, Ord, PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] +pub struct PermissionSet { + /// The key can be used to read the bucket + pub allow_read: bool, + /// The key can be used to write in the bucket + pub allow_write: bool, +} + +impl AutoCrdt for PermissionSet { + const WARN_IF_DIFFERENT: bool = true; +} + +impl Crdt for Key { + fn merge(&mut self, other: &Self) { + self.name.merge(&other.name); + self.deleted.merge(&other.deleted); + + if self.deleted.get() { + self.authorized_buckets.clear(); + } else { + self.authorized_buckets.merge(&other.authorized_buckets); + } + } +} |