diff options
author | Alex Auvolat <alex@adnab.me> | 2022-09-08 15:50:56 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-09-08 15:50:56 +0200 |
commit | 7f54706b95beb033820924e77e18f21f241d223e (patch) | |
tree | 26fc26ebb80e15a1ca64edd03efc9fac758274d0 /src/model/prev/v051/key_table.rs | |
parent | 907054775dc71a10a92ab96112889db9113130ab (diff) | |
parent | d9d199a6c9c0ae2a6ee2b04103c78ef1eb311956 (diff) | |
download | garage-7f54706b95beb033820924e77e18f21f241d223e.tar.gz garage-7f54706b95beb033820924e77e18f21f241d223e.zip |
Merge branch 'lx-perf-improvements' into netapp-stream-body
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); + } + } +} |