16535: Add GetBucketVersioning API.
authorTom Clegg <tom@tomclegg.ca>
Wed, 29 Jul 2020 14:20:16 +0000 (10:20 -0400)
committerTom Clegg <tom@tomclegg.ca>
Wed, 29 Jul 2020 15:06:29 +0000 (11:06 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

services/keep-web/s3.go
services/keep-web/s3_test.go

index 679b866e614e4bd6308e5494df77efae9e473521..7c3aedff3c443faecbf306d0671f971c70a5fddf 100644 (file)
@@ -68,7 +68,13 @@ func (h *handler) serveS3(w http.ResponseWriter, r *http.Request) bool {
        switch {
        case r.Method == "GET" && strings.Count(strings.TrimSuffix(r.URL.Path, "/"), "/") == 1:
                // Path is "/{uuid}" or "/{uuid}/", has no object name
-               h.s3list(w, r, fs)
+               if _, ok := r.URL.Query()["versioning"]; ok {
+                       // GetBucketVersioning
+                       fmt.Fprintln(w, `<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>`)
+               } else {
+                       // ListObjects
+                       h.s3list(w, r, fs)
+               }
                return true
        case r.Method == "GET":
                fspath := "/by_id" + r.URL.Path
index 60fb3dba4ed301ec80f3b15c2fdb7bbdcee14756..ce2731ce4d527949920eecb96c3574c9aed0f3aa 100644 (file)
@@ -9,6 +9,7 @@ import (
        "crypto/rand"
        "fmt"
        "io/ioutil"
+       "net/http"
        "os"
        "strings"
        "sync"
@@ -263,6 +264,21 @@ func (stage *s3stage) writeBigDirs(c *check.C, dirs int, filesPerDir int) {
        c.Assert(fs.Sync(), check.IsNil)
 }
 
+func (s *IntegrationSuite) TestS3GetBucketVersioning(c *check.C) {
+       stage := s.s3setup(c)
+       defer stage.teardown(c)
+       for _, bucket := range []*s3.Bucket{stage.collbucket, stage.projbucket} {
+               req, err := http.NewRequest("GET", bucket.URL("/"), nil)
+               req.Header.Set("Authorization", "AWS "+arvadostest.ActiveTokenV2+":none")
+               req.URL.RawQuery = "versioning"
+               resp, err := http.DefaultClient.Do(req)
+               c.Assert(err, check.IsNil)
+               buf, err := ioutil.ReadAll(resp.Body)
+               c.Assert(err, check.IsNil)
+               c.Check(strings.TrimSpace(string(buf)), check.Equals, `<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>`)
+       }
+}
+
 func (s *IntegrationSuite) TestS3CollectionList(c *check.C) {
        stage := s.s3setup(c)
        defer stage.teardown(c)