You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2014/11/18 18:53:35 UTC

[16/17] jclouds git commit: JCLOUDS-774 ec2 api was ignoring the jclouds.region property, which made exceptions possible on all zone-scoped api calls.

JCLOUDS-774 ec2 api was ignoring the jclouds.region property, which made exceptions possible on all zone-scoped api calls.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/4b813ce0
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/4b813ce0
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/4b813ce0

Branch: refs/heads/1.7.x
Commit: 4b813ce096e76bc135b6d19d5c65b244954aa9a6
Parents: 95141ff
Author: Adrian Cole <ad...@gmail.com>
Authored: Sun Nov 16 14:17:16 2014 -0800
Committer: Adrian Cole <ad...@apache.org>
Committed: Tue Nov 18 09:40:38 2014 -0800

----------------------------------------------------------------------
 .../suppliers/DescribeRegionsForRegionURIs.java | 37 ++++++-----
 .../ec2/internal/BaseEC2ApiMockTest.java        | 14 +++--
 .../DescribeRegionsForRegionURIsMockTest.java   | 64 ++++++++++++++++++++
 3 files changed, 94 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/4b813ce0/apis/ec2/src/main/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIs.java
----------------------------------------------------------------------
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 d8d7a51..909faa9 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<String> 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<String, Supplier<URI>> get() {
-      Map<String, URI> regionToUris = client.describeRegions();
-      return Maps.transformValues(regionToUris, Suppliers2.<URI> ofInstanceFunction());
+      ImmutableMap.Builder<String, Supplier<URI>> result = ImmutableMap.builder();
+      for (Entry<String, URI> regionUrl : api.getAvailabilityZoneAndRegionApi().get().describeRegions().entrySet()) {
+         if (whitelistedRegionIds.isEmpty() || whitelistedRegionIds.contains(regionUrl.getKey())) {
+            result.put(regionUrl.getKey(), Suppliers.ofInstance(regionUrl.getValue()));
+         }
+      }
+      return result.build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/4b813ce0/apis/ec2/src/test/java/org/jclouds/ec2/internal/BaseEC2ApiMockTest.java
----------------------------------------------------------------------
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 7834ba0..441eec2 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<String, MockWebServer> 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<Module> modules = ImmutableSet.<Module>of(new ExecutorServiceModule(sameThreadExecutor()));
+   private final Set<Module> modules = ImmutableSet.<Module>of(
+      new ExecutorServiceModule(sameThreadExecutor(), sameThreadExecutor()));
 
    @BeforeMethod
    public void start() throws IOException {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/4b813ce0/apis/ec2/src/test/java/org/jclouds/ec2/suppliers/DescribeRegionsForRegionURIsMockTest.java
----------------------------------------------------------------------
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 0000000..ec39f66
--- /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<String, Supplier<URI>> 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<String, Supplier<URI>> 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);
+   }
+}