From 69c4bd62e61747e118ca8b19485c50b82bef2881 Mon Sep 17 00:00:00 2001 From: Andrew Donald Kennedy Date: Fri, 10 Feb 2012 12:56:11 +0000 Subject: [PATCH] Implemented 4xx Error annotation in OrgClient --- .../v1_5/features/OrgAsyncClient.java | 24 ++--- .../director/v1_5/features/OrgClient.java | 7 +- .../v1_5/features/OrgClientExpectTest.java | 100 ++++++++++++++++-- .../src/test/resources/org/error400.xml | 2 + .../test/resources/org/error403-catalog.xml | 2 + .../src/test/resources/org/error403-fake.xml | 2 + 6 files changed, 111 insertions(+), 26 deletions(-) create mode 100644 labs/vcloud-director/src/test/resources/org/error400.xml create mode 100644 labs/vcloud-director/src/test/resources/org/error403-catalog.xml create mode 100644 labs/vcloud-director/src/test/resources/org/error403-fake.xml diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java index 7bf2dff7bc..8541fc2638 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java @@ -18,22 +18,20 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.net.URI; - import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; -import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; import org.jclouds.vcloud.director.v1_5.domain.Org; import org.jclouds.vcloud.director.v1_5.domain.OrgList; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; +import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xxOrNull; import com.google.common.util.concurrent.ListenableFuture; @@ -48,7 +46,7 @@ public interface OrgAsyncClient { * @see OrgClient#getOrgList */ @GET - @Path("/org/") + @Path("/org") @Consumes @JAXBResponseParser ListenableFuture getOrgList(); @@ -57,27 +55,29 @@ public interface OrgAsyncClient { * @see OrgClient#getOrg */ @GET + @Path("/org/{id}") @Consumes @JAXBResponseParser - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getOrg(@EndpointParam URI uri); + @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + ListenableFuture getOrg(@PathParam("id") String orgId); /** * @see OrgClient#getMetadata */ @GET - @Path("/metadata/") + @Path("/org/{id}/metadata") @Consumes @JAXBResponseParser - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getMetadata(@EndpointParam URI orgRef); + @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + ListenableFuture getMetadata(@PathParam("id") String orgId); /** * @see OrgClient#getMetadataEntry */ @GET + @Path("/org/{id}/metadata/{key}") @Consumes @JAXBResponseParser - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getMetadataEntry(@EndpointParam URI metaDataRef); + @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + ListenableFuture getMetadataEntry(@PathParam("id") String orgId, @PathParam("key") String key); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java index d5078f52c4..88efcf1709 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java @@ -18,7 +18,6 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; @@ -50,19 +49,19 @@ public interface OrgClient { * * @return the org or null if not found */ - Org getOrg(URI orgHref); + Org getOrg(String orgId); /** * Retrieves an list of the organization's metadata * * @return a list of metadata */ - Metadata getMetadata(URI orgRef); + Metadata getMetadata(String orgId); /** * Retrieves a metadata * * @return the metadata or null if not found */ - MetadataEntry getMetadataEntry(URI metaDataRef); + MetadataEntry getMetadataEntry(String orgId, String key); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java index c8c407e86e..9112b295f3 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java @@ -18,12 +18,14 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static org.testng.Assert.assertEquals; +import static org.testng.Assert.*; import java.net.URI; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.Error; import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; @@ -44,7 +46,7 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest public void testWhenResponseIs2xxLoginReturnsValidOrgList() { VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, - getStandardRequest("GET", URI.create("http://localhost/api/org/")), + getStandardRequest("GET", "/org"), getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORGLIST_XML+";version=1.5")); OrgList expected = OrgList.builder() @@ -63,7 +65,7 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, - getStandardRequest("GET", orgRef), + getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"), getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG_XML+";version=1.5")); Org expected = Org @@ -115,16 +117,91 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .build()) .build(); - assertEquals(client.getOrgClient().getOrg(orgRef), expected); + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + assertEquals(client.getOrgClient().getOrg(orgId), expected); + } + + @Test + public void testWhenResponseIs400ForInvalidOrgId() { + URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/NOTAUUID"); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org/NOTAUUID"), + getStandardPayloadResponse(400, "/org/error400.xml", VCloudDirectorMediaType.ERROR_XML)); + + Error expected = Error.builder() + .message("validation error on field 'id': String value has invalid format or length") + .majorErrorCode(400) + .minorErrorCode("BAD_REQUEST") + .build(); + + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + try { + client.getOrgClient().getOrg(orgId); + fail("Should give HTTP 400 error"); + } catch (VCloudDirectorException vde) { + assertEquals(vde.getError(), expected); + } catch (Exception e) { + fail("Should have thrown a VCloudDirectorException"); + } + } + + @Test + public void testWhenResponseIs403ForCatalogIdUsedAsOrgId() { + URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"), + getStandardPayloadResponse(403, "/org/error403-catalog.xml", VCloudDirectorMediaType.ERROR_XML)); + + Error expected = Error.builder() + .message("No access to entity "com.vmware.vcloud.entity.org:9e08c2f6-077a-42ce-bece-d5332e2ebb5c".") + .majorErrorCode(403) + .minorErrorCode("ACCESS_TO_RESOURCE_IS_FORBIDDEN") + .build(); + + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + try { + client.getOrgClient().getOrg(orgId); + fail("Should give HTTP 403 error"); + } catch (VCloudDirectorException vde) { + assertEquals(vde.getError(), expected); + } catch (Exception e) { + fail("Should have thrown a VCloudDirectorException"); + } + } + + @Test + public void testWhenResponseIs403ForFakeOrgId() { + URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"), + getStandardPayloadResponse(403, "/org/error403-fake.xml", VCloudDirectorMediaType.ERROR_XML)); + + Error expected = Error.builder() + .message("No access to entity "com.vmware.vcloud.entity.org:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee".") + .majorErrorCode(403) + .minorErrorCode("ACCESS_TO_RESOURCE_IS_FORBIDDEN") + .build(); + + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + try { + client.getOrgClient().getOrg(orgId); + fail("Should give HTTP 403 error"); + } catch (VCloudDirectorException vde) { + assertEquals(vde.getError(), expected); + } catch (Exception e) { + fail("Should have thrown a VCloudDirectorException"); + } } @Test public void testWhenResponseIs2xxLoginReturnsValidMetadataList() { URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); - URI metaRef = URI.create(orgRef.toASCIIString()+"/metadata/"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, - getStandardRequest("GET", metaRef), + getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"), getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATA_XML+";version=1.5")); Metadata expected = Metadata.builder() @@ -137,20 +214,23 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .build()) .build(); - assertEquals(client.getOrgClient().getMetadata(orgRef), expected); + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + assertEquals(client.getOrgClient().getMetadata(orgId), expected); } @Test(enabled=false) // No metadata in exemplar xml... public void testWhenResponseIs2xxLoginReturnsValidMetadata() { - URI metadataRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"); + URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, - getStandardRequest("GET", metadataRef), + getStandardRequest("GET", "i/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"), getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATAENTRY_XML+";version=1.5")); MetadataEntry expected = MetadataEntry.builder() + .key("KEY") .build(); - assertEquals(client.getOrgClient().getMetadataEntry(metadataRef), expected); + String orgId = getUuidFromReference.apply(Reference.builder().href(orgRef).build()); + assertEquals(client.getOrgClient().getMetadataEntry(orgId, "KEY"), expected); } } diff --git a/labs/vcloud-director/src/test/resources/org/error400.xml b/labs/vcloud-director/src/test/resources/org/error400.xml new file mode 100644 index 0000000000..9ad5bd1ad9 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/error400.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/error403-catalog.xml b/labs/vcloud-director/src/test/resources/org/error403-catalog.xml new file mode 100644 index 0000000000..b37a321662 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/error403-catalog.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/error403-fake.xml b/labs/vcloud-director/src/test/resources/org/error403-fake.xml new file mode 100644 index 0000000000..417556d341 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/error403-fake.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file