From d29bd2eec8325c48711125c9e941690c8afc5458 Mon Sep 17 00:00:00 2001 From: Andrew Donald Kennedy Date: Fri, 10 Feb 2012 13:04:12 +0000 Subject: [PATCH] Completed TaskClient and tidied up OrgClient. Note two types of API call here, one using traditional REST semantics and the other taking ReferenceTypes and extracting URIs from them. --- .../director/v1_5/domain/URISupplier.java | 35 ++++ .../v1_5/features/OrgAsyncClient.java | 48 ++++- .../director/v1_5/features/OrgClient.java | 8 +- .../v1_5/features/TaskAsyncClient.java | 40 +++- .../director/v1_5/features/TaskClient.java | 10 +- .../v1_5/functions/ReferenceToEndpoint.java | 40 ++++ ...OrNull.java => ThrowVCloudErrorOn4xx.java} | 23 +-- .../v1_5/features/OrgClientExpectTest.java | 152 +++++++++++++-- .../v1_5/features/TaskClientExpectTest.java | 178 ++++++++++++++++-- ...aseVCloudDirectorRestClientExpectTest.java | 15 +- .../v1_5/login/SessionClientExpectTest.java | 4 +- .../src/test/resources/task/task.xml | 6 + 12 files changed, 491 insertions(+), 68 deletions(-) create mode 100644 labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java create mode 100644 labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java rename labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/{ThrowVCloudErrorOn4xxOrNull.java => ThrowVCloudErrorOn4xx.java} (69%) create mode 100644 labs/vcloud-director/src/test/resources/task/task.xml diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java new file mode 100644 index 0000000000..4cd978d6f8 --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java @@ -0,0 +1,35 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.domain; + +import java.net.URI; + +/** + * @author grkvlt@apache.org + */ +public interface URISupplier { + + /** + * This returns the {@link URI} for a particular {@link ReferenceType} or {@link ResourceType} object. + * + * @see ResourceType#getHref() + * @see ReferenceType#getHref() + */ + public URI getURI(); +} 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 8541fc2638..e110a6ff18 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 @@ -23,6 +23,7 @@ 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; @@ -30,8 +31,10 @@ 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.domain.ReferenceType; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; -import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xxOrNull; +import org.jclouds.vcloud.director.v1_5.functions.ReferenceToEndpoint; +import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; import com.google.common.util.concurrent.ListenableFuture; @@ -43,7 +46,7 @@ import com.google.common.util.concurrent.ListenableFuture; public interface OrgAsyncClient { /** - * @see OrgClient#getOrgList + * @see OrgClient#getOrgList() */ @GET @Path("/org") @@ -52,32 +55,61 @@ public interface OrgAsyncClient { ListenableFuture getOrgList(); /** - * @see OrgClient#getOrg + * @see OrgClient#getOrg(String) */ @GET @Path("/org/{id}") @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + @ExceptionParser(ThrowVCloudErrorOn4xx.class) ListenableFuture getOrg(@PathParam("id") String orgId); + + /** + * @see OrgClient#getOrg(ReferenceType) + */ + @GET + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getOrg(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType orgRef); /** - * @see OrgClient#getMetadata + * @see OrgClient#getMetadata(String) */ @GET @Path("/org/{id}/metadata") @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + @ExceptionParser(ThrowVCloudErrorOn4xx.class) ListenableFuture getMetadata(@PathParam("id") String orgId); + + /** + * @see OrgClient#getMetadata(ReferenceType) + */ + @GET + @Path("/metadata") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getMetadata(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType orgRef); /** - * @see OrgClient#getMetadataEntry + * @see OrgClient#getMetadataEntry(String, String) */ @GET @Path("/org/{id}/metadata/{key}") @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + @ExceptionParser(ThrowVCloudErrorOn4xx.class) ListenableFuture getMetadataEntry(@PathParam("id") String orgId, @PathParam("key") String key); + + /** + * @see OrgClient#getMetadataEntry(ReferenceType, String) + */ + @GET + @Path("/metadata/{key}") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType orgRef, @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 88efcf1709..d72d99c17f 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 @@ -25,13 +25,13 @@ 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.domain.ReferenceType; /** * Provides synchronous access to Org. *

* * @see OrgAsyncClient - * @see * @author Adrian Cole */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) @@ -50,6 +50,8 @@ public interface OrgClient { * @return the org or null if not found */ Org getOrg(String orgId); + + Org getOrg(ReferenceType orgRef); /** * Retrieves an list of the organization's metadata @@ -58,10 +60,14 @@ public interface OrgClient { */ Metadata getMetadata(String orgId); + Metadata getMetadata(ReferenceType orgRef); + /** * Retrieves a metadata * * @return the metadata or null if not found */ MetadataEntry getMetadataEntry(String orgId, String key); + + MetadataEntry getMetadataEntry(ReferenceType orgRef, String key); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java index 870c74abdb..833b918640 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java @@ -18,8 +18,6 @@ */ 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.POST; @@ -30,10 +28,12 @@ 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.vcloud.director.v1_5.domain.ReferenceType; import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.domain.TasksList; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; -import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xxOrNull; +import org.jclouds.vcloud.director.v1_5.functions.ReferenceToEndpoint; +import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; import com.google.common.util.concurrent.ListenableFuture; @@ -45,23 +45,43 @@ import com.google.common.util.concurrent.ListenableFuture; public interface TaskAsyncClient { /** - * @see TaskClient#getTaskList(URI) + * @see TaskClient#getTaskList(String) */ @GET @Path("/tasksList/{id}") @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) + @ExceptionParser(ThrowVCloudErrorOn4xx.class) ListenableFuture getTaskList(@PathParam("id") String orgId); /** - * @see TaskClient#getTask(URI) + * @see TaskClient#getTask(String id) + */ + @GET + @Path("/task/{id}") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getTask(@PathParam("id") String taskId); + + /** + * @see TaskClient#getTask(ReferenceType) */ @GET @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) - ListenableFuture getTask(@EndpointParam URI taskHref); + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getTask(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType taskRef); + + /** + * @see TaskClient#cancelTask(URI) + */ + @POST + @Path("/task/{id}/action/cancel") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture cancelTask(@PathParam("id") String taskId); /** * @see TaskClient#cancelTask(URI) @@ -70,6 +90,6 @@ public interface TaskAsyncClient { @Path("/action/cancel") @Consumes @JAXBResponseParser - @ExceptionParser(ThrowVCloudErrorOn4xxOrNull.class) - void cancelTask(@EndpointParam URI taskHref); + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture cancelTask(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType taskRef); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskClient.java index e0cfc81698..be8734c722 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskClient.java @@ -18,10 +18,10 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.domain.TasksList; @@ -47,10 +47,14 @@ public interface TaskClient { * * @return the task or null if not found */ - Task getTask(URI taskHref); + Task getTask(String taskId); + + Task getTask(ReferenceType taskRef); /** * Cancels a task. */ - void cancelTask(URI taskHref); + void cancelTask(String taskId); + + void cancelTask(ReferenceType taskRef); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java new file mode 100644 index 0000000000..f1f33bd35b --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java @@ -0,0 +1,40 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.functions; + +import java.net.URI; + +import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; + +import com.google.common.base.Function; +import com.google.common.base.Preconditions; + +/** + * @author grkvlt@apache.org + */ +public class ReferenceToEndpoint implements Function { + + @Override + public URI apply(Object input) { + Preconditions.checkNotNull(input); + Preconditions.checkArgument(input instanceof ReferenceType); + ReferenceType reference = (ReferenceType) input; + return reference.getURI(); + }; +} \ No newline at end of file diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xxOrNull.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xx.java similarity index 69% rename from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xxOrNull.java rename to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xx.java index da4e6504c5..9de694e36b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xxOrNull.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ThrowVCloudErrorOn4xx.java @@ -37,25 +37,22 @@ import com.google.common.collect.Iterables; * @author grkvlt@apache.org */ @Singleton -public class ThrowVCloudErrorOn4xxOrNull implements Function { +public class ThrowVCloudErrorOn4xx implements Function { @Inject - private ThrowVCloudErrorOn4xxOrNull() { } + private ThrowVCloudErrorOn4xx() { } @Override public Object apply(Exception from) { Iterable throwables = Iterables.filter(Throwables.getCausalChain(from), HttpResponseException.class); - if (Iterables.size(throwables) == 1) { - HttpResponseException exception = Iterables.getOnlyElement(throwables); - if (exception.getResponse().getStatusCode() >= 400 && exception.getResponse().getStatusCode() < 500) { - try { - Error error = JAXB.unmarshal(InputSuppliers.of(exception.getContent()).getInput(), Error.class); - throw new VCloudDirectorException(error); - } catch (IOException e) { - Throwables.propagate(e); - } + HttpResponseException exception = Iterables.getFirst(throwables, null); + if (exception != null && exception.getResponse().getStatusCode() >= 400 && exception.getResponse().getStatusCode() < 500) { + try { + Error error = JAXB.unmarshal(InputSuppliers.of(exception.getContent()).getInput(), Error.class); + throw new VCloudDirectorException(error); + } catch (IOException e) { + Throwables.propagate(e); } } - return null; // TODO is this correct? + throw Throwables.propagate(from); } - } \ No newline at end of file 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 9112b295f3..ff368206b4 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 @@ -35,6 +35,8 @@ import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; +import com.google.common.collect.Iterables; + /** * Allows us to test a client via its side effects. * @@ -42,12 +44,12 @@ import org.testng.annotations.Test; */ @Test(groups = "unit", singleThreaded = true, testName = "OrgClientExpectTest") public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest { + @Test public void testWhenResponseIs2xxLoginReturnsValidOrgList() { - VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org"), - getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORGLIST_XML+";version=1.5")); + getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORG_LIST)); OrgList expected = OrgList.builder() .org(Reference.builder() @@ -60,13 +62,139 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest assertEquals(client.getOrgClient().getOrgList(), expected); } + @Test + public void testWhenResponseIs2xxLoginReturnsValidOrgFromListByReference() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org"), + getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORG_LIST)); + Reference org = Iterables.getOnlyElement(client.getOrgClient().getOrgList().getOrgs()); + + client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", org.getHref()), + getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG)); + + Org expected = Org + .builder() + .name("JClouds") + .description("") + .fullName("JClouds") + .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") + .type("application/vnd.vmware.vcloud.org+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.vdc+xml") + .name("Cluster01-JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.tasksList+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("Public") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.controlAccess+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c/controlAccess/")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("ilsolation01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("internet01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.metadata+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")) + .build()) + .build(); + + assertEquals(client.getOrgClient().getOrg(org), expected); + } + + @Test + public void testWhenResponseIs2xxLoginReturnsValidOrgFromListById() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org"), + getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORG_LIST)); + Reference org = Iterables.getOnlyElement(client.getOrgClient().getOrgList().getOrgs()); + client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", "/org/" + org.getUuid()), + getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG)); + + Org expected = Org + .builder() + .name("JClouds") + .description("") + .fullName("JClouds") + .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") + .type("application/vnd.vmware.vcloud.org+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.vdc+xml") + .name("Cluster01-JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.tasksList+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("Public") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.controlAccess+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c/controlAccess/")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("ilsolation01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("internet01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.metadata+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")) + .build()) + .build(); + + assertEquals(org.getUuid(), "6f312e42-cd2b-488d-a2bb-97519cd57ed0"); + assertEquals(client.getOrgClient().getOrg(org.getUuid()), expected); + } + @Test public void testWhenResponseIs2xxLoginReturnsValidOrg() { URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"), - getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG_XML+";version=1.5")); + getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG)); Org expected = Org .builder() @@ -74,7 +202,7 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .description("") .fullName("JClouds") .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") - .type(VCloudDirectorMediaType.ORG_XML) + .type("application/vnd.vmware.vcloud.org+xml") .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) .link(Link.builder() .rel("down") @@ -127,7 +255,7 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org/NOTAUUID"), - getStandardPayloadResponse(400, "/org/error400.xml", VCloudDirectorMediaType.ERROR_XML)); + getStandardPayloadResponse(400, "/org/error400.xml", VCloudDirectorMediaType.ERROR)); Error expected = Error.builder() .message("validation error on field 'id': String value has invalid format or length") @@ -152,10 +280,10 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"), - getStandardPayloadResponse(403, "/org/error403-catalog.xml", VCloudDirectorMediaType.ERROR_XML)); + getStandardPayloadResponse(403, "/org/error403-catalog.xml", VCloudDirectorMediaType.ERROR)); Error expected = Error.builder() - .message("No access to entity "com.vmware.vcloud.entity.org:9e08c2f6-077a-42ce-bece-d5332e2ebb5c".") + .message("No access to entity \"com.vmware.vcloud.entity.org:9e08c2f6-077a-42ce-bece-d5332e2ebb5c\".") .majorErrorCode(403) .minorErrorCode("ACCESS_TO_RESOURCE_IS_FORBIDDEN") .build(); @@ -177,10 +305,10 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"), - getStandardPayloadResponse(403, "/org/error403-fake.xml", VCloudDirectorMediaType.ERROR_XML)); + getStandardPayloadResponse(403, "/org/error403-fake.xml", VCloudDirectorMediaType.ERROR)); Error expected = Error.builder() - .message("No access to entity "com.vmware.vcloud.entity.org:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee".") + .message("No access to entity \"com.vmware.vcloud.entity.org:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\".") .majorErrorCode(403) .minorErrorCode("ACCESS_TO_RESOURCE_IS_FORBIDDEN") .build(); @@ -202,7 +330,7 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"), - getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATA_XML+";version=1.5")); + getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATA)); Metadata expected = Metadata.builder() .type("application/vnd.vmware.vcloud.metadata+xml") @@ -223,8 +351,8 @@ 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", "i/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"), - getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATAENTRY_XML+";version=1.5")); + getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"), + getStandardPayloadResponse("/org/metadata.xml", VCloudDirectorMediaType.METADATA_ENTRY)); MetadataEntry expected = MetadataEntry.builder() .key("KEY") diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java index 7028e323b6..de37593c98 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java @@ -46,7 +46,7 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest @Test public void testTaskListForValidOrg() { - HttpRequest orgListRequest = HttpRequest.builder() + HttpRequest taskRequest = HttpRequest.builder() .method("GET") .endpoint(URI.create(endpoint + "/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) .headers(ImmutableMultimap. builder() @@ -55,12 +55,12 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .build()) .build(); - HttpResponse orgListResponse = HttpResponse.builder() + HttpResponse taskResponse = HttpResponse.builder() .statusCode(200) - .payload(payloadFromResourceWithContentType("/task/taskslist.xml", VCloudDirectorMediaType.TASKSLIST_XML + ";version=1.5")) + .payload(payloadFromResourceWithContentType("/task/taskslist.xml", VCloudDirectorMediaType.TASKS_LIST.getMediaType() + ";version=1.5")) .build(); - VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest, orgListResponse); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); String orgId = getUuidFromReference.apply(Reference.builder().href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")).build()); @@ -124,7 +124,7 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest @Test public void testTaskListForInvalidOrgId() { - HttpRequest orgListRequest = HttpRequest.builder() + HttpRequest taskRequest = HttpRequest.builder() .method("GET") .endpoint(URI.create(endpoint + "/tasksList/NOTAUUID")) .headers(ImmutableMultimap. builder() @@ -133,12 +133,12 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .build()) .build(); - HttpResponse orgListResponse = HttpResponse.builder() + HttpResponse taskResponse = HttpResponse.builder() .statusCode(400) - .payload(payloadFromResourceWithContentType("/task/error400.xml", VCloudDirectorMediaType.ERROR_XML + ";version=1.5")) + .payload(payloadFromResourceWithContentType("/task/error400.xml", VCloudDirectorMediaType.ERROR.getMediaType() + ";version=1.5")) .build(); - VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest, orgListResponse); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); String orgId = "NOTAUUID"; @@ -159,7 +159,7 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest @Test public void testTaskListForNotFoundOrgId() { - HttpRequest orgListRequest = HttpRequest.builder() + HttpRequest taskRequest = HttpRequest.builder() .method("GET") .endpoint(URI.create(endpoint + "/tasksList/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) .headers(ImmutableMultimap. builder() @@ -168,12 +168,12 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .build()) .build(); - HttpResponse orgListResponse = HttpResponse.builder() + HttpResponse taskResponse = HttpResponse.builder() .statusCode(403) - .payload(payloadFromResourceWithContentType("/task/error403.xml", VCloudDirectorMediaType.ERROR_XML + ";version=1.5")) + .payload(payloadFromResourceWithContentType("/task/error403.xml", VCloudDirectorMediaType.ERROR.getMediaType() + ";version=1.5")) .build(); - VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest, orgListResponse); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); String orgId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"; @@ -192,4 +192,158 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest fail("Should have thrown a VCloudDirectorException"); } } + + @Test + public void testGetTaskForTaskId() { + HttpRequest taskRequest = HttpRequest.builder() + .method("GET") + .endpoint(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization", token) + .build()) + .build(); + + HttpResponse taskResponse = HttpResponse.builder() + .statusCode(200) + .payload(payloadFromResourceWithContentType("/task/task.xml", VCloudDirectorMediaType.TASK.getMediaType() + ";version=1.5")) + .build(); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); + + String taskId = "5fcd2af3-d0ec-45ce-9451-8c585a2c766b"; + + Task expected = Task.builder() + .type("application/vnd.vmware.vcloud.task+xml") + .name("task") + .id("urn:vcloud:task:5fcd2af3-d0ec-45ce-9451-8c585a2c766b") + .href(URI.create("https://vcloudbeta.bluelock.com/api/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .status("success") + .operation("Created Catalog QunyingTestCatalog(7212e451-76e1-4631-b2de-ba1dfd8080e4)") + .operationName("catalogCreateCatalog") + .startTime(dateService.iso8601DateParse("2012-02-07T00:16:28.450-05:00")) + .endTime(dateService.iso8601DateParse("2012-02-07T00:16:28.867-05:00")) + .expiryTime(dateService.iso8601DateParse("2012-05-07T00:16:28.450-04:00")) + .owner(Reference.builder() + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("QunyingTestCatalog") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .org(Reference.builder() + .type("application/vnd.vmware.vcloud.org+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .build(); + + assertEquals(client.getTaskClient().getTask(taskId), expected); + } + + @Test + public void testGetTaskForTaskRef() { + HttpRequest taskRequest = HttpRequest.builder() + .method("GET") + .endpoint(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization", token) + .build()) + .build(); + + HttpResponse taskResponse = HttpResponse.builder() + .statusCode(200) + .payload(payloadFromResourceWithContentType("/task/task.xml", VCloudDirectorMediaType.TASK.getMediaType() + ";version=1.5")) + .build(); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); + + Reference taskRef = Reference.builder() + .type("application/vnd.vmware.vcloud.task+xml") + .name("task") + .href(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .build(); + + Task expected = Task.builder() + .type("application/vnd.vmware.vcloud.task+xml") + .name("task") + .id("urn:vcloud:task:5fcd2af3-d0ec-45ce-9451-8c585a2c766b") + .href(URI.create("https://vcloudbeta.bluelock.com/api/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .status("success") + .operation("Created Catalog QunyingTestCatalog(7212e451-76e1-4631-b2de-ba1dfd8080e4)") + .operationName("catalogCreateCatalog") + .startTime(dateService.iso8601DateParse("2012-02-07T00:16:28.450-05:00")) + .endTime(dateService.iso8601DateParse("2012-02-07T00:16:28.867-05:00")) + .expiryTime(dateService.iso8601DateParse("2012-05-07T00:16:28.450-04:00")) + .owner(Reference.builder() + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("QunyingTestCatalog") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .org(Reference.builder() + .type("application/vnd.vmware.vcloud.org+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .build(); + + assertEquals(client.getTaskClient().getTask(taskRef), expected); + } + + @Test + public void testCancelTaskByTaskId() { + HttpRequest taskRequest = HttpRequest.builder() + .method("POST") + .endpoint(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b/action/cancel")) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization", token) + .build()) + .build(); + + HttpResponse taskResponse = HttpResponse.builder() + .statusCode(200) + .build(); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); + + String taskId = "5fcd2af3-d0ec-45ce-9451-8c585a2c766b"; + + client.getTaskClient().cancelTask(taskId); + } + + @Test + public void testCancelTaskByTaskRef() { + HttpRequest taskRequest = HttpRequest.builder() + .method("POST") + .endpoint(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b/action/cancel")) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization", token) + .build()) + .build(); + + HttpResponse taskResponse = HttpResponse.builder() + .statusCode(200) + .build(); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse); + + Reference taskRef = Reference.builder() + .type("application/vnd.vmware.vcloud.task+xml") + .name("task") + .href(URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")) + .build(); + + client.getTaskClient().cancelTask(taskRef); + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java index 6429cdf5ab..55a21c418d 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java @@ -27,6 +27,7 @@ import org.jclouds.rest.BaseRestClientExpectTest; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeTest; import com.google.common.base.Function; @@ -50,7 +51,7 @@ public class BaseVCloudDirectorRestClientExpectTest extends BaseRestClientExpect protected DateService dateService; - @BeforeTest + @BeforeClass protected void setUpInjector() { dateService = Guice.createInjector().getInstance(DateService.class); assert dateService != null; @@ -79,7 +80,7 @@ public class BaseVCloudDirectorRestClientExpectTest extends BaseRestClientExpect .put("x-vcloud-authorization", token) .put("Set-Cookie", String.format("vcloud-token=%s; Secure; Path=/", token)) .build()) - .payload(payloadFromResourceWithContentType("/session.xml", VCloudDirectorMediaType.SESSION_XML + ";version=1.5")) + .payload(payloadFromResourceWithContentType("/session.xml", VCloudDirectorMediaType.SESSION.getMediaType() + ";version=1.5")) .build(); public BaseVCloudDirectorRestClientExpectTest() { @@ -96,24 +97,24 @@ public class BaseVCloudDirectorRestClientExpectTest extends BaseRestClientExpect return getStandardRequest(method, uri, VCloudDirectorMediaType.ANY); } - protected HttpRequest getStandardRequest(String method, URI uri, String mediaType) { + protected HttpRequest getStandardRequest(String method, URI uri, VCloudDirectorMediaType mediaType) { return HttpRequest.builder() .method(method) .endpoint(uri) .headers(ImmutableMultimap. builder() - .put("Accept", mediaType) + .put("Accept", mediaType.getMediaType()) .put("x-vcloud-authorization", token) .build()) .build(); } - protected HttpResponse getStandardPayloadResponse(String relativeFilePath, String mediaType) { + protected HttpResponse getStandardPayloadResponse(String relativeFilePath, VCloudDirectorMediaType mediaType) { return getStandardPayloadResponse(200, relativeFilePath, mediaType); } - protected HttpResponse getStandardPayloadResponse(int statusCode, String relativeFilePath, String mediaType) { + protected HttpResponse getStandardPayloadResponse(int statusCode, String relativeFilePath, VCloudDirectorMediaType mediaType) { return HttpResponse.builder() .statusCode(statusCode) - .payload(payloadFromResourceWithContentType(relativeFilePath, mediaType+";version=1.5")).build(); + .payload(payloadFromResourceWithContentType(relativeFilePath, mediaType.getMediaType()+";version=1.5")).build(); } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientExpectTest.java index 879db3a1ef..3f82809586 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientExpectTest.java @@ -72,7 +72,7 @@ public class SessionClientExpectTest extends BaseRestClientExpectTest builder().put("x-vcloud-authorization", token).put("Set-Cookie", String.format("vcloud-token=%s; Secure; Path=/", token)).build()) .payload( - payloadFromResourceWithContentType("/session.xml", VCloudDirectorMediaType.SESSION_XML + payloadFromResourceWithContentType("/session.xml", VCloudDirectorMediaType.SESSION.getMediaType() + ";version=1.5")).build() ); @@ -97,7 +97,7 @@ public class SessionClientExpectTest extends BaseRestClientExpectTest + + + + +