aboutsummaryrefslogtreecommitdiff
path: root/src/model/helper/bucket.rs
diff options
context:
space:
mode:
authorAlex <alex@adnab.me>2024-03-19 16:17:16 +0000
committerAlex <alex@adnab.me>2024-03-19 16:17:16 +0000
commit26310f3242319c9ad093f5121cff0fe0c0108542 (patch)
tree4821890dc5f4d5aa98d25242d04abd494a5d9ab4 /src/model/helper/bucket.rs
parent693b89b94b05608c241551447ba0a83aac68c705 (diff)
parent783b586de93ffa210d6c34fd7cc266220a57a4d2 (diff)
downloadgarage-26310f3242319c9ad093f5121cff0fe0c0108542.tar.gz
garage-26310f3242319c9ad093f5121cff0fe0c0108542.zip
Merge pull request 'CLI: allow manipulating buckets by prefixes of their full IDs' (#783) from bucket-id-prefix into main
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/783
Diffstat (limited to 'src/model/helper/bucket.rs')
-rw-r--r--src/model/helper/bucket.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/model/helper/bucket.rs b/src/model/helper/bucket.rs
index f4e669c3..4ae9122f 100644
--- a/src/model/helper/bucket.rs
+++ b/src/model/helper/bucket.rs
@@ -67,6 +67,49 @@ impl<'a> BucketHelper<'a> {
}
}
+ /// Find a bucket by its global alias or a prefix of its uuid
+ pub async fn admin_get_existing_matching_bucket(
+ &self,
+ pattern: &String,
+ ) -> Result<Uuid, Error> {
+ if let Some(uuid) = self.resolve_global_bucket_name(pattern).await? {
+ return Ok(uuid);
+ } else if pattern.len() >= 2 {
+ let hexdec = pattern
+ .get(..pattern.len() & !1)
+ .and_then(|x| hex::decode(x).ok());
+ if let Some(hex) = hexdec {
+ let mut start = [0u8; 32];
+ start
+ .as_mut_slice()
+ .get_mut(..hex.len())
+ .ok_or_bad_request("invalid length")?
+ .copy_from_slice(&hex);
+ let mut candidates = self
+ .0
+ .bucket_table
+ .get_range(
+ &EmptyKey,
+ Some(start.into()),
+ Some(DeletedFilter::NotDeleted),
+ 10,
+ EnumerationOrder::Forward,
+ )
+ .await?
+ .into_iter()
+ .collect::<Vec<_>>();
+ candidates.retain(|x| hex::encode(x.id).starts_with(pattern));
+ if candidates.len() == 1 {
+ return Ok(candidates.into_iter().next().unwrap().id);
+ }
+ }
+ }
+ Err(Error::BadRequest(format!(
+ "Bucket not found / several matching buckets: {}",
+ pattern
+ )))
+ }
+
/// Returns a Bucket if it is present in bucket table,
/// even if it is in deleted state. Querying a non-existing
/// bucket ID returns an internal error.