Repository: jclouds-labs-openstack Updated Branches: refs/heads/1.7.x d0f88e95a -> de13c203b
Added ObjectApi.list() and ContainerApi.head() methods/tests Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/de13c203 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/de13c203 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/de13c203 Branch: refs/heads/1.7.x Commit: de13c203b353b7a8ded612a784413eea5b98f068 Parents: d0f88e9 Author: Jeremy Daggett <[email protected]> Authored: Wed Apr 2 10:53:49 2014 -0700 Committer: Everett Toews <[email protected]> Committed: Thu Apr 3 18:14:52 2014 -0500 ---------------------------------------------------------------------- .../swift/v1/features/ContainerApi.java | 17 +++++++ .../openstack/swift/v1/features/ObjectApi.java | 19 ++++++++ .../swift/v1/features/ContainerApiLiveTest.java | 11 ++++- .../swift/v1/features/ContainerApiMockTest.java | 48 ++++++++++++++++++++ .../swift/v1/features/ObjectApiLiveTest.java | 12 ++++- .../swift/v1/features/ObjectApiMockTest.java | 24 +++++++++- 6 files changed, 128 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java index fdaa73b..bfc50c9 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java @@ -109,6 +109,23 @@ public interface ContainerApi { boolean createIfAbsent(@PathParam("containerName") String containerName, CreateContainerOptions options); /** + * Gets the {@link Container} metadata, including the number of objects in the container and + * the total bytes for all objects stored in the container. + * + * @param containerName + * corresponds to {@link Container#getName()}. + * + * @return the {@link Container}, or {@code null} if not found. + */ + @Named("container:get") + @HEAD + @ResponseParser(ParseContainerFromHeaders.class) + @Fallback(NullOnNotFoundOr404.class) + @Path("/{containerName}") + @Nullable + Container head(@PathParam("containerName") String containerName); + + /** * Gets the {@link Container}. * * @param containerName http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java index ee96f22..02c37bc 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java @@ -85,6 +85,25 @@ public interface ObjectApi { @Fallback(NullOnNotFoundOr404.class) @Path("/") @Nullable + ObjectList list(); + + /** + * Lists up to 10,000 objects. To control a large list of containers beyond + * 10,000 objects, use the {@code marker} and {@code endMarker} parameters in the + * {@link ListContainerOptions} class. + * + * @param options + * the {@link ListContainerOptions} for controlling the returned list. + * + * @return an {@link ObjectList} of {@link SwiftObject} ordered by name or {@code null}. + */ + @Named("object:list") + @GET + @QueryParams(keys = "format", values = "json") + @ResponseParser(ParseObjectListFromResponse.class) + @Fallback(NullOnNotFoundOr404.class) + @Path("/") + @Nullable ObjectList list(ListContainerOptions options); /** http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java index 31ff231..19e0d14 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java @@ -68,7 +68,16 @@ public class ContainerApiLiveTest extends BaseSwiftApiLiveTest<SwiftApi> { assertTrue(container.getBytesUsed() == 0); } } - + + public void testHead() throws Exception { + for (String regionId : regions) { + Container container = api.containerApiInRegion(regionId).head(name); + assertEquals(container.getName(), name); + assertTrue(container.getObjectCount() == 0); + assertTrue(container.getBytesUsed() == 0); + } + } + public void testGet() throws Exception { for (String regionId : regions) { Container container = api.containerApiInRegion(regionId).get(name); http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java index 752b4b7..a595686 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java @@ -26,11 +26,14 @@ import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.CONTAINER_RE import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.util.Map; import java.util.Map.Entry; +import org.jclouds.blobstore.ContainerNotFoundException; +import org.jclouds.openstack.swift.v1.CopyObjectException; import org.jclouds.openstack.swift.v1.SwiftApi; import org.jclouds.openstack.swift.v1.domain.Container; import org.jclouds.openstack.swift.v1.options.CreateContainerOptions; @@ -102,6 +105,51 @@ public class ContainerApiMockTest extends BaseOpenStackMockTest<SwiftApi> { } } + public void testContainerExists() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(201))); + server.enqueue(addCommonHeaders(containerResponse() + .addHeader(CONTAINER_METADATA_PREFIX + "ApiName", "swift") + .addHeader(CONTAINER_METADATA_PREFIX + "ApiVersion", "v1.1"))); + + try { + SwiftApi api = api(server.getUrl("/").toString(), "openstack-swift"); + assertTrue(api.containerApiInRegion("DFW").createIfAbsent("myContainer", anybodyRead().metadata(metadata))); + + Container container = api.containerApiInRegion("DFW").head("myContainer"); + assertEquals(container.getName(), "myContainer"); + assertEquals(container.getObjectCount(), 42l); + assertEquals(container.getBytesUsed(), 323479l); + for (Entry<String, String> entry : container.getMetadata().entrySet()) { + assertEquals(container.getMetadata().get(entry.getKey().toLowerCase()), entry.getValue()); + } + assertEquals(server.getRequestCount(), 3); + assertAuthentication(server); + assertRequest(server.takeRequest(), "PUT", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer"); + assertRequest(server.takeRequest(), "HEAD", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer"); + } finally { + server.shutdown(); + } + } + + @Test(expectedExceptions = ContainerNotFoundException.class) + public void testContainerDoesNotExist() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404))); + + try { + SwiftApi api = api(server.getUrl("/").toString(), "openstack-swift"); + assertTrue(api.containerApiInRegion("DFW").createIfAbsent("myContainer", anybodyRead().metadata(metadata))); + + // the head call will throw the ContainerNotFoundException + api.containerApiInRegion("DFW").head("myContainer"); + } finally { + server.shutdown(); + } + } + public void testCreateIfAbsent() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java index db835fd..907afb6 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java @@ -123,9 +123,19 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest<SwiftApi> { public void testList() throws Exception { for (String regionId : regions) { ObjectApi objectApi = api.objectApiInRegionForContainer(regionId, containerName); + ObjectList response = objectApi.list(); + assertEquals(response.getContainer(), api.containerApiInRegion(regionId).get(containerName)); + for (SwiftObject object : response) { + checkObject(object); + } + } + } + + public void testListWithOptions() throws Exception { + for (String regionId : regions) { + ObjectApi objectApi = api.objectApiInRegionForContainer(regionId, containerName); ObjectList response = objectApi.list(ListContainerOptions.NONE); assertEquals(response.getContainer(), api.containerApiInRegion(regionId).get(containerName)); - assertNotNull(response); for (SwiftObject object : response) { checkObject(object); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/de13c203/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java index d44e308..7fe10b7 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java @@ -89,7 +89,7 @@ public class ObjectApiMockTest extends BaseOpenStackMockTest<SwiftApi> { try { SwiftApi api = api(server.getUrl("/").toString(), "openstack-swift"); - ObjectList objects = api.objectApiInRegionForContainer("DFW", "myContainer").list(new ListContainerOptions()); + ObjectList objects = api.objectApiInRegionForContainer("DFW", "myContainer").list(); assertEquals(objects, parsedObjectsForUrl(server.getUrl("/").toString())); assertEquals(objects.getContainer().getName(), "myContainer"); assertTrue(objects.getContainer().getAnybodyRead().get()); @@ -102,6 +102,28 @@ public class ObjectApiMockTest extends BaseOpenStackMockTest<SwiftApi> { } } + public void testListWithOptions() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(containerResponse() + .addHeader(CONTAINER_READ, CONTAINER_ACL_ANYBODY_READ) + .setBody(stringFromResource("/object_list.json")))); + + try { + SwiftApi api = api(server.getUrl("/").toString(), "openstack-swift"); + ObjectList objects = api.objectApiInRegionForContainer("DFW", "myContainer").list(new ListContainerOptions()); + assertEquals(objects, parsedObjectsForUrl(server.getUrl("/").toString())); + assertEquals(objects.getContainer().getName(), "myContainer"); + assertTrue(objects.getContainer().getAnybodyRead().get()); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertRequest(server.takeRequest(), "GET", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer/?format=json"); + } finally { + server.shutdown(); + } + } + public void testListOptions() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
