JCLOUDS-1406 - Add default location configuration to dimension data provider
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>
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 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 @@
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 @@
}
@Override
- public Builder fromProviderMetadata(ProviderMetadata in) {
+ public Builder fromProviderMetadata(final ProviderMetadata in) {
super.fromProviderMetadata(in);
return this;
}
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 @@
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 @@
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 @@
@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);
}
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 String city();
+ @Nullable
public abstract String state();
public abstract String country();
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 @@
private Object toPaginationOptions(Integer pageNumber) {
return PaginationOptions.Builder.pageNumber(pageNumber);
}
-
}
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.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.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 @@
@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 @@
@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 @@
@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 @@
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 @@
final class ParseOperatingSystems extends ParseJson<OperatingSystems> {
@Inject
- ParseOperatingSystems(Json json) {
+ ParseOperatingSystems(final Json json) {
super(json, TypeLiteral.get(OperatingSystems.class));
}
@@ -128,18 +126,20 @@
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);
}
};
}
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.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 @@
@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 @@
@Transform(ParseServers.ToPagedIterable.class)
@ResponseParser(ParseServers.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
- @RequestFilters({ DatacenterIdFilter.class })
PagedIterable<Server> listServers();
@Named("server:get")
@@ -164,7 +163,7 @@
final class ParseServers extends ParseJson<Servers> {
@Inject
- ParseServers(Json json) {
+ ParseServers(final Json json) {
super(json, TypeLiteral.get(Servers.class));
}
@@ -173,17 +172,19 @@
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 @@
final class ServerId extends ParseResponse {
@Inject
- ServerId(Json json) {
+ ServerId(final Json json) {
super(json, "serverId");
}
}
@@ -204,7 +205,7 @@
final class ImageId extends ParseResponse {
@Inject
- ImageId(Json json) {
+ ImageId(final Json json) {
super(json, "imageId");
}
}
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.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 @@
@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 @@
@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 @@
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 @@
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);
}
};
}
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;
- }
- }
-}
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;
- }
- }
-}
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);
+ }
+ }
+}
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);
+ }
+ }
+}
+
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 @@
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 {
/**
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();
+ }
+}
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 @@
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) {
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 @@
@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(datacenters, 2, 1);
+ consumeIterableAndAssertAdditionalPagesRequested(listedDatacenters, 2, 1);
- assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersUriBuilder()).toString());
- assertSent(HttpMethod.GET, addZonesToUriBuilder(expectedListDatacentersWithPaginationUriBuilder(2)).toString());
+ assertSent(HttpMethod.GET, expectedListDatacentersUriBuilder().toString());
+ assertSent(HttpMethod.GET,
+
+ expectedListDatacentersWithPaginationUriBuilder(2).toString());
+ }
+
+ 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(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 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 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);
}
}
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.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.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.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
@Test(groups = "live", testName = "NetworkApiLiveTest", singleThreaded = true)
public class NetworkApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest {
@@ -173,7 +173,7 @@
@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 @@
@Test(expectedExceptions = ResourceAlreadyExistsException.class)
public void testDeploySameNetworkDomain() {
- api().deployNetworkDomain(DATACENTERS.iterator().next(), networkDomainName, networkDomainName, "ESSENTIALS");
+ api().deployNetworkDomain(datacenters.iterator().next(), networkDomainName, networkDomainName, "ESSENTIALS");
}
@AfterClass
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.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 @@
}
}
- 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 {
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.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 @@
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 @@
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 @@
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 @@
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() {
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 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 @@
@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 @@
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();
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.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 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 @@
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 @@
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 @@
api.close();
}
- protected Properties overrides() {
- return new Properties();
- }
-
protected String url(String path) {
return server.getUrl(path).toString();
}
@@ -207,16 +215,15 @@
}
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;
}
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");
+ }
+}
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");
+ }
+}