diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java b/apis/ec2/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java index d8d7a51dd9..909faa95b9 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java @@ -18,33 +18,40 @@ package org.jclouds.ec2.suppliers; import java.net.URI; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import javax.inject.Inject; -import javax.inject.Singleton; import org.jclouds.ec2.EC2Api; -import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi; -import org.jclouds.location.Region; import org.jclouds.location.suppliers.RegionIdToURISupplier; -import org.jclouds.util.Suppliers2; +import org.jclouds.location.suppliers.fromconfig.RegionIdsFromConfiguration; import com.google.common.base.Supplier; -import com.google.common.collect.Maps; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; -@Singleton -public class DescribeRegionsForRegionURIs implements RegionIdToURISupplier { - private final AvailabilityZoneAndRegionApi client; +/** + * Uses the {@code DescribeRegions} call to return the regions endpoints, subject to any whitelist present in the + * property {@link org.jclouds.location.reference.LocationConstants#PROPERTY_REGIONS}. + */ +public final class DescribeRegionsForRegionURIs implements RegionIdToURISupplier { + private final EC2Api api; + private final Set whitelistedRegionIds; - @Inject - public DescribeRegionsForRegionURIs(EC2Api client) { - this.client = client.getAvailabilityZoneAndRegionApi().get(); + @Inject DescribeRegionsForRegionURIs(EC2Api api, RegionIdsFromConfiguration regionIdsFromConfiguration) { + this.api = api; + this.whitelistedRegionIds = regionIdsFromConfiguration.get(); } - @Singleton - @Region @Override public Map> get() { - Map regionToUris = client.describeRegions(); - return Maps.transformValues(regionToUris, Suppliers2. ofInstanceFunction()); + ImmutableMap.Builder> result = ImmutableMap.builder(); + for (Entry regionUrl : api.getAvailabilityZoneAndRegionApi().get().describeRegions().entrySet()) { + if (whitelistedRegionIds.isEmpty() || whitelistedRegionIds.contains(regionUrl.getKey())) { + result.put(regionUrl.getKey(), Suppliers.ofInstance(regionUrl.getValue())); + } + } + return result.build(); } } diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/internal/BaseEC2ApiMockTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/internal/BaseEC2ApiMockTest.java index 7834ba0869..441eec20f8 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/internal/BaseEC2ApiMockTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/internal/BaseEC2ApiMockTest.java @@ -58,18 +58,20 @@ public class BaseEC2ApiMockTest { private Map regionToServers = Maps.newLinkedHashMap(); protected EC2Api api() { - return builder().buildApi(EC2Api.class); + return builder(new Properties()).buildApi(EC2Api.class); } - protected ContextBuilder builder() { - Properties overrides = new Properties(); + protected ContextBuilder builder(Properties overrides) { overrides.setProperty(Constants.PROPERTY_MAX_RETRIES, "1"); - return ContextBuilder.newBuilder(new EC2ApiMetadata()).credentials(ACCESS_KEY, SECRET_KEY) - .endpoint("http://localhost:" + regionToServers.get(DEFAULT_REGION).getPort()).overrides(overrides) + return ContextBuilder.newBuilder(new EC2ApiMetadata()) + .credentials(ACCESS_KEY, SECRET_KEY) + .endpoint("http://localhost:" + regionToServers.get(DEFAULT_REGION).getPort()) + .overrides(overrides) .modules(modules); } - private final Set modules = ImmutableSet.of(new ExecutorServiceModule(sameThreadExecutor())); + private final Set modules = ImmutableSet.of( + new ExecutorServiceModule(sameThreadExecutor(), sameThreadExecutor())); @BeforeMethod public void start() throws IOException { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIsMockTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIsMockTest.java new file mode 100644 index 0000000000..ec39f66e47 --- /dev/null +++ b/apis/ec2/src/test/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIsMockTest.java @@ -0,0 +1,64 @@ +/* + * 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.ec2.suppliers; + +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.net.URI; +import java.util.Map; +import java.util.Properties; + +import org.jclouds.ec2.internal.BaseEC2ApiMockTest; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; + +@Test(groups = "unit", testName = "DescribeRegionsForRegionURIsMockTest", singleThreaded = true) +public class DescribeRegionsForRegionURIsMockTest extends BaseEC2ApiMockTest { + + public void buildsUrlsForEachRegion() throws Exception { + enqueueRegions("us-east-1", "eu-central-1"); + + Map> result = supplier(new Properties()).get(); + + assertEquals(result.size(), 2); + assertNotNull(result.get("us-east-1").get()); + assertNotNull(result.get("eu-central-1").get()); + + assertPosted("us-east-1", "Action=DescribeRegions"); + } + + public void honorsRegionWhitelist() throws Exception { + enqueueRegions("us-east-1", "eu-central-1"); + + Properties overrides = new Properties(); + overrides.setProperty(PROPERTY_REGIONS, "us-east-1"); + + Map> result = supplier(overrides).get(); + + assertEquals(result.size(), 1); + assertNotNull(result.get("us-east-1").get()); + + assertPosted("us-east-1", "Action=DescribeRegions"); + } + + private DescribeRegionsForRegionURIs supplier(Properties overrides) { + return builder(overrides).buildInjector().getInstance(DescribeRegionsForRegionURIs.class); + } +}