forked from Deuxfleurs/garage
Alex
5768bf3622
**Specification:** View spec at [this URL](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/k2v/doc/drafts/k2v-spec.md) - [x] Specify the structure of K2V triples - [x] Specify the DVVS format used for causality detection - [x] Specify the K2V index (just a counter of number of values per partition key) - [x] Specify single-item endpoints: ReadItem, InsertItem, DeleteItem - [x] Specify index endpoint: ReadIndex - [x] Specify multi-item endpoints: InsertBatch, ReadBatch, DeleteBatch - [x] Move to JSON objects instead of tuples - [x] Specify endpoints for polling for updates on single values (PollItem) **Implementation:** - [x] Table for K2V items, causal contexts - [x] Indexing mechanism and table for K2V index - [x] Make API handlers a bit more generic - [x] K2V API endpoint - [x] K2V API router - [x] ReadItem - [x] InsertItem - [x] DeleteItem - [x] PollItem - [x] ReadIndex - [x] InsertBatch - [x] ReadBatch - [x] DeleteBatch **Testing:** - [x] Just a simple Python script that does some requests to check visually that things are going right (does not contain parsing of results or assertions on returned values) - [x] Actual tests: - [x] Adapt testing framework - [x] Simple test with InsertItem + ReadItem - [x] Test with several Insert/Read/DeleteItem + ReadIndex - [x] Test all combinations of return formats for ReadItem - [x] Test with ReadBatch, InsertBatch, DeleteBatch - [x] Test with PollItem - [x] Test error codes - [ ] Fix most broken stuff - [x] test PollItem broken randomly - [x] when invalid causality tokens are given, errors should be 4xx not 5xx **Improvements:** - [x] Descending range queries - [x] Specify - [x] Implement - [x] Add test - [x] Batch updates to index counter - [x] Put K2V behind `k2v` feature flag Co-authored-by: Alex Auvolat <alex@adnab.me> Reviewed-on: Deuxfleurs/garage#293 Co-authored-by: Alex <alex@adnab.me> Co-committed-by: Alex <alex@adnab.me>
71 lines
1.4 KiB
Rust
71 lines
1.4 KiB
Rust
use aws_sdk_s3::{Client, Region};
|
|
use ext::*;
|
|
|
|
#[macro_use]
|
|
pub mod macros;
|
|
|
|
pub mod client;
|
|
pub mod custom_requester;
|
|
pub mod ext;
|
|
pub mod garage;
|
|
|
|
use custom_requester::CustomRequester;
|
|
|
|
const REGION: Region = Region::from_static("garage-integ-test");
|
|
|
|
pub struct Context {
|
|
pub garage: &'static garage::Instance,
|
|
pub client: Client,
|
|
pub custom_request: CustomRequester,
|
|
pub k2v: K2VContext,
|
|
}
|
|
|
|
pub struct K2VContext {
|
|
pub request: CustomRequester,
|
|
}
|
|
|
|
impl Context {
|
|
fn new() -> Self {
|
|
let garage = garage::instance();
|
|
let client = client::build_client(garage);
|
|
let custom_request = CustomRequester::new_s3(garage);
|
|
let k2v_request = CustomRequester::new_k2v(garage);
|
|
|
|
Context {
|
|
garage,
|
|
client,
|
|
custom_request,
|
|
k2v: K2VContext {
|
|
request: k2v_request,
|
|
},
|
|
}
|
|
}
|
|
|
|
/// Create an unique bucket with a random suffix.
|
|
///
|
|
/// Return the created bucket full name.
|
|
pub fn create_bucket(&self, name: &str) -> String {
|
|
let bucket_name = name.to_owned();
|
|
|
|
self.garage
|
|
.command()
|
|
.args(["bucket", "create", &bucket_name])
|
|
.quiet()
|
|
.expect_success_status("Could not create bucket");
|
|
self.garage
|
|
.command()
|
|
.args(["bucket", "allow"])
|
|
.args(["--owner", "--read", "--write"])
|
|
.arg(&bucket_name)
|
|
.args(["--key", &self.garage.key.name])
|
|
.quiet()
|
|
.expect_success_status("Could not allow key for bucket");
|
|
|
|
bucket_name
|
|
}
|
|
}
|
|
|
|
pub fn context() -> Context {
|
|
Context::new()
|
|
}
|