Repository: jclouds-labs Updated Branches: refs/heads/2.1.x 87ff3afe1 -> 5c97ea450
JCLOUDS-1406 - Add default location configuration to dimension data provider Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/5c97ea45 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/5c97ea45 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/5c97ea45 Branch: refs/heads/2.1.x Commit: 5c97ea450e870f6bd185ebd99a5e8d3b4f6ea771 Parents: 87ff3af Author: Trevor Flanagan <trevor.flana...@itaas.dimensiondata.com> Authored: Thu Apr 19 15:54:25 2018 +0100 Committer: Ignasi Barrera <n...@apache.org> Committed: Thu Apr 19 17:02:36 2018 +0200 ---------------------------------------------------------------------- dimensiondata/pom.xml | 1 - ...mensionDataCloudControlProviderMetadata.java | 28 +++++++- .../DimensionDataCloudControlHttpApiModule.java | 23 +++++- .../cloudcontrol/domain/Datacenter.java | 1 + .../domain/PaginatedCollection.java | 1 - .../features/InfrastructureApi.java | 38 +++++----- .../cloudcontrol/features/ServerApi.java | 21 +++--- .../cloudcontrol/features/ServerImageApi.java | 31 ++++---- .../filters/DatacenterIdFilter.java | 49 ------------- .../DatacenterIdListDatacentersFilter.java | 49 ------------- .../options/DatacenterIdListFilters.java | 75 +++++++++++++++++++ .../cloudcontrol/options/IdListFilters.java | 76 ++++++++++++++++++++ .../cloudcontrol/options/PaginationOptions.java | 22 +++++- .../suppliers/RegionsToApiEndpoints.java | 50 +++++++++++++ .../features/InfrastructureApiLiveTest.java | 7 +- .../features/InfrastructureApiMockTest.java | 51 +++++++------ .../features/NetworkApiLiveTest.java | 12 ++-- .../features/ServerApiMockTest.java | 21 +++--- .../features/ServerImageApiMockTest.java | 55 +++++++------- ...aseDimensionDataCloudControlApiLiveTest.java | 28 ++++---- .../BaseDimensionDataCloudControlMockTest.java | 29 +++++--- .../options/DatacenterIdListFiltersTest.java | 57 +++++++++++++++ .../cloudcontrol/options/IdListFiltersTest.java | 57 +++++++++++++++ 23 files changed, 543 insertions(+), 239 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/pom.xml ---------------------------------------------------------------------- diff --git a/dimensiondata/pom.xml b/dimensiondata/pom.xml index 21995aa..0d98756 100644 --- a/dimensiondata/pom.xml +++ b/dimensiondata/pom.xml @@ -145,7 +145,6 @@ <test.dimensiondata-cloudcontrol.credential> ${test.dimensiondata-cloudcontrol.credential} </test.dimensiondata-cloudcontrol.credential> - <jclouds.zones>NA9</jclouds.zones> </systemPropertyVariables> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlProviderMetadata.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlProviderMetadata.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlProviderMetadata.java index fd672a3..f25cd15 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlProviderMetadata.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlProviderMetadata.java @@ -23,6 +23,11 @@ import org.jclouds.providers.internal.BaseProviderMetadata; import java.net.URI; import java.util.Properties; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE; + /** * Implementation of {@link ProviderMetadata} for DimensionData CloudController. */ @@ -42,12 +47,31 @@ public class DimensionDataCloudControlProviderMetadata extends BaseProviderMetad super(builder()); } - public DimensionDataCloudControlProviderMetadata(Builder builder) { + public DimensionDataCloudControlProviderMetadata(final Builder builder) { super(builder); } public static Properties defaultProperties() { Properties properties = DimensionDataCloudControlApiMetadata.defaultProperties(); + properties.setProperty(PROPERTY_REGIONS, "na,eu,au,mea,ap,canada"); + properties.setProperty(PROPERTY_REGION + ".na.zones", "NA9,NA12"); + properties.setProperty(PROPERTY_ZONE + "NA9" + ISO3166_CODES, "US-VA"); + properties.setProperty(PROPERTY_ZONE + "NA12" + ISO3166_CODES, "US-CA"); + properties.setProperty(PROPERTY_REGION + ".eu.zones", "EU6,EU7,EU8"); + properties.setProperty(PROPERTY_ZONE + "EU6" + ISO3166_CODES, "DE-HE"); + properties.setProperty(PROPERTY_ZONE + "EU7" + ISO3166_CODES, "NL-NH"); + properties.setProperty(PROPERTY_ZONE + "EU8" + ISO3166_CODES, "BE-BRU"); + properties.setProperty(PROPERTY_REGION + ".au.zones", "AU9,AU10,AU11"); + properties.setProperty(PROPERTY_ZONE + "AU9" + ISO3166_CODES, "AU-NSW"); + properties.setProperty(PROPERTY_ZONE + "AU10" + ISO3166_CODES, "AU-VIC"); + properties.setProperty(PROPERTY_ZONE + "AU11" + ISO3166_CODES, "NZ-WKO"); + properties.setProperty(PROPERTY_REGION + ".mea.zones", "AF3"); + properties.setProperty(PROPERTY_ZONE + "AF3" + ISO3166_CODES, "ZA-GT"); + properties.setProperty(PROPERTY_REGION + ".ap.zones", "AP4,AP5"); + properties.setProperty(PROPERTY_ZONE + "AP4" + ISO3166_CODES, "JP-13"); + properties.setProperty(PROPERTY_ZONE + "AP5" + ISO3166_CODES, "HK"); + properties.setProperty(PROPERTY_REGION + ".canada.zones", "CA2"); + properties.setProperty(PROPERTY_ZONE + "CA2" + ISO3166_CODES, "CA-ON"); return properties; } @@ -68,7 +92,7 @@ public class DimensionDataCloudControlProviderMetadata extends BaseProviderMetad } @Override - public Builder fromProviderMetadata(ProviderMetadata in) { + public Builder fromProviderMetadata(final ProviderMetadata in) { super.fromProviderMetadata(in); return this; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlHttpApiModule.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlHttpApiModule.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlHttpApiModule.java index 0c138e8..8a5af41 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlHttpApiModule.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlHttpApiModule.java @@ -18,13 +18,22 @@ package org.jclouds.dimensiondata.cloudcontrol.config; import com.google.common.base.Supplier; import com.google.inject.Provides; +import com.google.inject.Scopes; import org.jclouds.collect.Memoized; import org.jclouds.dimensiondata.cloudcontrol.DimensionDataCloudControlApi; import org.jclouds.dimensiondata.cloudcontrol.handlers.DimensionDataCloudControlErrorHandler; +import org.jclouds.dimensiondata.cloudcontrol.suppliers.RegionsToApiEndpoints; import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.annotation.ClientError; import org.jclouds.http.annotation.Redirection; import org.jclouds.http.annotation.ServerError; +import org.jclouds.location.suppliers.ImplicitLocationSupplier; +import org.jclouds.location.suppliers.RegionIdToURISupplier; +import org.jclouds.location.suppliers.ZoneIdToURISupplier; +import org.jclouds.location.suppliers.ZoneIdsSupplier; +import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI; +import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues; +import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.rest.config.HttpApiModule; @@ -41,6 +50,15 @@ import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; public class DimensionDataCloudControlHttpApiModule extends HttpApiModule<DimensionDataCloudControlApi> { @Override + protected void installLocations() { + super.installLocations(); + bind(RegionIdToURISupplier.class).to(RegionsToApiEndpoints.class).in(Scopes.SINGLETON); + bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON); + bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON); + bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Scopes.SINGLETON); + } + + @Override protected void bindErrorHandlers() { bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(DimensionDataCloudControlErrorHandler.class); bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(DimensionDataCloudControlErrorHandler.class); @@ -50,8 +68,9 @@ public class DimensionDataCloudControlHttpApiModule extends HttpApiModule<Dimens @Provides @Singleton @Memoized - public final Supplier<String> getOrganisationIdForAccount(AtomicReference<AuthorizationException> authException, - @Named(PROPERTY_SESSION_INTERVAL) long seconds, DimensionDataCloudControlApi api) { + public final Supplier<String> getOrganisationIdForAccount( + final AtomicReference<AuthorizationException> authException, + @Named(PROPERTY_SESSION_INTERVAL) final long seconds, final DimensionDataCloudControlApi api) { return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier .create(authException, new OrganisationIdForAccount(api), seconds, TimeUnit.SECONDS); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Datacenter.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Datacenter.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Datacenter.java index c331fda..639af58 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Datacenter.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Datacenter.java @@ -38,6 +38,7 @@ public abstract class Datacenter { public abstract String city(); + @Nullable public abstract String state(); public abstract String country(); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/PaginatedCollection.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/PaginatedCollection.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/PaginatedCollection.java index d8eca4d..f7d62e3 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/PaginatedCollection.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/PaginatedCollection.java @@ -100,5 +100,4 @@ public class PaginatedCollection<T> extends IterableWithMarker<T> { private Object toPaginationOptions(Integer pageNumber) { return PaginationOptions.Builder.pageNumber(pageNumber); } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApi.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApi.java index a2debef..2d76048 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApi.java @@ -29,8 +29,9 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.Datacenters; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystems; import org.jclouds.dimensiondata.cloudcontrol.domain.PaginatedCollection; -import org.jclouds.dimensiondata.cloudcontrol.filters.DatacenterIdListDatacentersFilter; import org.jclouds.dimensiondata.cloudcontrol.filters.OrganisationIdFilter; +import org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters; +import org.jclouds.dimensiondata.cloudcontrol.options.IdListFilters; import org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.functions.ParseJson; @@ -45,9 +46,7 @@ import javax.inject.Named; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; -import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import java.util.Set; @RequestFilters({ BasicAuthentication.class, OrganisationIdFilter.class }) @Consumes(MediaType.APPLICATION_JSON) @@ -58,16 +57,14 @@ public interface InfrastructureApi { @GET @Path("/datacenter") @ResponseParser(ParseDatacenters.class) - @RequestFilters(DatacenterIdListDatacentersFilter.class) @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) - PaginatedCollection<Datacenter> listDatacenters(PaginationOptions options); + PaginatedCollection<Datacenter> listDatacenters(IdListFilters idListFilters); @Named("infrastructure:datacenter") @GET @Path("/datacenter") @Transform(ParseDatacenters.ToPagedIterable.class) @ResponseParser(ParseDatacenters.class) - @RequestFilters(DatacenterIdListDatacentersFilter.class) @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) PagedIterable<Datacenter> listDatacenters(); @@ -76,8 +73,7 @@ public interface InfrastructureApi { @Path("/operatingSystem") @ResponseParser(ParseOperatingSystems.class) @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) - PaginatedCollection<OperatingSystem> listOperatingSystems(@QueryParam("datacenterId") Set<String> datacenterId, - PaginationOptions options); + PaginatedCollection<OperatingSystem> listOperatingSystems(DatacenterIdListFilters datacenterIdListFilters); @Named("infrastructure:operatingSystem") @GET @@ -85,12 +81,12 @@ public interface InfrastructureApi { @Transform(ParseOperatingSystems.ToPagedIterable.class) @ResponseParser(ParseOperatingSystems.class) @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable<OperatingSystem> listOperatingSystems(@QueryParam("datacenterId") Set<String> datacenterId); + PagedIterable<OperatingSystem> listOperatingSystems(); final class ParseDatacenters extends ParseJson<Datacenters> { @Inject - ParseDatacenters(Json json) { + ParseDatacenters(final Json json) { super(json, TypeLiteral.get(Datacenters.class)); } @@ -99,17 +95,19 @@ public interface InfrastructureApi { private DimensionDataCloudControlApi api; @Inject - ToPagedIterable(DimensionDataCloudControlApi api) { + ToPagedIterable(final DimensionDataCloudControlApi api) { this.api = api; } @Override - protected Function<Object, IterableWithMarker<Datacenter>> markerToNextForArg0(Optional<Object> arg) { + protected Function<Object, IterableWithMarker<Datacenter>> markerToNextForArg0(final Optional<Object> arg) { return new Function<Object, IterableWithMarker<Datacenter>>() { @Override public IterableWithMarker<Datacenter> apply(Object input) { - PaginationOptions paginationOptions = PaginationOptions.class.cast(input); - return api.getInfrastructureApi().listDatacenters(paginationOptions); + IdListFilters idListFilters = arg.isPresent() ? + ((IdListFilters) arg.get()).paginationOptions(PaginationOptions.class.cast(input)) : + IdListFilters.Builder.paginationOptions(PaginationOptions.class.cast(input)); + return api.getInfrastructureApi().listDatacenters(idListFilters); } }; } @@ -119,7 +117,7 @@ public interface InfrastructureApi { final class ParseOperatingSystems extends ParseJson<OperatingSystems> { @Inject - ParseOperatingSystems(Json json) { + ParseOperatingSystems(final Json json) { super(json, TypeLiteral.get(OperatingSystems.class)); } @@ -128,18 +126,20 @@ public interface InfrastructureApi { private DimensionDataCloudControlApi api; @Inject - ToPagedIterable(DimensionDataCloudControlApi api) { + ToPagedIterable(final DimensionDataCloudControlApi api) { this.api = api; } @Override protected Function<Object, IterableWithMarker<OperatingSystem>> markerToNextForArg0( - final Optional<Object> arg) { + final Optional<Object> arg0) { return new Function<Object, IterableWithMarker<OperatingSystem>>() { @Override public IterableWithMarker<OperatingSystem> apply(Object input) { - PaginationOptions paginationOptions = PaginationOptions.class.cast(input); - return api.getInfrastructureApi().listOperatingSystems((Set<String>) arg.get(), paginationOptions); + DatacenterIdListFilters datacenterIdListFilters = arg0.isPresent() ? + ((DatacenterIdListFilters) arg0.get()).paginationOptions(PaginationOptions.class.cast(input)) : + DatacenterIdListFilters.Builder.paginationOptions(PaginationOptions.class.cast(input)); + return api.getInfrastructureApi().listOperatingSystems(datacenterIdListFilters); } }; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java index 5ec225c..6338258 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java @@ -31,8 +31,8 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.Server; import org.jclouds.dimensiondata.cloudcontrol.domain.Servers; import org.jclouds.dimensiondata.cloudcontrol.domain.options.CloneServerOptions; import org.jclouds.dimensiondata.cloudcontrol.domain.options.CreateServerOptions; -import org.jclouds.dimensiondata.cloudcontrol.filters.DatacenterIdFilter; import org.jclouds.dimensiondata.cloudcontrol.filters.OrganisationIdFilter; +import org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters; import org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions; import org.jclouds.dimensiondata.cloudcontrol.utils.ParseResponse; import org.jclouds.http.filters.BasicAuthentication; @@ -69,7 +69,7 @@ public interface ServerApi { @Path("/server") @ResponseParser(ParseServers.class) @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) - PaginatedCollection<Server> listServers(PaginationOptions options); + PaginatedCollection<Server> listServers(DatacenterIdListFilters datacenterIdListFilters); @Named("server:list") @GET @@ -77,7 +77,6 @@ public interface ServerApi { @Transform(ParseServers.ToPagedIterable.class) @ResponseParser(ParseServers.class) @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) - @RequestFilters({ DatacenterIdFilter.class }) PagedIterable<Server> listServers(); @Named("server:get") @@ -164,7 +163,7 @@ public interface ServerApi { final class ParseServers extends ParseJson<Servers> { @Inject - ParseServers(Json json) { + ParseServers(final Json json) { super(json, TypeLiteral.get(Servers.class)); } @@ -173,17 +172,19 @@ public interface ServerApi { private DimensionDataCloudControlApi api; @Inject - ToPagedIterable(DimensionDataCloudControlApi api) { + ToPagedIterable(final DimensionDataCloudControlApi api) { this.api = api; } @Override - protected Function<Object, IterableWithMarker<Server>> markerToNextForArg0(Optional<Object> arg0) { + protected Function<Object, IterableWithMarker<Server>> markerToNextForArg0(final Optional<Object> arg0) { return new Function<Object, IterableWithMarker<Server>>() { @Override public IterableWithMarker<Server> apply(Object input) { - PaginationOptions paginationOptions = PaginationOptions.class.cast(input); - return api.getServerApi().listServers(paginationOptions); + DatacenterIdListFilters datacenterIdListFilters = arg0.isPresent() ? + ((DatacenterIdListFilters) arg0.get()).paginationOptions(PaginationOptions.class.cast(input)) : + DatacenterIdListFilters.Builder.paginationOptions(PaginationOptions.class.cast(input)); + return api.getServerApi().listServers(datacenterIdListFilters); } }; } @@ -195,7 +196,7 @@ public interface ServerApi { final class ServerId extends ParseResponse { @Inject - ServerId(Json json) { + ServerId(final Json json) { super(json, "serverId"); } } @@ -204,7 +205,7 @@ public interface ServerApi { final class ImageId extends ParseResponse { @Inject - ImageId(Json json) { + ImageId(final Json json) { super(json, "imageId"); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApi.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApi.java index 2736a3a..57c560c 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApi.java @@ -29,8 +29,8 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.CustomerImages; import org.jclouds.dimensiondata.cloudcontrol.domain.OsImage; import org.jclouds.dimensiondata.cloudcontrol.domain.OsImages; import org.jclouds.dimensiondata.cloudcontrol.domain.PaginatedCollection; -import org.jclouds.dimensiondata.cloudcontrol.filters.DatacenterIdFilter; import org.jclouds.dimensiondata.cloudcontrol.filters.OrganisationIdFilter; +import org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters; import org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.functions.ParseJson; @@ -57,16 +57,14 @@ public interface ServerImageApi { @GET @Path("/osImage") @ResponseParser(ParseOsImages.class) - @RequestFilters(DatacenterIdFilter.class) @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) - PaginatedCollection<OsImage> listOsImages(PaginationOptions options); + PaginatedCollection<OsImage> listOsImages(DatacenterIdListFilters datacenterIdListFilters); @Named("image:listOsImages") @GET @Path("/osImage") @Transform(ParseOsImages.ToPagedIterable.class) @ResponseParser(ParseOsImages.class) - @RequestFilters(DatacenterIdFilter.class) @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) PagedIterable<OsImage> listOsImages(); @@ -74,16 +72,14 @@ public interface ServerImageApi { @GET @Path("/customerImage") @ResponseParser(ParseCustomerImages.class) - @RequestFilters(DatacenterIdFilter.class) @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) - PaginatedCollection<CustomerImage> listCustomerImages(PaginationOptions options); + PaginatedCollection<CustomerImage> listCustomerImages(DatacenterIdListFilters datacenterIdListFilters); @Named("image:listCustomerImages") @GET @Path("/customerImage") @Transform(ParseCustomerImages.ToPagedIterable.class) @ResponseParser(ParseCustomerImages.class) - @RequestFilters(DatacenterIdFilter.class) @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) PagedIterable<CustomerImage> listCustomerImages(); @@ -111,17 +107,19 @@ public interface ServerImageApi { private DimensionDataCloudControlApi api; @Inject - ToPagedIterable(DimensionDataCloudControlApi api) { + ToPagedIterable(final DimensionDataCloudControlApi api) { this.api = api; } @Override - protected Function<Object, IterableWithMarker<OsImage>> markerToNextForArg0(Optional<Object> arg0) { + protected Function<Object, IterableWithMarker<OsImage>> markerToNextForArg0(final Optional<Object> arg0) { return new Function<Object, IterableWithMarker<OsImage>>() { @Override public IterableWithMarker<OsImage> apply(Object input) { - PaginationOptions paginationOptions = PaginationOptions.class.cast(input); - return api.getServerImageApi().listOsImages(paginationOptions); + DatacenterIdListFilters datacenterIdListFilters = arg0.isPresent() ? + ((DatacenterIdListFilters) arg0.get()).paginationOptions(PaginationOptions.class.cast(input)) : + DatacenterIdListFilters.Builder.paginationOptions(PaginationOptions.class.cast(input)); + return api.getServerImageApi().listOsImages(datacenterIdListFilters); } }; } @@ -140,17 +138,20 @@ public interface ServerImageApi { private DimensionDataCloudControlApi api; @Inject - ToPagedIterable(DimensionDataCloudControlApi api) { + ToPagedIterable(final DimensionDataCloudControlApi api) { this.api = api; } @Override - protected Function<Object, IterableWithMarker<CustomerImage>> markerToNextForArg0(Optional<Object> arg0) { + protected Function<Object, IterableWithMarker<CustomerImage>> markerToNextForArg0( + final Optional<Object> arg0) { return new Function<Object, IterableWithMarker<CustomerImage>>() { @Override public IterableWithMarker<CustomerImage> apply(Object input) { - PaginationOptions paginationOptions = PaginationOptions.class.cast(input); - return api.getServerImageApi().listCustomerImages(paginationOptions); + DatacenterIdListFilters datacenterIdListFilters = arg0.isPresent() ? + ((DatacenterIdListFilters) arg0.get()).paginationOptions(PaginationOptions.class.cast(input)) : + DatacenterIdListFilters.Builder.paginationOptions(PaginationOptions.class.cast(input)); + return api.getServerImageApi().listCustomerImages(datacenterIdListFilters); } }; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdFilter.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdFilter.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdFilter.java deleted file mode 100644 index 41dab36..0000000 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF 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.dimensiondata.cloudcontrol.filters; - -import com.google.common.base.Supplier; -import org.jclouds.http.HttpException; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpRequestFilter; -import org.jclouds.location.Zone; - -import javax.inject.Inject; -import java.util.Set; - -/** - * Adds set of Datacenter IDs as set in jclouds.zones JVM property. - */ -public class DatacenterIdFilter implements HttpRequestFilter { - - private final Supplier<Set<String>> datacenterIdsSupplier; - - @Inject - DatacenterIdFilter(@Zone Supplier<Set<String>> datacenterIdsSupplier) { - this.datacenterIdsSupplier = datacenterIdsSupplier; - } - - @Override - public HttpRequest filter(HttpRequest request) throws HttpException { - Set<String> datacenterIds = datacenterIdsSupplier.get(); - if (datacenterIds != null && !datacenterIds.isEmpty()) { - return request.toBuilder().addQueryParam("datacenterId", datacenterIds).build(); - } else { - return request; - } - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdListDatacentersFilter.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdListDatacentersFilter.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdListDatacentersFilter.java deleted file mode 100644 index a805867..0000000 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/filters/DatacenterIdListDatacentersFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF 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.dimensiondata.cloudcontrol.filters; - -import com.google.common.base.Supplier; -import org.jclouds.http.HttpException; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpRequestFilter; -import org.jclouds.location.Zone; - -import javax.inject.Inject; -import java.util.Set; - -/** - * Adds set of Datacenter IDs as set in jclouds.zones JVM property. - */ -public class DatacenterIdListDatacentersFilter implements HttpRequestFilter { - - private final Supplier<Set<String>> datacenterIdsSupplier; - - @Inject - DatacenterIdListDatacentersFilter(@Zone Supplier<Set<String>> datacenterIdsSupplier) { - this.datacenterIdsSupplier = datacenterIdsSupplier; - } - - @Override - public HttpRequest filter(HttpRequest request) throws HttpException { - Set<String> datacenterIds = datacenterIdsSupplier.get(); - if (datacenterIds != null && !datacenterIds.isEmpty()) { - return request.toBuilder().addQueryParam("id", datacenterIds).build(); - } else { - return request; - } - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFilters.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFilters.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFilters.java new file mode 100644 index 0000000..2ec130c --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFilters.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.options; + +import org.jclouds.http.options.BaseHttpRequestOptions; + +import java.util.Collection; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class DatacenterIdListFilters extends BaseHttpRequestOptions { + + private DatacenterIdListFilters() { + } + + public DatacenterIdListFilters datacenterIds(final String... datacenterIds) { + for (String datacenterId : datacenterIds) { + this.queryParameters.put("datacenterId", checkNotNull(datacenterId, "datacenterId")); + } + return this; + } + + public DatacenterIdListFilters datacenterIds(final Collection<String> datacenterIds) { + for (String datacenterId : datacenterIds) { + this.queryParameters.put("datacenterId", checkNotNull(datacenterId, "datacenterId")); + } + return this; + } + + public DatacenterIdListFilters paginationOptions(final PaginationOptions paginationOptions) { + this.queryParameters.putAll(paginationOptions.buildQueryParameters()); + return this; + } + + public static class Builder { + + /** + * @see DatacenterIdListFilters#datacenterIds(Collection<String>) + */ + public static DatacenterIdListFilters datacenterId(final Collection<String> datacenterIds) { + DatacenterIdListFilters options = new DatacenterIdListFilters(); + return options.datacenterIds(datacenterIds); + } + + /** + * @see DatacenterIdListFilters#datacenterIds(String...) + */ + public static DatacenterIdListFilters datacenterId(final String... ids) { + DatacenterIdListFilters options = new DatacenterIdListFilters(); + return options.datacenterIds(ids); + } + + /** + * @see DatacenterIdListFilters#paginationOptions(PaginationOptions) + */ + public static DatacenterIdListFilters paginationOptions(PaginationOptions paginationOptions) { + DatacenterIdListFilters options = new DatacenterIdListFilters(); + return options.paginationOptions(paginationOptions); + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFilters.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFilters.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFilters.java new file mode 100644 index 0000000..3f91c39 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFilters.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.options; + +import org.jclouds.http.options.BaseHttpRequestOptions; + +import java.util.Collection; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class IdListFilters extends BaseHttpRequestOptions { + + private IdListFilters() { + } + + public IdListFilters ids(final String... ids) { + for (String id : ids) { + this.queryParameters.put("id", checkNotNull(id, "id")); + } + return this; + } + + public IdListFilters ids(final Collection<String> ids) { + for (String id : ids) { + this.queryParameters.put("id", checkNotNull(id, "id")); + } + return this; + } + + public IdListFilters paginationOptions(final PaginationOptions paginationOptions) { + this.queryParameters.putAll(paginationOptions.buildQueryParameters()); + return this; + } + + public static class Builder { + + /** + * @see IdListFilters#ids(Collection<String>) + */ + public static IdListFilters ids(final Collection<String> ids) { + IdListFilters options = new IdListFilters(); + return options.ids(ids); + } + + /** + * @see IdListFilters#ids(String...) + */ + public static IdListFilters ids(final String... ids) { + IdListFilters options = new IdListFilters(); + return options.ids(ids); + } + + /** + * @see IdListFilters#paginationOptions(PaginationOptions) + */ + public static IdListFilters paginationOptions(PaginationOptions paginationOptions) { + IdListFilters options = new IdListFilters(); + return options.paginationOptions(paginationOptions); + } + } +} + http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/PaginationOptions.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/PaginationOptions.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/PaginationOptions.java index 06bd478..a989e0f 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/PaginationOptions.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/options/PaginationOptions.java @@ -23,23 +23,39 @@ import static com.google.common.base.Preconditions.checkState; public class PaginationOptions extends BaseHttpRequestOptions { + public static final String PAGE_NUMBER = "pageNumber"; + public static final String ORDER_BY = "orderBy"; + public static final String PAGE_SIZE = "pageSize"; + public PaginationOptions pageNumber(int pageNumber) { - this.queryParameters.put("pageNumber", Integer.toString(pageNumber)); + this.queryParameters.put(PAGE_NUMBER, Integer.toString(pageNumber)); return this; } + public String pageNumber() { + return getFirstQueryOrNull(PAGE_NUMBER); + } + public PaginationOptions orderBy(String orderBy) { - this.queryParameters.put("orderBy", checkNotNull(orderBy, "orderBy")); + this.queryParameters.put(ORDER_BY, checkNotNull(orderBy, ORDER_BY)); return this; } + public String orderBy() { + return getFirstQueryOrNull(ORDER_BY); + } + public PaginationOptions pageSize(int pageSize) { checkState(pageSize >= 0, "pageSize must be >= 0"); checkState(pageSize <= 10000, "limit must be <= 10000"); - queryParameters.put("pageSize", Integer.toString(pageSize)); + queryParameters.put(PAGE_SIZE, Integer.toString(pageSize)); return this; } + public String pageSize() { + return getFirstQueryOrNull(PAGE_SIZE); + } + public static class Builder { /** http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/suppliers/RegionsToApiEndpoints.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/suppliers/RegionsToApiEndpoints.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/suppliers/RegionsToApiEndpoints.java new file mode 100644 index 0000000..179d42b --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/suppliers/RegionsToApiEndpoints.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.suppliers; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import org.jclouds.location.Region; +import org.jclouds.location.suppliers.RegionIdToURISupplier; + +import javax.inject.Inject; +import java.net.URI; +import java.util.Map; +import java.util.Set; + +public class RegionsToApiEndpoints implements RegionIdToURISupplier { + + private static final String DIMENSION_DATA_API_URL_TEMPLATE = "https://api-%s.dimensiondata.com"; + private final Supplier<Set<String>> regionIds; + + @Inject + RegionsToApiEndpoints(@Region Supplier<Set<String>> regionIds) { + this.regionIds = regionIds; + } + + @Override + public Map<String, Supplier<URI>> get() { + Builder<String, Supplier<URI>> regionToEndpoint = ImmutableMap.builder(); + for (String region : regionIds.get()) { + URI endpoint = URI.create(String.format(DIMENSION_DATA_API_URL_TEMPLATE, region)); + regionToEndpoint.put(region, Suppliers.ofInstance(endpoint)); + } + return regionToEndpoint.build(); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiLiveTest.java index 640ec8b..b4fd485 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiLiveTest.java @@ -17,14 +17,16 @@ package org.jclouds.dimensiondata.cloudcontrol.features; import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; import org.jclouds.dimensiondata.cloudcontrol.domain.Datacenter; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlApiLiveTest; import org.testng.annotations.Test; -import java.util.Set; import java.util.HashSet; +import java.util.Set; +import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.datacenterId; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -52,7 +54,8 @@ public class InfrastructureApiLiveTest extends BaseDimensionDataCloudControlApiL for (Datacenter dc : getDatacenters()) { datacenterIds.add(dc.id()); } - FluentIterable<OperatingSystem> operatingSystems = api().listOperatingSystems(datacenterIds).concat(); + ImmutableList<OperatingSystem> operatingSystems = api().listOperatingSystems(datacenterId(datacenterIds)) + .toList(); assertNotNull(operatingSystems); assertTrue(!operatingSystems.isEmpty()); for (OperatingSystem operatingSystem : operatingSystems) { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiMockTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiMockTest.java index 2658d91..78d669b 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/InfrastructureApiMockTest.java @@ -16,10 +16,10 @@ */ package org.jclouds.dimensiondata.cloudcontrol.features; -import com.google.common.collect.Sets; import org.jclouds.dimensiondata.cloudcontrol.domain.Datacenter; import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; import org.jclouds.dimensiondata.cloudcontrol.internal.BaseAccountAwareCloudControlMockTest; +import org.jclouds.dimensiondata.cloudcontrol.options.IdListFilters; import org.jclouds.http.Uris; import org.testng.annotations.Test; @@ -35,49 +35,62 @@ import static org.testng.Assert.assertTrue; @Test(groups = "unit", testName = "InfrastructureApiMockTest", singleThreaded = true) public class InfrastructureApiMockTest extends BaseAccountAwareCloudControlMockTest { + private static final String DATACENTER_ID_QUERY_PARAM = "id"; + public void testListDatacenters() throws Exception { server.enqueue(jsonResponse("/datacenters.json")); - Iterable<Datacenter> datacenters = api.getInfrastructureApi().listDatacenters().concat(); + Iterable<Datacenter> listedDatacenters = api.getInfrastructureApi().listDatacenters().concat(); - assertEquals(size(datacenters), 1); // Force the PagedIterable to advance + assertEquals(size(listedDatacenters), 1); // Force the PagedIterable to advance assertEquals(server.getRequestCount(), 2); - assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersUriBuilder()).toString()); + assertSent(HttpMethod.GET, expectedListDatacentersUriBuilder().toString()); } public void testListDatacentersWithPagination() throws Exception { server.enqueue(jsonResponse("/datacenters-page1.json")); server.enqueue(jsonResponse("/datacenters-page2.json")); - Iterable<Datacenter> datacenters = api.getInfrastructureApi().listDatacenters().concat(); + Iterable<Datacenter> listedDatacenters = api.getInfrastructureApi().listDatacenters().concat(); + + consumeIterableAndAssertAdditionalPagesRequested(listedDatacenters, 2, 1); + + assertSent(HttpMethod.GET, expectedListDatacentersUriBuilder().toString()); + assertSent(HttpMethod.GET, + + expectedListDatacentersWithPaginationUriBuilder(2).toString()); + } - consumeIterableAndAssertAdditionalPagesRequested(datacenters, 2, 1); + public void testListDatacentersWithDatcenterFiltering() throws Exception { + server.enqueue(jsonResponse("/datacenters.json")); + Iterable<Datacenter> listedDatacenters = api.getInfrastructureApi() + .listDatacenters(IdListFilters.Builder.ids(this.datacenters)); + + assertEquals(size(listedDatacenters), 1); // Force the PagedIterable to advance + assertEquals(server.getRequestCount(), 2); - assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersUriBuilder()).toString()); - assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersWithPaginationUriBuilder(2)).toString()); + assertSent(HttpMethod.GET, + addZonesToUriBuilder(DATACENTER_ID_QUERY_PARAM, expectedListDatacentersUriBuilder()).toString()); } public void testListDatacenters404() throws Exception { server.enqueue(response404()); assertTrue(api.getInfrastructureApi().listDatacenters().concat().isEmpty()); - assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersUriBuilder()).toString()); + assertSent(HttpMethod.GET, expectedListDatacentersUriBuilder().toString()); } private Uris.UriBuilder expectedListDatacentersUriBuilder() { - Uris.UriBuilder uriBuilder = Uris - .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/infrastructure/datacenter"); - return addZonesToUriBuilder(uriBuilder); + return Uris.uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/infrastructure/datacenter"); } private Uris.UriBuilder expectedListDatacentersWithPaginationUriBuilder(int pageNumber) { Uris.UriBuilder uriBuilder = Uris .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/infrastructure/datacenter"); - return addZonesToUriBuilder(addPageNumberToUriBuilder(uriBuilder, pageNumber, true)); + return addPageNumberToUriBuilder(uriBuilder, pageNumber, false); } public void testListOperatingSystems() throws Exception { server.enqueue(jsonResponse("/operatingSystems.json")); - Iterable<OperatingSystem> operatingSystems = api.getInfrastructureApi() - .listOperatingSystems(Sets.newHashSet("NA1", "NA9")).concat(); + Iterable<OperatingSystem> operatingSystems = api.getInfrastructureApi().listOperatingSystems().concat(); assertEquals(size(operatingSystems), 33); assertEquals(server.getRequestCount(), 2); @@ -88,8 +101,7 @@ public class InfrastructureApiMockTest extends BaseAccountAwareCloudControlMockT public void testListOperatingSystemsWithPagination() throws Exception { server.enqueue(jsonResponse("/operatingSystems-page1.json")); server.enqueue(jsonResponse("/operatingSystems-page2.json")); - Iterable<OperatingSystem> operatingSystems = api.getInfrastructureApi() - .listOperatingSystems(Sets.newHashSet("NA1", "NA9")).concat(); + Iterable<OperatingSystem> operatingSystems = api.getInfrastructureApi().listOperatingSystems().concat(); consumeIterableAndAssertAdditionalPagesRequested(operatingSystems, 33, 1); @@ -100,20 +112,19 @@ public class InfrastructureApiMockTest extends BaseAccountAwareCloudControlMockT public void testListOperatingSystems404() throws Exception { server.enqueue(response404()); - assertTrue(api.getInfrastructureApi().listOperatingSystems(Sets.newHashSet("NA1", "NA9")).concat().isEmpty()); + assertTrue(api.getInfrastructureApi().listOperatingSystems().concat().isEmpty()); assertSent(HttpMethod.GET, expectedListOperatingSystemsUriBuilder().toString()); } private Uris.UriBuilder expectedListOperatingSystemsUriBuilder() { Uris.UriBuilder uriBuilder = Uris .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/infrastructure/operatingSystem"); - uriBuilder.addQuery("datacenterId", "NA1", "NA9"); return uriBuilder; } private Uris.UriBuilder expectedListOperatingSystemsWithPaginationUriBuilder(int pageNumber) { Uris.UriBuilder uriBuilder = Uris .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/infrastructure/operatingSystem"); - return addPageNumberToUriBuilder(uriBuilder.addQuery("datacenterId", "NA1", "NA9"), pageNumber, false); + return addPageNumberToUriBuilder(uriBuilder, pageNumber, false); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java index b8e1c2b..020c0b2 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/NetworkApiLiveTest.java @@ -31,17 +31,17 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import java.util.List; import java.util.Date; +import java.util.List; import static org.jclouds.dimensiondata.cloudcontrol.features.NetworkApiMockTest.DEFAULT_ACTION; import static org.jclouds.dimensiondata.cloudcontrol.features.NetworkApiMockTest.DEFAULT_IP_VERSION; import static org.jclouds.dimensiondata.cloudcontrol.utils.DimensionDataCloudControlResponseUtils.generateFirewallRuleName; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; @Test(groups = "live", testName = "NetworkApiLiveTest", singleThreaded = true) public class NetworkApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest { @@ -173,7 +173,7 @@ public class NetworkApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest @Test public void testDeployNetworkDomain() { networkDomainName = NetworkApiLiveTest.class.getSimpleName() + new Date().getTime(); - networkDomainId = api().deployNetworkDomain(DATACENTERS.iterator().next(), networkDomainName, + networkDomainId = api().deployNetworkDomain(datacenters.iterator().next(), networkDomainName, NetworkApiLiveTest.class.getSimpleName() + new Date().getTime() + "description", "ESSENTIALS"); assertNotNull(networkDomainId); assertTrue(networkDomainNormalPredicate.apply(networkDomainId), @@ -182,7 +182,7 @@ public class NetworkApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest @Test(expectedExceptions = ResourceAlreadyExistsException.class) public void testDeploySameNetworkDomain() { - api().deployNetworkDomain(DATACENTERS.iterator().next(), networkDomainName, networkDomainName, "ESSENTIALS"); + api().deployNetworkDomain(datacenters.iterator().next(), networkDomainName, networkDomainName, "ESSENTIALS"); } @AfterClass http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java index f1db2d4..e396139 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java @@ -27,17 +27,16 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.options.CloneServerOptions; import org.jclouds.dimensiondata.cloudcontrol.domain.options.CreateServerOptions; import org.jclouds.dimensiondata.cloudcontrol.internal.BaseAccountAwareCloudControlMockTest; import org.jclouds.http.Uris; -import org.jclouds.location.suppliers.ZoneIdsSupplier; import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; import javax.ws.rs.HttpMethod; import java.util.List; -import java.util.Set; import static javax.ws.rs.HttpMethod.GET; import static javax.ws.rs.HttpMethod.POST; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; +import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.datacenterId; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -107,13 +106,19 @@ public class ServerApiMockTest extends BaseAccountAwareCloudControlMockTest { } } - private Uris.UriBuilder getListServerUriBuilder() { - Uris.UriBuilder uriBuilder = Uris.uriBuilder("/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server"); - Set<String> zones = ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); - for (String zone : zones) { - uriBuilder.addQuery("datacenterId", zone); + public void testListServersWithDatacenterFiltering() throws Exception { + server.enqueue(jsonResponse("/servers.json")); + List<Server> servers = serverApi().listServers(datacenterId(datacenters)).toList(); + Uris.UriBuilder uriBuilder = addZonesToUriBuilder("datacenterId", getListServerUriBuilder()); + assertSent(GET, uriBuilder.toString()); + assertEquals(servers.size(), 1); + for (Server s : servers) { + assertNotNull(s); } - return uriBuilder; + } + + private Uris.UriBuilder getListServerUriBuilder() { + return Uris.uriBuilder("/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server"); } public void testListServers_404() throws Exception { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApiMockTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApiMockTest.java index 8738903..c652423 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApiMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerImageApiMockTest.java @@ -20,13 +20,12 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.CustomerImage; import org.jclouds.dimensiondata.cloudcontrol.domain.OsImage; import org.jclouds.dimensiondata.cloudcontrol.internal.BaseAccountAwareCloudControlMockTest; import org.jclouds.http.Uris; -import org.jclouds.location.suppliers.ZoneIdsSupplier; import org.testng.annotations.Test; import javax.ws.rs.HttpMethod; -import java.util.Set; import static com.google.common.collect.Iterables.size; +import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.datacenterId; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; @@ -58,7 +57,16 @@ public class ServerImageApiMockTest extends BaseAccountAwareCloudControlMockTest assertEquals(size(osImages), 1); assertEquals(server.getRequestCount(), 2); - assertSent(HttpMethod.GET, getListOsImageUrl().toString()); + assertSent(HttpMethod.GET, getOsImageUrl().toString()); + } + + public void testListOsImageWithDatacenterIdFiltering() throws Exception { + server.enqueue(jsonResponse("/osImages.json")); + Iterable<OsImage> osImages = api.getServerImageApi().listOsImages(datacenterId(datacenters)).toList(); + assertEquals(size(osImages), 1); + assertEquals(server.getRequestCount(), 2); + + assertSent(HttpMethod.GET, addZonesToUriBuilder("datacenterId", getOsImageUrl()).toString()); } public void testListOsImageWithPagination() throws Exception { @@ -68,24 +76,15 @@ public class ServerImageApiMockTest extends BaseAccountAwareCloudControlMockTest assertNotNull(osImages); consumeIterableAndAssertAdditionalPagesRequested(osImages, 2, 1); - Uris.UriBuilder uriBuilder = getListOsImageUrl(); + Uris.UriBuilder uriBuilder = getOsImageUrl(); assertSent(HttpMethod.GET, uriBuilder.toString()); - assertSent(HttpMethod.GET, addPageNumberToUriBuilder(uriBuilder, 2, false).toString()); + assertSent(HttpMethod.GET, addPageNumberToUriBuilder(uriBuilder, 2, true).toString()); } public void testListOsImage_404() throws Exception { server.enqueue(response404()); assertTrue(api.getServerImageApi().listOsImages().concat().isEmpty()); - assertSent(HttpMethod.GET, getListOsImageUrl().toString()); - } - - private Uris.UriBuilder getListOsImageUrl() { - Uris.UriBuilder uriBuilder = getOsImageUrl(); - Set<String> zones = ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); - for (String zone : zones) { - uriBuilder.addQuery("datacenterId", zone); - } - return uriBuilder; + assertSent(HttpMethod.GET, getOsImageUrl().toString()); } public void testGetCustomerImage() throws Exception { @@ -108,7 +107,16 @@ public class ServerImageApiMockTest extends BaseAccountAwareCloudControlMockTest assertEquals(size(customerImages), 1); assertEquals(server.getRequestCount(), 2); - assertSent(HttpMethod.GET, getListCustomerImageUrl().toString()); + assertSent(HttpMethod.GET, getCustomerImageUrl().toString()); + } + + public void testListCustomerImageWithDatacenterFiltering() throws Exception { + server.enqueue(jsonResponse("/customerImages.json")); + Iterable<CustomerImage> customerImages = api.getServerImageApi().listCustomerImages(datacenterId(datacenters)); + assertEquals(size(customerImages), 1); + assertEquals(server.getRequestCount(), 2); + + assertSent(HttpMethod.GET, addZonesToUriBuilder("datacenterId", getCustomerImageUrl()).toString()); } public void testListCustomerImageWithPagination() throws Exception { @@ -118,25 +126,16 @@ public class ServerImageApiMockTest extends BaseAccountAwareCloudControlMockTest assertNotNull(customerImages); consumeIterableAndAssertAdditionalPagesRequested(customerImages, 10, 1); - Uris.UriBuilder uriBuilder = getListCustomerImageUrl(); + Uris.UriBuilder uriBuilder = getCustomerImageUrl(); assertSent(HttpMethod.GET, uriBuilder.toString()); - assertSent(HttpMethod.GET, addZonesToUriBuilder(addPageNumberToUriBuilder(uriBuilder, 2, true)).toString()); + assertSent(HttpMethod.GET, addPageNumberToUriBuilder(uriBuilder, 2, true).toString()); } public void testListCustomerImage_404() throws Exception { server.enqueue(response404()); assertTrue(api.getServerImageApi().listCustomerImages().concat().isEmpty()); - assertSent(HttpMethod.GET, getListCustomerImageUrl().toString()); - } - - private Uris.UriBuilder getListCustomerImageUrl() { - Uris.UriBuilder uriBuilder = getCustomerImageUrl(); - Set<String> zones = ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); - for (String zone : zones) { - uriBuilder.addQuery("datacenterId", zone); - } - return uriBuilder; + assertSent(HttpMethod.GET, getCustomerImageUrl().toString()); } private Uris.UriBuilder getOsImageUrl() { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java index 1cffc47..85ce632 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java @@ -40,7 +40,7 @@ import org.testng.annotations.Test; import java.util.Properties; import java.util.Set; -import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService; +import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor; import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_DELETED_PREDICATE; import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.NETWORK_DOMAIN_NORMAL_PREDICATE; import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudControlComputeServiceContextModule.SERVER_DELETED_PREDICATE; @@ -54,27 +54,18 @@ import static org.jclouds.dimensiondata.cloudcontrol.config.DimensionDataCloudCo @Test(groups = "live") public class BaseDimensionDataCloudControlApiLiveTest extends BaseApiLiveTest<DimensionDataCloudControlApi> { - private static final Set<Module> modules = ImmutableSet.<Module>of(new ExecutorServiceModule(newDirectExecutorService())); + protected ApiContext<DimensionDataCloudControlApi> ctx; + private final Set<Module> modules = ImmutableSet.<Module>of(new ExecutorServiceModule(sameThreadExecutor())); + protected Set<String> datacenters; protected static final String PREPARED_CUSTOMER_IMAGE_ID = "fb438e00-10f8-47ac-a434-f3f9461c3a76"; - protected static final String NETWORK_DOMAIN_ID = System .getProperty("networkDomainId", "690de302-bb80-49c6-b401-8c02bbefb945"); protected static final String VLAN_ID = System.getProperty("vlanId", "6b25b02e-d3a2-4e69-8ca7-9bab605deebd"); protected static final String IMAGE_ID = System.getProperty("imageId", "4c02126c-32fc-4b4c-9466-9824c1b5aa0f"); - protected static final String PREPARED_NETWORK_DOMAIN_ID = System .getProperty("networkDomainId", "d122949b-8990-46d6-98f0-91c8676fc720"); protected static final String PREPARED_PRIVATE_IPV4_ADDRESS = "10.0.0.6"; - protected static ApiContext<DimensionDataCloudControlApi> ctx; - protected static Set<String> DATACENTERS; - - @BeforeClass - public static void setUp() { - ctx = ContextBuilder.newBuilder(DimensionDataCloudControlProviderMetadata.builder().build()).credentials("", "") - .modules(modules).overrides(new Properties()).build(); - DATACENTERS = ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); - } protected static final String SERVER_ID = System.getProperty("serverId", "b1c537bb-018c-49ba-beef-e0600e948149"); protected Predicate<String> vlanDeletedPredicate; @@ -91,6 +82,17 @@ public class BaseDimensionDataCloudControlApiLiveTest extends BaseApiLiveTest<Di provider = "dimensiondata-cloudcontrol"; } + @BeforeClass + public void setUp() { + ctx = ContextBuilder.newBuilder(DimensionDataCloudControlProviderMetadata.builder().build()).credentials("", "") + .modules(modules).overrides(new Properties()).build(); + datacenters = getZones(); + } + + private Set<String> getZones() { + return ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); + } + @Override protected ApiMetadata createApiMetadata() { return new DimensionDataCloudControlApiMetadata(); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java index c22504c..72dfd2c 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java @@ -17,6 +17,7 @@ package org.jclouds.dimensiondata.cloudcontrol.internal; import com.google.common.base.Charsets; +import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.common.io.Resources; @@ -31,7 +32,8 @@ import org.jclouds.dimensiondata.cloudcontrol.DimensionDataCloudControlApi; import org.jclouds.dimensiondata.cloudcontrol.DimensionDataCloudControlProviderMetadata; import org.jclouds.http.Uris; import org.jclouds.json.Json; -import org.jclouds.location.suppliers.ZoneIdsSupplier; +import org.jclouds.location.suppliers.ImplicitRegionIdSupplier; +import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier; import org.jclouds.rest.ApiContext; import org.testng.IHookCallBack; import org.testng.IHookable; @@ -42,6 +44,7 @@ import org.testng.annotations.BeforeMethod; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import java.io.IOException; +import java.util.Map; import java.util.Properties; import java.util.Set; @@ -68,6 +71,7 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable { protected ApiContext<DimensionDataCloudControlApi> ctx; private Json json; private int assertedRequestCount; + protected Set<String> datacenters; // So that we can ignore formatting. private final JsonParser parser = new JsonParser(); @@ -77,11 +81,19 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable { server = new MockWebServer(); server.play(); ctx = ContextBuilder.newBuilder(DimensionDataCloudControlProviderMetadata.builder().build()).credentials("", "") - .endpoint(url("/caas/")).modules(modules).overrides(overrides()).build(); + .endpoint(url("/caas/")).modules(modules).overrides(new Properties()).build(); json = ctx.utils().injector().getInstance(Json.class); api = ctx.getApi(); applyAdditionalServerConfig(); assertedRequestCount = 0; + datacenters = getZones(); + } + + private Set<String> getZones() { + final String region = ctx.utils().injector().getInstance(ImplicitRegionIdSupplier.class).get(); + final Map<String, Supplier<Set<String>>> regionToZoneMap = ctx.utils().injector() + .getInstance(RegionIdToZoneIdsSupplier.class).get(); + return regionToZoneMap.get(region).get(); } /** @@ -122,10 +134,6 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable { api.close(); } - protected Properties overrides() { - return new Properties(); - } - protected String url(String path) { return server.getUrl(path).toString(); } @@ -207,16 +215,15 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable { } protected Uris.UriBuilder addPageNumberToUriBuilder(Uris.UriBuilder uriBuilder, int pageNumber, boolean clearQuery) { - if (clearQuery){ + if (clearQuery) { uriBuilder.clearQuery(); } return uriBuilder.addQuery("pageNumber", Integer.toString(pageNumber)); } - protected Uris.UriBuilder addZonesToUriBuilder(Uris.UriBuilder uriBuilder) { - Set<String> zones = ctx.utils().injector().getInstance(ZoneIdsSupplier.class).get(); - for (String zone : zones) { - uriBuilder.addQuery("datacenterId", zone); + protected Uris.UriBuilder addZonesToUriBuilder(String zoneQueryParameter, Uris.UriBuilder uriBuilder) { + for (String datacenter : datacenters) { + uriBuilder.addQuery(zoneQueryParameter, datacenter); } return uriBuilder; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFiltersTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFiltersTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFiltersTest.java new file mode 100644 index 0000000..3335f06 --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/DatacenterIdListFiltersTest.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.options; + +import org.testng.annotations.Test; + +import java.util.Collection; +import java.util.Collections; + +import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.datacenterId; +import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.paginationOptions; +import static org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions.Builder.pageNumber; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +public class DatacenterIdListFiltersTest { + + @Test + public void testDatacenterId_Varargs() { + final Collection<String> queryIds = datacenterId("A", "B").buildQueryParameters().get("datacenterId"); + assertNotNull(queryIds, "Expected to have a value for query parameter for id"); + assertEquals(queryIds.size(), 2, "Query parameter count does not match"); + assertTrue(queryIds.contains("A"), "Expected query parameter value A not found"); + assertTrue(queryIds.contains("B"), "Expected query parameter value B not found"); + } + + @Test + public void testDatacenterId_Collection() { + final DatacenterIdListFilters datacenterIdListFilters = datacenterId(Collections.singletonList("value")); + final Collection<String> id = datacenterIdListFilters.buildQueryParameters().get("datacenterId"); + assertNotNull(id, "Expected to have a value for query parameter for id"); + assertEquals("value", id.iterator().next()); + } + + @Test + public void testPaginationOptions() { + final PaginationOptions paginationOptions = pageNumber(1).pageSize(2).orderBy("orderBy"); + final DatacenterIdListFilters datacenterIdListFilters = paginationOptions(paginationOptions); + assertEquals(paginationOptions.buildQueryParameters(), datacenterIdListFilters.buildQueryParameters(), + "Query Parameters are not equal"); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5c97ea45/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFiltersTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFiltersTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFiltersTest.java new file mode 100644 index 0000000..96f502f --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/options/IdListFiltersTest.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.options; + +import org.testng.annotations.Test; + +import java.util.Collection; +import java.util.Collections; + +import static org.jclouds.dimensiondata.cloudcontrol.options.IdListFilters.Builder.ids; +import static org.jclouds.dimensiondata.cloudcontrol.options.IdListFilters.Builder.paginationOptions; +import static org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions.Builder.pageNumber; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +public class IdListFiltersTest { + + @Test + public void testIds_Varargs() { + final Collection<String> queryIds = ids().ids("A", "B").buildQueryParameters().get("id"); + assertNotNull(queryIds, "Expected to have a value for query parameter for id"); + assertEquals(queryIds.size(), 2, "Query parameter count does not match"); + assertTrue(queryIds.contains("A"), "Expected query parameter value A not found"); + assertTrue(queryIds.contains("B"), "Expected query parameter value B not found"); + } + + @Test + public void testIds_Collection() { + final IdListFilters idListFilters = ids(Collections.singletonList("datacenterId")); + final Collection<String> id = idListFilters.buildQueryParameters().get("id"); + assertNotNull(id, "Expected to have a value for query parameter for id"); + assertEquals("datacenterId", id.iterator().next()); + } + + @Test + public void testPaginationOptions() { + final PaginationOptions paginationOptions = pageNumber(1).pageSize(2).orderBy("orderBy"); + final IdListFilters idListFilters = paginationOptions(paginationOptions); + assertEquals(paginationOptions.buildQueryParameters(), idListFilters.buildQueryParameters(), + "Query Parameters are not equal"); + } +}