aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2021-02-19 19:10:23 +0100
committerAlex Auvolat <alex@adnab.me>2021-02-19 19:10:23 +0100
commit5d1fa591d99f1f051ba77fa243a673d819377771 (patch)
treeba0c42bcf884acdac2c5fea9fb963891242e9b3a
parente64ecbdccd727c7b7f69b3462d16ac025611a886 (diff)
downloadgarage-5d1fa591d99f1f051ba77fa243a673d819377771.tar.gz
garage-5d1fa591d99f1f051ba77fa243a673d819377771.zip
Add compatibility list
-rw-r--r--README.md2
-rw-r--r--doc/Compatibility.md82
-rw-r--r--src/api/api_server.rs2
3 files changed, 85 insertions, 1 deletions
diff --git a/README.md b/README.md
index 04b4469d..6f462493 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ Non-goals include:
Our main use case is to provide a distributed storage layer for small-scale self hosted services such as [Deuxfleurs](https://deuxfleurs.fr).
+Check our [compatibility page](doc/Compatibility.md) to view details of the S3 API compatibility.
+
## Development
We propose the following quickstart to setup a full dev. environment as quickly as possible:
diff --git a/doc/Compatibility.md b/doc/Compatibility.md
new file mode 100644
index 00000000..3546ed29
--- /dev/null
+++ b/doc/Compatibility.md
@@ -0,0 +1,82 @@
+## S3 Compatibility status
+
+### Global S3 features
+
+Implemented:
+
+- putting and getting objects in buckets
+- multipart uploads
+- listing objects
+- access control on a per-key-per-bucket basis
+
+Not implemented:
+
+- object-level ACL
+- encryption
+- most `x-amz-` headers
+
+
+### Endpoint implementation
+
+All APIs that are not mentionned are not implemented and will return a 400 bad request.
+
+#### AbortMultipartUpload
+
+Implemented.
+
+#### CompleteMultipartUpload
+
+Implemented badly. Garage will not check that all the parts stored correspond to the list given by the client in the request body. This means that the multipart upload might be completed with an invalid size. This is a bug and will be fixed.
+
+#### CopyObject
+
+Implemented.
+
+#### CreateBucket
+
+Garage does not accept creating buckets or giving access using API calls, it has to be done using the CLI tools. CreateBucket will return a 200 if the bucket exists and user has write access, and a 403 Forbidden in all other cases.
+
+#### CreateMultipartUpload
+
+Implemented.
+
+#### DeleteBucket
+
+Garage does not accept deleting buckets using API calls, it has to be done using the CLI tools. This request will return a 403 Forbidden.
+
+#### DeleteObject
+
+Implemented.
+
+#### DeleteObjects
+
+Implemented.
+
+#### GetObject
+
+Implemented.
+
+#### HeadBucket
+
+Implemented.
+
+#### HeadObject
+
+Implemented.
+
+#### ListObjects
+
+Implemented, but there isn't a very good specification of what `encoding-type=url` covers so there might be some encoding bugs. In our implementation the url-encoded fields are in the same in ListObjects as they are in ListObjectsV2.
+
+#### ListObjectsV2
+
+Implemented.
+
+#### PutObject
+
+Implemented.
+
+#### UploadPart
+
+Implemented.
+
diff --git a/src/api/api_server.rs b/src/api/api_server.rs
index 05c09ea7..484b407a 100644
--- a/src/api/api_server.rs
+++ b/src/api/api_server.rs
@@ -198,7 +198,7 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
))
}
&Method::GET => {
- // ListObjects query
+ // ListObjects or ListObjectsV2 query
let q = parse_list_objects_query(bucket, &params)?;
Ok(handle_list(garage, &q).await?)
}