diff --git a/labs/vcloud-director/pom.xml b/labs/vcloud-director/pom.xml index b007aad71b..0971f57635 100644 --- a/labs/vcloud-director/pom.xml +++ b/labs/vcloud-director/pom.xml @@ -42,6 +42,7 @@ + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java index bd020be889..266cd2b144 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java @@ -21,7 +21,8 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; -import java.util.Collections; +import java.util.Collection; +import java.util.Map; import java.util.Set; import javax.xml.bind.annotation.XmlElement; @@ -31,20 +32,22 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; /** * Represents a set of metadata *

+ * *

  * <xs:complexType name="Metadata">
  * 
- * + * * @author danikov */ @XmlRootElement(name = "Metadata") -public class Metadata extends Resource { +public class Metadata extends Resource implements Map { public static final String MEDIA_TYPE = VCloudDirectorMediaType.METADATA; @@ -59,7 +62,7 @@ public class Metadata extends Resource { private static class ConcreteBuilder extends Builder { } - + public static abstract class Builder> extends Resource.Builder { private Set metadataEntries = Sets.newLinkedHashSet(); @@ -99,12 +102,19 @@ public class Metadata extends Resource { this.metadataEntries = ImmutableSet.copyOf(builder.metadataEntries); } - @XmlElement(name = "MetadataEntry") private Set metadataEntries = Sets.newLinkedHashSet(); public Set getMetadataEntries() { - return Collections.unmodifiableSet(metadataEntries); + return ImmutableSet.copyOf(metadataEntries); + } + + protected Map toMap() { + ImmutableMap.Builder builder = ImmutableMap. builder(); + for (MetadataEntry entry : metadataEntries) { + builder.put(entry.getKey(), entry.getValue()); + } + return builder.build(); } @Override @@ -127,4 +137,64 @@ public class Metadata extends Resource { return super.string().add("metadataEntries", metadataEntries); } + @Override + public void clear() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean containsKey(Object arg0) { + return toMap().containsKey(arg0); + } + + @Override + public boolean containsValue(Object arg0) { + return toMap().containsValue(arg0); + } + + @Override + public Set> entrySet() { + return toMap().entrySet(); + } + + @Override + public String get(Object arg0) { + return toMap().get(arg0); + } + + @Override + public boolean isEmpty() { + return getMetadataEntries().size() == 0; + } + + @Override + public Set keySet() { + return toMap().keySet(); + } + + @Override + public String put(String arg0, String arg1) { + throw new UnsupportedOperationException(); + } + + @Override + public void putAll(Map arg0) { + throw new UnsupportedOperationException(); + } + + @Override + public String remove(Object arg0) { + throw new UnsupportedOperationException(); + } + + @Override + public int size() { + return getMetadataEntries().size(); + } + + @Override + public Collection values() { + return toMap().values(); + } + } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java index 9f4216fa78..bb93f43437 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java @@ -137,7 +137,7 @@ public class MetadataEntry extends Resource { } - private MetadataEntry() { + MetadataEntry() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java index 5c497b4300..26580a0a79 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java @@ -131,7 +131,7 @@ public class IpScope { } } - private IpScope() { + IpScope() { // For JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java index 0a84e291cd..28f8c90248 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java @@ -140,7 +140,7 @@ public class NatRule { this.vmRule = vmRule; } - private NatRule() { + NatRule() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java index 74d7b29ada..9b3b469f53 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java @@ -227,7 +227,7 @@ public class NetworkConnection { this.needsCustomization = needsCustomization; } - private NetworkConnection() { + NetworkConnection() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java index e8d3714923..07cd1913da 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java @@ -76,7 +76,7 @@ public class NetworkFeatures { } } - private NetworkFeatures() { + NetworkFeatures() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java index 3de01fb07d..cd624c8041 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java @@ -84,7 +84,7 @@ public abstract class NetworkServiceType> { return true; if (o == null || getClass() != o.getClass()) return false; - NetworkServiceType that = NetworkServiceType.class.cast(o); + NetworkServiceType that = NetworkServiceType.class.cast(o); return equal(isEnabled, that.isEnabled); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java index e76d24ffd7..b74e4c0a86 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java @@ -147,7 +147,7 @@ public class SourcedCompositionItemParam { this.sourceDelete = sourceDelete; } - private SourcedCompositionItemParam() { + SourcedCompositionItemParam() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java index b8949e7075..997e4585c6 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java @@ -61,7 +61,7 @@ public class QueryList extends ContainerType { private static class ConcreteBuilder extends Builder { } - private QueryList() { + QueryList() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java index 5f6bd1d4bd..990da38cfa 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java @@ -168,7 +168,7 @@ public class QueryResultNetworkRecord extends QueryResultRecordType { isBusy = builder.isBusy; } - private QueryResultNetworkRecord() { + QueryResultNetworkRecord() { // for JAXB } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java index 45dbe18086..d3629e7371 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java @@ -35,7 +35,7 @@ import org.jclouds.vcloud.director.v1_5.functions.href.MediaURNToHref; * Provides synchronous access to {@link Media}. * * @see MediaAsyncApi - * @author danikov + * @author danikov, Adrian Cole */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) public interface MediaApi { @@ -45,44 +45,55 @@ public interface MediaApi { * * @return the media or null if not found */ - Media getMedia(URI mediaUri); - + Media get(String mediaUrn); + + Media get(URI mediaHref); + /** * Creates a media (and present upload link for the floppy/iso file). * - * @return The response will return a link to transfer site to be able to continue with uploading the media. + * @return The response will return a link to transfer site to be able to continue with uploading + * the media. */ - Media addMedia(URI uploadLink, Media media); - + Media add(URI uploadHref, Media media); + /** - * Clones a media into new one. - * The status of the returned media is UNRESOLVED(0) until the task for cloning finish. + * Clones a media into new one. The status of the returned media is UNRESOLVED(0) until the task + * for cloning finish. * - * @return a Media resource which will contain a task. - * The user should monitor the contained task status in order to check when it is completed. + * @return a Media resource which will contain a task. The user should monitor the contained task + * status in order to check when it is completed. */ - Media cloneMedia(URI cloneLink, CloneMediaParams params); - + Media clone(String mediaUrn, CloneMediaParams params); + + Media clone(URI mediaHref, CloneMediaParams params); + /** * Updates the name/description of a media. * - * @return a task. This operation is asynchronous and the user should monitor the returned - * task status in order to check when it is completed. + * @return a task. This operation is asynchronous and the user should monitor the returned task + * status in order to check when it is completed. */ - Task editMedia(URI mediaUri, Media media); - + Task edit(String mediaUrn, Media media); + + Task edit(URI mediaHref, Media media); + /** * Deletes a media. */ - Task removeMedia(URI mediaUri); - + Task remove(String mediaUrn); + + Task remove(URI mediaHref); + /** * Retrieves an owner. * * @return the owner or null if not found */ - Owner getOwner(URI mediaUri); - + Owner getOwner(String mediaUrn); + + Owner getOwner(URI mediaHref); + /** * @return synchronous access to {@link Metadata.Writeable} features */ @@ -90,6 +101,6 @@ public interface MediaApi { MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn); @Delegate - MetadataApi.Writeable getMetadataApi(@EndpointParam URI mediaUri); + MetadataApi.Writeable getMetadataApi(@EndpointParam URI mediaHref); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java index 0932186cc3..57132b2960 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java @@ -49,59 +49,105 @@ import com.google.common.util.concurrent.ListenableFuture; /** * @see MediaApi - * @author danikov + * @author danikov, Adrian Cole */ @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class) public interface MediaAsyncApi { /** - * @see MediaApi#getMedia(URI) + * @see MediaApi#get(String) */ @GET @Consumes @JAXBResponseParser @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getMedia(@EndpointParam URI uri); - + ListenableFuture get(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn); + /** - * @see MediaApi#addMedia(URI, Media) + * @see MediaApi#add(URI, Media) */ @POST @Consumes(VCloudDirectorMediaType.MEDIA) @Produces(VCloudDirectorMediaType.MEDIA) @JAXBResponseParser - ListenableFuture addMedia(@EndpointParam URI link, - @BinderParam(BindToXMLPayload.class) Media media); - - + ListenableFuture add(@EndpointParam URI updateHref, @BinderParam(BindToXMLPayload.class) Media media); + /** - * @see MediaApi#cloneMedia(URI, CloneMediaParams) + * @see MediaApi#clone(String, CloneMediaParams) */ @POST @Path("/action/cloneMedia") @Consumes(VCloudDirectorMediaType.MEDIA) @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS) @JAXBResponseParser - ListenableFuture cloneMedia(@EndpointParam URI vdcRef, - @BinderParam(BindToXMLPayload.class) CloneMediaParams params); - + ListenableFuture clone(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn, + @BinderParam(BindToXMLPayload.class) CloneMediaParams params); + /** - * @see MediaApi#editMedia(URI, Media)) + * @see MediaApi#editMedia(String, Media) */ @PUT @Consumes(VCloudDirectorMediaType.TASK) @Produces(VCloudDirectorMediaType.MEDIA) @JAXBResponseParser - ListenableFuture editMedia(@EndpointParam URI uri, @BinderParam(BindToXMLPayload.class) Media media); - + ListenableFuture edit(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn, + @BinderParam(BindToXMLPayload.class) Media media); + /** - * @see MediaApi#removeMedia(URI)) - */ + * @see MediaApi#removeMedia(String) + */ @DELETE @Consumes(VCloudDirectorMediaType.TASK) @JAXBResponseParser - ListenableFuture removeMedia(@EndpointParam URI uri); - + ListenableFuture remove(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn); + + /** + * @see MediaApi#getOwner(String) + */ + @GET + @Path("/owner") + @Consumes + @JAXBResponseParser + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getOwner(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn); + + /** + * @see MediaApi#get(URI) + */ + @GET + @Consumes + @JAXBResponseParser + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture get(@EndpointParam URI mediaHref); + + /** + * @see MediaApi#clone(URI, CloneMediaParams) + */ + @POST + @Path("/action/cloneMedia") + @Consumes(VCloudDirectorMediaType.MEDIA) + @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS) + @JAXBResponseParser + ListenableFuture clone(@EndpointParam URI mediaHref, + @BinderParam(BindToXMLPayload.class) CloneMediaParams params); + + /** + * @see MediaApi#editMedia(URI, Media) + */ + @PUT + @Consumes(VCloudDirectorMediaType.TASK) + @Produces(VCloudDirectorMediaType.MEDIA) + @JAXBResponseParser + ListenableFuture edit(@EndpointParam URI mediaHref, @BinderParam(BindToXMLPayload.class) Media media); + + /** + * @see MediaApi#removeMedia(URI) + */ + @DELETE + @Consumes(VCloudDirectorMediaType.TASK) + @JAXBResponseParser + ListenableFuture remove(@EndpointParam URI mediaHref); + /** * @see MediaApi#getOwner(URI) */ @@ -110,14 +156,14 @@ public interface MediaAsyncApi { @Consumes @JAXBResponseParser @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getOwner(@EndpointParam URI uri); - + ListenableFuture getOwner(@EndpointParam URI mediaHref); + /** - * @return asynchronous access to {@link Metadata.Writeable} features - */ + * @return asynchronous access to {@link Metadata.Writeable} features + */ @Delegate MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn); - + @Delegate - MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI uri); + MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI mediaHref); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java index 3cd5956d20..bb2a6a17f5 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java @@ -28,7 +28,7 @@ import org.jclouds.vcloud.director.v1_5.domain.Group; * Provides synchronous access to {@link Group} objects. * * @see GroupAsyncApi - * @author danikov + * @author danikov, Adrian Cole */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) public interface GroupApi { @@ -40,11 +40,13 @@ public interface GroupApi { * POST /admin/org/{id}/groups * * - * @param orgUri the admin org to add the group in + * @param orgUrn the admin org to add the group in * @return the addd group */ - Group addGroup(URI adminOrgUri, Group group); + Group addGroupToOrg(Group group, String orgUrn); + Group addGroupToOrg(Group group, URI orgHref); + /** * Retrieves a group. * @@ -52,10 +54,12 @@ public interface GroupApi { * GET /admin/group/{id} * * - * @param groupURI the reference for the group + * @param groupString the reference for the group * @return a group */ - Group getGroup(URI groupUri); + Group get(String groupUrn); + + Group get(URI groupHref); /** * Modifies a group. @@ -66,7 +70,9 @@ public interface GroupApi { * * @return the edited group */ - Group editGroup(URI groupRef, Group group); + Group edit(String groupUrn, Group group); + + Group edit(URI groupHref, Group group); /** * Deletes a group. @@ -75,5 +81,8 @@ public interface GroupApi { * DELETE /admin/group/{id} * */ - void removeGroup(URI groupRef); + void remove(String groupUrn); + + void remove(URI groupHref); + } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java index 4b68d8ae25..cf2435b550 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java @@ -38,48 +38,89 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Group; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest; +import org.jclouds.vcloud.director.v1_5.functions.href.GroupURNToHref; +import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref; import com.google.common.util.concurrent.ListenableFuture; - + /** * @see GroupApi - * @author danikov + * @author danikov, Adrian Cole */ @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class) public interface GroupAsyncApi { - + + /** + * @see GroupApi#addGroupToOrg(Group, String) + */ @POST @Path("/groups") @Consumes(VCloudDirectorMediaType.GROUP) @Produces(VCloudDirectorMediaType.GROUP) @JAXBResponseParser - ListenableFuture addGroup(@EndpointParam URI adminOrgUri, - @BinderParam(BindToXMLPayload.class) Group group); + ListenableFuture addGroupToOrg(@BinderParam(BindToXMLPayload.class) Group group, + @EndpointParam(parser = OrgURNToAdminHref.class) String adminUrn); /** - * @see GroupApi#getGroup(URI) + * @see GroupApi#get(String) */ @GET @Consumes @JAXBResponseParser @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getGroup(@EndpointParam URI groupUri); + ListenableFuture get(@EndpointParam(parser = GroupURNToHref.class) String groupUri); /** - * @see GroupApi#editGroup(URI, Group) + * @see GroupApi#edit(String, Group) */ @PUT @Consumes(VCloudDirectorMediaType.GROUP) @Produces(VCloudDirectorMediaType.GROUP) @JAXBResponseParser - ListenableFuture editGroup(@EndpointParam URI groupRef, - @BinderParam(BindToXMLPayload.class) Group group); + ListenableFuture edit(@EndpointParam(parser = GroupURNToHref.class) String groupUrn, + @BinderParam(BindToXMLPayload.class) Group group); /** - * @see GroupApi#removeGroup(URI) + * @see GroupApi#remove(String) */ @DELETE @Consumes @JAXBResponseParser - ListenableFuture removeGroup(@EndpointParam URI groupRef); + ListenableFuture remove(@EndpointParam(parser = GroupURNToHref.class) String groupUrn); + + /** + * @see GroupApi#addGroupToOrg(Group, URI) + */ + @POST + @Path("/groups") + @Consumes(VCloudDirectorMediaType.GROUP) + @Produces(VCloudDirectorMediaType.GROUP) + @JAXBResponseParser + ListenableFuture addGroupToOrg(@BinderParam(BindToXMLPayload.class) Group group, @EndpointParam URI adminUrn); + + /** + * @see GroupApi#get(URI) + */ + @GET + @Consumes + @JAXBResponseParser + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture get(@EndpointParam URI groupUri); + + /** + * @see GroupApi#edit(URI, Group) + */ + @PUT + @Consumes(VCloudDirectorMediaType.GROUP) + @Produces(VCloudDirectorMediaType.GROUP) + @JAXBResponseParser + ListenableFuture edit(@EndpointParam URI groupUrn, @BinderParam(BindToXMLPayload.class) Group group); + + /** + * @see GroupApi#remove(URI) + */ + @DELETE + @Consumes + @JAXBResponseParser + ListenableFuture remove(@EndpointParam URI groupUrn); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java new file mode 100644 index 0000000000..b952baaab2 --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java @@ -0,0 +1,43 @@ +/* + * 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.href; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.Entity; +import org.jclouds.vcloud.director.v1_5.functions.URNToHref; + +import com.google.common.cache.LoadingCache; + +@Singleton +public class GroupURNToHref extends URNToHref { + + @Inject + public GroupURNToHref(LoadingCache resolveEntityCache) { + super(resolveEntityCache); + } + + @Override + protected String type() { + return VCloudDirectorMediaType.GROUP; + } + +} \ No newline at end of file diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java index b4efdca63f..50075aa50c 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java @@ -114,7 +114,7 @@ public class CatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest { } if (media != null) { try { - Task remove = context.getApi().getMediaApi().removeMedia(media.getHref()); + Task remove = context.getApi().getMediaApi().remove(media.getId()); taskDoneEventually(remove); } catch (Exception e) { logger.warn(e, "Error when deleting media '%s'", media.getName()); @@ -153,7 +153,7 @@ public class CatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest { Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name("Test media 1").size(iso.length) .imageType(Media.ImageType.ISO).description("Test media generated by testAddMedia()").build(); - media = context.getApi().getMediaApi().addMedia(addMedia.getHref(), sourceMedia); + media = context.getApi().getMediaApi().add(addMedia.getHref(), sourceMedia); Checks.checkMediaFor(VCloudDirectorMediaType.MEDIA, media); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java index ea9e163b88..3fbe284b43 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java @@ -75,7 +75,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .build(); Media expected = addMedia(); - assertEquals(api.getMediaApi().addMedia(uploadLink, source), expected); + assertEquals(api.getMediaApi().add(uploadLink, source), expected); } @Test @@ -104,7 +104,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .build(); Media expected = cloneMedia(); - assertEquals(api.getMediaApi().cloneMedia(vdcURI, params), expected); + assertEquals(api.getMediaApi().clone(vdcURI, params), expected); } @Test @@ -121,7 +121,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .httpResponseBuilder().build()); Media expected = getMedia(); - assertEquals(api.getMediaApi().getMedia(mediaUri), expected); + assertEquals(api.getMediaApi().get(mediaUri), expected); } @Test @@ -144,7 +144,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .build(); try { - api.getMediaApi().getMedia(mediaUri); + api.getMediaApi().get(mediaUri); fail("Should give HTTP 400 error"); } catch (VCloudDirectorException vde) { assertEquals(vde.getError(), expected); @@ -166,7 +166,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .xmlFilePayload("/media/error403-catalog.xml", VCloudDirectorMediaType.ERROR) .httpResponseBuilder().statusCode(403).build()); - assertNull(api.getMediaApi().getMedia(mediaUri)); + assertNull(api.getMediaApi().get(mediaUri)); } @Test @@ -182,7 +182,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { .xmlFilePayload("/media/error403-fake.xml", VCloudDirectorMediaType.ERROR) .httpResponseBuilder().statusCode(403).build()); - assertNull(api.getMediaApi().getMedia(mediaUri)); + assertNull(api.getMediaApi().get(mediaUri)); } @Test @@ -202,7 +202,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { Media edit = editMedia(); Task expected = editMediaTask(); - assertEquals(api.getMediaApi().editMedia(mediaUri, edit), expected); + assertEquals(api.getMediaApi().edit(mediaUri, edit), expected); } @Test @@ -220,7 +220,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest { Task expected = removeMediaTask(); - assertEquals(api.getMediaApi().removeMedia(mediaUri), expected); + assertEquals(api.getMediaApi().remove(mediaUri), expected); } @Test diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java index 9e4b814045..66d611d68e 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java @@ -109,7 +109,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { protected void tidyUp() { if (media != null) { try { - Task remove = mediaApi.removeMedia(media.getHref()); + Task remove = mediaApi.remove(media.getId()); taskDoneEventually(remove); } catch (Exception e) { logger.warn(e, "Error when deleting media '%s': %s", media.getName()); @@ -117,7 +117,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { } if (oldMedia != null) { try { - Task remove = mediaApi.removeMedia(oldMedia.getHref()); + Task remove = mediaApi.remove(oldMedia.getId()); taskDoneEventually(remove); } catch (Exception e) { logger.warn(e, "Error when deleting media '%s': %s", oldMedia.getName()); @@ -136,7 +136,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name("Test media " + random.nextInt()) .size(iso.length).imageType(Media.ImageType.ISO).description("Test media generated by testAddMedia()") .build(); - media = mediaApi.addMedia(addMedia.getHref(), sourceMedia); + media = mediaApi.add(addMedia.getHref(), sourceMedia); Checks.checkMediaFor(MEDIA, media); @@ -162,19 +162,19 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { Link uploadLink = Iterables.find(links, LinkPredicates.relEquals(Link.Rel.UPLOAD_DEFAULT)); context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso)); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); if (media.getTasks().size() == 1) { Task uploadTask = Iterables.getOnlyElement(media.getTasks()); Checks.checkTask(uploadTask); assertEquals(uploadTask.getStatus(), Task.Status.RUNNING); assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); } } @Test(description = "GET /media/{id}", dependsOnMethods = { "testAddMedia" }) public void testGetMedia() { - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); assertNotNull(media, String.format(OBJ_REQ_LIVE, MEDIA)); owner = media.getOwner(); @@ -186,7 +186,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { @Test(description = "GET /media/{id}/owner", dependsOnMethods = { "testGetMedia" }) public void testGetMediaOwner() { - Owner directOwner = mediaApi.getOwner(media.getHref()); + Owner directOwner = mediaApi.getOwner(media.getId()); assertEquals(owner.toBuilder().user(owner.getUser()).build(), directOwner.toBuilder().links(Collections. emptySet()).build(), String.format( GETTER_RETURNS_SAME_OBJ, "getOwner()", "owner", "media.getOwner()", owner.toString(), @@ -215,7 +215,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { if (copyTask != null) { Checks.checkTask(copyTask); assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); } } @@ -236,7 +236,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { if (copyTask != null) { Checks.checkTask(copyTask); assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); } } @@ -253,10 +253,10 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { String newDescription = "new " + oldDescription; media = media.toBuilder().name(newName).description(newDescription).build(); - Task editMedia = mediaApi.editMedia(media.getHref(), media); + Task editMedia = mediaApi.edit(media.getId(), media); Checks.checkTask(editMedia); assertTrue(retryTaskSuccess.apply(editMedia), String.format(TASK_COMPLETE_TIMELY, "editMedia")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); assertTrue(equal(media.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, MEDIA, "name")); assertTrue(equal(media.getDescription(), newDescription), @@ -268,10 +268,10 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { media = media.toBuilder().name(oldName).description(oldDescription).build(); - editMedia = mediaApi.editMedia(media.getHref(), media); + editMedia = mediaApi.edit(media.getId(), media); Checks.checkTask(editMedia); assertTrue(retryTaskSuccess.apply(editMedia), String.format(TASK_COMPLETE_TIMELY, "editMedia")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); } @Test(description = "GET /media/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" }) @@ -296,7 +296,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { Checks.checkMetadataFor(MEDIA, metadata); checkMetadataContainsEntries(metadata, inputEntries); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); Checks.checkMediaFor(MEDIA, media); // test edit @@ -310,7 +310,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { Checks.checkMetadataFor(MEDIA, metadata); checkMetadataContainsEntries(metadata, inputEntries); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); Checks.checkMediaFor(MEDIA, media); } @@ -364,20 +364,20 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest { metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key"); Checks.checkMetadataValueFor(MEDIA, metadataValue); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); Checks.checkMediaFor(MEDIA, media); } @Test(description = "DELETE /media/{id}", dependsOnMethods = { "testRemoveMetadata" }) public void testRemoveMedia() { - Task removeMedia = mediaApi.removeMedia(media.getHref()); + Task removeMedia = mediaApi.remove(media.getId()); Checks.checkTask(removeMedia); assertTrue(retryTaskSuccess.apply(removeMedia), String.format(TASK_COMPLETE_TIMELY, "removeMedia")); - media = mediaApi.getMedia(media.getHref()); + media = mediaApi.get(media.getId()); assertNull(media, String.format(OBJ_DEL, MEDIA, media != null ? media.toString() : "")); - removeMedia = mediaApi.removeMedia(oldMedia.getHref()); + removeMedia = mediaApi.remove(oldMedia.getId()); Checks.checkTask(removeMedia); assertTrue(retryTaskSuccess.apply(removeMedia), String.format(TASK_COMPLETE_TIMELY, "removeMedia")); oldMedia = null; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java index 8e53db185b..fcb57b0d7d 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java @@ -18,10 +18,6 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static com.google.common.base.Predicates.and; -import static com.google.common.collect.Iterables.contains; -import static com.google.common.collect.Iterables.find; -import static com.google.common.collect.Iterables.getFirst; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CONDITION_FMT; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL; @@ -43,8 +39,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOwner; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkProductSectionList; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkStartupSection; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVApp; -import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; -import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; @@ -60,13 +54,9 @@ import org.jclouds.dmtf.ovf.MsgType; import org.jclouds.dmtf.ovf.NetworkSection; import org.jclouds.dmtf.ovf.ProductSection; import org.jclouds.dmtf.ovf.StartupSection; -import org.jclouds.io.Payloads; import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.AccessSetting; import org.jclouds.vcloud.director.v1_5.domain.Checks; -import org.jclouds.vcloud.director.v1_5.domain.Link; -import org.jclouds.vcloud.director.v1_5.domain.Media; 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.MetadataValue; @@ -118,43 +108,11 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest { private MetadataValue metadataValue; private String key; - private boolean mediaCreated = false; private boolean testUserCreated = false; private User user; @BeforeClass(alwaysRun = true) protected void setupRequiredEntities() { - Set links = lazyGetVdc().getLinks(); - - if (mediaURI == null) { - Predicate addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA)); - - if (contains(links, addMediaLink)) { - Link addMedia = find(links, addMediaLink); - byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; - - Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name(name("media")) - .size(iso.length).imageType(Media.ImageType.ISO) - .description("Test media generated by VAppApiLiveTest").build(); - Media media = context.getApi().getMediaApi().addMedia(addMedia.getHref(), sourceMedia); - - Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null); - context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso)); - - media = context.getApi().getMediaApi().getMedia(media.getHref()); - - if (media.getTasks().size() == 1) { - Task uploadTask = Iterables.getOnlyElement(media.getTasks()); - Checks.checkTask(uploadTask); - assertEquals(uploadTask.getStatus(), Task.Status.RUNNING); - assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask")); - media = context.getApi().getMediaApi().getMedia(media.getHref()); - } - - mediaURI = media.getHref(); - mediaCreated = true; - } - } if (adminContext != null) { userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId()) @@ -165,14 +123,6 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest { @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) public void cleanUp() { - if (adminContext != null && mediaCreated && mediaURI != null) { - try { - Task remove = context.getApi().getMediaApi().removeMedia(mediaURI); - taskDoneEventually(remove); - } catch (Exception e) { - logger.warn(e, "Error when deleting media"); - } - } if (adminContext != null && testUserCreated && userUrn != null) { try { adminContext.getApi().getUserApi().remove(userUrn); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java index 6798937fc1..a2bfbce37f 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java @@ -18,10 +18,6 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static com.google.common.base.Predicates.and; -import static com.google.common.collect.Iterables.contains; -import static com.google.common.collect.Iterables.find; -import static com.google.common.collect.Iterables.getFirst; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT; @@ -44,8 +40,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkScreenTicket; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVirtualHardwareSection; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVm; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVmPendingQuestion; -import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; -import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; @@ -62,12 +56,8 @@ import org.jclouds.dmtf.cim.OSType; import org.jclouds.dmtf.cim.ResourceAllocationSettingData; import org.jclouds.dmtf.ovf.MsgType; import org.jclouds.dmtf.ovf.ProductSection; -import org.jclouds.io.Payloads; import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Checks; -import org.jclouds.vcloud.director.v1_5.domain.Link; -import org.jclouds.vcloud.director.v1_5.domain.Media; 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.MetadataValue; @@ -116,42 +106,10 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { private MetadataValue metadataValue; private String key; - private boolean mediaCreated = false; private boolean testUserCreated = false; @BeforeClass(alwaysRun = true) protected void setupRequiredEntities() { - Set links = vdcApi.get(vdcUrn).getLinks(); - - if (mediaURI == null) { - Predicate addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA)); - - if (contains(links, addMediaLink)) { - Link addMedia = find(links, addMediaLink); - byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; - - Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name(name("media")) - .size(iso.length).imageType(Media.ImageType.ISO) - .description("Test media generated by VmApiLiveTest").build(); - Media media = context.getApi().getMediaApi().addMedia(addMedia.getHref(), sourceMedia); - - Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null); - context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso)); - - media = context.getApi().getMediaApi().getMedia(media.getHref()); - - if (media.getTasks().size() == 1) { - Task uploadTask = Iterables.getOnlyElement(media.getTasks()); - Checks.checkTask(uploadTask); - assertEquals(uploadTask.getStatus(), Task.Status.RUNNING); - assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask")); - media = context.getApi().getMediaApi().getMedia(media.getHref()); - } - - mediaURI = media.getHref(); - mediaCreated = true; - } - } if (adminContext != null) { userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId()) @@ -161,9 +119,9 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) public void cleanUp() { - if (adminContext != null && mediaCreated && mediaURI != null) { + if (adminContext != null && mediaUrn != null) { try { - Task remove = context.getApi().getMediaApi().removeMedia(mediaURI); + Task remove = context.getApi().getMediaApi().remove(mediaUrn); taskDoneEventually(remove); } catch (Exception e) { logger.warn("Error when deleting media: %s", e.getMessage()); @@ -462,7 +420,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { public void testInsertMedia() { // Setup media params from configured media id MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder() - .media(Reference.builder().href(mediaURI).type(MEDIA).build()).build(); + .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build(); // The method under test Task insertMedia = vmApi.insertMedia(vmUrn, params); @@ -473,7 +431,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { public void testEjectMedia() { // Setup media params from configured media id MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder() - .media(Reference.builder().href(mediaURI).type(MEDIA).build()).build(); + .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build(); // The method under test Task ejectMedia = vmApi.ejectMedia(vmUrn, params); @@ -864,8 +822,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { RasdItemsList newSection = oldSection.toBuilder().build(); // Method under test - Task editVirtualHardwareSectionNetworkCards = vmApi.editVirtualHardwareSectionNetworkCards(vmUrn, - newSection); + Task editVirtualHardwareSectionNetworkCards = vmApi.editVirtualHardwareSectionNetworkCards(vmUrn, newSection); assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionNetworkCards), String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionNetworkCards")); @@ -896,8 +853,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { RasdItemsList newSection = oldSection.toBuilder().build(); // Method under test - Task editVirtualHardwareSectionSerialPorts = vmApi - .editVirtualHardwareSectionSerialPorts(vmUrn, newSection); + Task editVirtualHardwareSectionSerialPorts = vmApi.editVirtualHardwareSectionSerialPorts(vmUrn, newSection); assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionSerialPorts), String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionSerialPorts")); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java index e7fd79ec7f..5601ad5102 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java @@ -56,7 +56,7 @@ public class GroupApiExpectTest extends VCloudDirectorAdminApiExpectTest { Group expected = group(); - assertEquals(api.getGroupApi().getGroup(groupRef.getHref()), expected); + assertEquals(api.getGroupApi().get(groupRef.getHref()), expected); } public static final Group group() { @@ -79,7 +79,7 @@ public class GroupApiExpectTest extends VCloudDirectorAdminApiExpectTest { Group expected = editGroup(); - assertEquals(api.getGroupApi().editGroup(groupRef.getHref(), expected), expected); + assertEquals(api.getGroupApi().edit(groupRef.getHref(), expected), expected); } public static Group editGroup() { @@ -96,6 +96,6 @@ public class GroupApiExpectTest extends VCloudDirectorAdminApiExpectTest { new VcloudHttpResponsePrimer() .httpResponseBuilder().statusCode(204).build()); - api.getGroupApi().removeGroup(groupRef.getHref()); + api.getGroupApi().remove(groupRef.getHref()); } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java index 93f553533a..5226c29f2c 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java @@ -50,7 +50,6 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { /* * Shared state between dependant tests. */ - private Reference groupRef; private Group group; private OrgLdapSettings oldLdapSettings, newLdapSettings; @@ -61,7 +60,7 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { Reference orgRef = null; // TODO: requisite LDAP settings -// oldLdapSettings = adminContext.getApi().getAdminOrgApi().getLdapSettings(orgRef.getHref()); +// oldLdapSettings = adminContext.getApi().getAdminOrgApi().getLdapSettings(orgRef.getId()); // OrgLdapSettings newLdapSettings = oldLdapSettings.toBuilder() // .ldapMode(OrgLdapSettings.LdapMode.SYSTEM) // .build(); @@ -79,7 +78,7 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { @Test(description = "GET /admin/group/{id}", dependsOnMethods = { "testAddGroup" }) public void testGetGroup() { - group = groupApi.getGroup(groupRef.getHref()); + group = groupApi.get(group.getId()); Checks.checkGroup(group); } @@ -98,7 +97,7 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { .description(newDescription) .build(); - group = groupApi.editGroup(group.getHref(), group); + group = groupApi.edit(group.getId(), group); assertTrue(equal(group.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, GROUP, "name")); assertTrue(equal(group.getDescription(), newDescription), @@ -113,13 +112,13 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { .description(oldDescription) .build(); - group = groupApi.editGroup(group.getHref(), group); + group = groupApi.edit(group.getId(), group); } } @Test(description = "DELETE /admin/group/{id}", dependsOnMethods = { "testEditGroup" } ) public void testRemoveGroup() { - groupApi.removeGroup(groupRef.getHref()); + groupApi.remove(group.getId()); // TODO stronger assertion of error expected // Error expected = Error.builder() @@ -129,7 +128,7 @@ public class GroupApiLiveTest extends BaseVCloudDirectorApiLiveTest { // .build(); try { - group = groupApi.getGroup(groupRef.getHref()); + group = groupApi.get(group.getId()); fail("Should give HTTP 403 error"); } catch (VCloudDirectorException vde) { // success diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java index 9ba93c8536..ef02a0bf93 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java @@ -18,12 +18,13 @@ */ package org.jclouds.vcloud.director.v1_5.internal; +import static com.google.common.base.Predicates.and; import static com.google.common.base.Strings.emptyToNull; import static com.google.common.collect.Iterables.any; +import static com.google.common.collect.Iterables.contains; import static com.google.common.collect.Iterables.find; import static com.google.common.collect.Iterables.getFirst; import static com.google.common.collect.Iterables.tryFind; -import static com.google.common.io.Closeables.closeQuietly; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_NON_NULL; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE; @@ -34,6 +35,9 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.USER; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VDC; +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; @@ -42,7 +46,6 @@ import java.net.URI; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; -import java.util.Properties; import java.util.Random; import java.util.Set; @@ -51,17 +54,21 @@ import javax.inject.Inject; import org.jclouds.apis.BaseContextLiveTest; import org.jclouds.date.DateService; +import org.jclouds.io.Payloads; import org.jclouds.logging.Logger; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; import org.jclouds.vcloud.director.testng.FormatApiResultsListener; import org.jclouds.vcloud.director.v1_5.VCloudDirectorApiMetadata; import org.jclouds.vcloud.director.v1_5.VCloudDirectorContext; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi; import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi; import org.jclouds.vcloud.director.v1_5.domain.Catalog; +import org.jclouds.vcloud.director.v1_5.domain.Checks; import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.Link.Rel; +import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.ResourceEntity.Status; import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles; @@ -89,8 +96,6 @@ import org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates; import org.jclouds.vcloud.director.v1_5.predicates.TaskStatusEquals; import org.jclouds.vcloud.director.v1_5.predicates.TaskSuccess; import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi; -import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi; -import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -131,8 +136,7 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< public Predicate retryTaskSuccessLong; protected RestContext adminContext; - protected RestContext context; // FIXME: rename to - // userContext? + protected Session adminSession; protected Session session; @@ -142,7 +146,8 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< private Catalog catalog; protected String vAppTemplateUrn; private VAppTemplate vAppTemplate; - protected URI mediaURI; + protected String mediaUrn; + private Media media; protected String networkUrn; private Network network; protected String vdcUrn; @@ -159,8 +164,6 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< protected DateService dateService; - protected VCloudDirectorTestSession testSession; - protected static String testStamp; @BeforeClass(alwaysRun = true) @@ -182,24 +185,13 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< retryTaskSuccessLong = new RetryablePredicate(taskSuccess, LONG_TASK_TIMEOUT_SECONDS * 1000L); } - @AfterClass(alwaysRun = true) - protected void tearDownTestSession() { - closeQuietly(testSession); - } + @BeforeClass(groups = { "integration", "live" }) + public void setupContext() { + super.setupContext(); + adminContext = context.getAdminContext(); - @Override - protected void initializeContext() { - Properties overrides = setupProperties(); - testSession = VCloudDirectorTestSession.builder().provider(provider).identity(identity).credential(credential) - .endpoint(endpoint).overrides(overrides).build(); - - context = testSession.getUserContext(); - adminContext = testSession.getAdminContext(); - - if (adminContext != null) { - adminSession = adminContext.getApi().getCurrentSession(); - adminContext.utils().injector().injectMembers(this); - } + adminSession = adminContext.getApi().getCurrentSession(); + adminContext.utils().injector().injectMembers(this); session = context.getApi().getCurrentSession(); context.utils().injector().injectMembers(this); @@ -246,9 +238,7 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< vdcUrn = emptyToNull(System.getProperty("test." + provider + ".vdc-id")); - String mediaId = emptyToNull(System.getProperty("test." + provider + ".media-id")); - if (mediaId != null) - mediaURI = URI.create(endpoint + "/media/" + mediaId); + mediaUrn = emptyToNull(System.getProperty("test." + provider + ".media-id")); networkUrn = emptyToNull(System.getProperty("test." + provider + ".network-id")); @@ -344,7 +334,7 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< } }; - + public Optional tryFindBridgedNetworkInOrg() { FluentIterable networks = FluentIterable.from(org.getLinks()) .filter(ReferencePredicates. typeEquals(ORG_NETWORK)).transform(new Function() { @@ -412,6 +402,37 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< return user; } + protected Media lazyGetMedia(){ + if (media == null || mediaUrn == null) { + Predicate addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA)); + if (contains(lazyGetVdc().getLinks(), addMediaLink)) { + Link addMedia = find(lazyGetVdc().getLinks(), addMediaLink); + byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + + Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name(name("media")) + .size(iso.length).imageType(Media.ImageType.ISO) + .description("Test media generated by VmApiLiveTest").build(); + media = context.getApi().getMediaApi().add(addMedia.getHref(), sourceMedia); + + Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null); + context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso)); + + media = context.getApi().getMediaApi().get(media.getId()); + + if (media.getTasks().size() == 1) { + Task uploadTask = Iterables.getOnlyElement(media.getTasks()); + Checks.checkTask(uploadTask); + assertEquals(uploadTask.getStatus(), Task.Status.RUNNING); + assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask")); + media = context.getApi().getMediaApi().get(media.getId()); + } + + mediaUrn = media.getId(); + } + } + return media; + } + protected VAppTemplate lazyGetVAppTemplate() { if (vAppTemplate == null) { assertNotNull(vAppTemplateUrn, String.format(URN_REQ_LIVE, VAPP_TEMPLATE)); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java index 44e4d4cf38..44c9d9cf41 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java @@ -30,7 +30,6 @@ import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; import org.jclouds.rest.internal.BaseRestApiExpectTest; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.testng.annotations.BeforeGroups; import com.google.common.base.Throwables; @@ -249,15 +248,6 @@ public abstract class BaseVCloudDirectorExpectTest extends BaseRestApiExpectT } } - public URI toAdminUri(Reference ref) { - return toAdminUri(ref.getHref()); - } - - public URI toAdminUri(URI uri) { - return Reference.builder().href(uri).build().toAdminReference(endpoint).getHref(); - } - - protected static XMLBuilder createXMLBuilder(String root){ try { return XMLBuilder.create(root); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java deleted file mode 100644 index 1fb805772f..0000000000 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.jclouds.vcloud.director.v1_5.internal; - -import static org.testng.Assert.assertEquals; - -import java.io.Closeable; -import java.util.Properties; - -import org.jclouds.ContextBuilder; -import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; -import org.jclouds.rest.RestContext; -import org.jclouds.sshj.config.SshjSshClientModule; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorContext; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi; -import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi; -import org.jclouds.vcloud.director.v1_5.domain.Link; -import org.jclouds.vcloud.director.v1_5.domain.Reference; -import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles; -import org.jclouds.vcloud.director.v1_5.domain.User; -import org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates; -import org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates; - -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.io.Closeables; -import com.google.inject.Module; - -public class VCloudDirectorTestSession implements Closeable { - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private String provider; - private String identity; - private String credential; - private Properties overrides; - private String endpoint; - - public Builder provider(String provider) { - this.provider = provider; - return this; - } - - public Builder identity(String identity) { - this.identity = identity; - return this; - } - - public Builder credential(String credential) { - this.credential = credential; - return this; - } - - public Builder overrides(Properties overrides) { - this.overrides = overrides; - return this; - } - - public Builder endpoint(String endpoint) { - this.endpoint = endpoint; - return this; - } - - public VCloudDirectorTestSession build() { - return new VCloudDirectorTestSession(provider, identity, credential, overrides, endpoint); - } - } - - private VCloudDirectorContext userContext; - private RestContext adminContext; - - private VCloudDirectorTestSession(String provider, String identity, String credential, Properties overrides, String endpoint) { - ContextBuilder builder = ContextBuilder.newBuilder(provider) - .credentials(identity, credential) - .endpoint(endpoint) - .modules(ImmutableSet. of(new SLF4JLoggingModule(), new SshjSshClientModule())) - .overrides(overrides); - userContext = VCloudDirectorContext.class.cast(builder.build()); - - // Look for the admin link in the current session - Link admin = Iterables.tryFind( - userContext.getApi().getCurrentSession().getLinks(), - Predicates.and(LinkPredicates.relEquals(Link.Rel.DOWN), ReferencePredicates.typeEquals(VCloudDirectorMediaType.ADMIN))) - .orNull(); - - // Get the admin context if the link exists - if (admin != null) { - adminContext = userContext.getAdminContext(); - - // Lookup the user details - Reference orgRef = Iterables.getFirst(userContext.getApi().getOrgApi().list(), null) - .toAdminReference(endpoint); - Reference userRef = Iterables.find( - adminContext.getApi().getOrgApi().get(orgRef.getHref()).getUsers(), - ReferencePredicates.nameEquals(adminContext.getApi().getCurrentSession().getUser())); - User user = adminContext.getApi().getUserApi().get(userRef.getHref()); - - // Check that the user has the org admin role - Reference userRole = user.getRole(); - assertEquals(userRole.getName(), DefaultRoles.ORG_ADMIN.value()); - } - } - - @Override - public void close() { - // NOTE we only need to close the user context to log out - Closeables.closeQuietly(userContext); - } - - public VCloudDirectorContext getUserContext() { - return userContext; - } - - public RestContext getAdminContext() { - return adminContext; - } -}