From 6d3d92694f27b856548a272756c22e4c00e08693 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 5 May 2015 22:18:24 -0700 Subject: [PATCH] Add Marker support for donut, also add a testing code --- pkg/storage/donut/objectstorage.go | 15 ++++++++++++++- pkg/storage/drivers/api_testsuite.go | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pkg/storage/donut/objectstorage.go b/pkg/storage/donut/objectstorage.go index bf89f004f..4c07ff256 100644 --- a/pkg/storage/donut/objectstorage.go +++ b/pkg/storage/donut/objectstorage.go @@ -134,9 +134,22 @@ func (d donut) ListObjects(bucket, prefix, marker, delimiter string, maxkeys int actualObjects = donutObjects } + sort.Strings(actualObjects) + var newActualObjects []string + switch { + case marker != "": + for _, objectName := range actualObjects { + if objectName > marker { + newActualObjects = append(newActualObjects, objectName) + } + } + default: + newActualObjects = actualObjects + } + var results []string var commonPrefixes []string - for _, objectName := range actualObjects { + for _, objectName := range newActualObjects { if len(results) >= maxkeys { isTruncated = true break diff --git a/pkg/storage/drivers/api_testsuite.go b/pkg/storage/drivers/api_testsuite.go index ab4cf742a..29d228784 100644 --- a/pkg/storage/drivers/api_testsuite.go +++ b/pkg/storage/drivers/api_testsuite.go @@ -181,10 +181,25 @@ func testPaging(c *check.C, create func() Driver) { c.Assert(resources.CommonPrefixes[0], check.Equals, "this/") } + // check results with Marker + { + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Prefix = "" + resources.Marker = "newPrefix" + resources.Delimiter = "/" + resources.Maxkeys = 3 + objects, resources, err = drivers.ListObjects("bucket", resources) + c.Assert(objects[0].Key, check.Equals, "newPrefix2") + c.Assert(objects[1].Key, check.Equals, "obj0") + c.Assert(objects[2].Key, check.Equals, "obj1") + c.Assert(resources.CommonPrefixes[0], check.Equals, "this/") + } // check ordering of results with prefix { resources.Prefix = "obj" resources.Delimiter = "" + resources.Marker = "" resources.Maxkeys = 1000 objects, resources, err = drivers.ListObjects("bucket", resources) c.Assert(objects[0].Key, check.Equals, "obj0") @@ -196,6 +211,7 @@ func testPaging(c *check.C, create func() Driver) { // check ordering of results with prefix and no paging { resources.Prefix = "new" + resources.Marker = "" resources.Maxkeys = 5 objects, resources, err = drivers.ListObjects("bucket", resources) c.Assert(objects[0].Key, check.Equals, "newPrefix")