From 6242eae0f4190cfe624fc53923e598d16552aab2 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 16 Nov 2014 10:27:50 -0800 Subject: [PATCH] JCLOUDS-774 cleanup derived location suppliers and backfill test for inconsistent region and zone mappings. --- .../RegionIdsFromRegionIdToURIKeySet.java | 22 +++--- .../ZoneIdToURIFromJoinOnRegionIdToURI.java | 32 ++++----- .../ZoneIdsFromRegionIdToZoneIdsValues.java | 27 +++----- .../derived/ZoneIdsFromZoneIdToURIKeySet.java | 17 ++--- ...oneIdToURIFromJoinOnRegionIdToURITest.java | 69 +++++++++++++++++++ 5 files changed, 110 insertions(+), 57 deletions(-) create mode 100644 core/src/test/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURITest.java diff --git a/core/src/main/java/org/jclouds/location/suppliers/derived/RegionIdsFromRegionIdToURIKeySet.java b/core/src/main/java/org/jclouds/location/suppliers/derived/RegionIdsFromRegionIdToURIKeySet.java index eb5de4aa2f..75aff2cad9 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/derived/RegionIdsFromRegionIdToURIKeySet.java +++ b/core/src/main/java/org/jclouds/location/suppliers/derived/RegionIdsFromRegionIdToURIKeySet.java @@ -16,39 +16,35 @@ */ package org.jclouds.location.suppliers.derived; +import static com.google.common.base.Throwables.propagate; + import java.lang.reflect.UndeclaredThrowableException; import java.net.URI; import java.util.Map; import java.util.Set; -import javax.inject.Singleton; - import org.jclouds.location.Region; import org.jclouds.location.suppliers.RegionIdsSupplier; import com.google.common.base.Supplier; -import com.google.common.base.Throwables; import com.google.inject.Inject; -/** - * as opposed to via properties, lets look up regions via api, as they are more likely to change - */ -@Singleton -public class RegionIdsFromRegionIdToURIKeySet implements RegionIdsSupplier { +/** As opposed to via properties, lets look up regions via api, as they are more likely to change. */ +public final class RegionIdsFromRegionIdToURIKeySet implements RegionIdsSupplier { - private final Supplier>> regionIdToURISupplier; + private final Supplier>> regionIdToURIs; @Inject - protected RegionIdsFromRegionIdToURIKeySet(@Region Supplier>> regionIdToURISupplier) { - this.regionIdToURISupplier = regionIdToURISupplier; + RegionIdsFromRegionIdToURIKeySet(@Region Supplier>> regionIdToURIs) { + this.regionIdToURIs = regionIdToURIs; } @Override public Set get() { try { - return regionIdToURISupplier.get().keySet(); + return regionIdToURIs.get().keySet(); } catch (UndeclaredThrowableException e) { - throw Throwables.propagate(e.getCause()); + throw propagate(e.getCause()); } } } diff --git a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURI.java b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURI.java index e8f85f942f..f630cd510f 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURI.java +++ b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURI.java @@ -16,13 +16,14 @@ */ package org.jclouds.location.suppliers.derived; +import static com.google.common.base.Preconditions.checkState; + 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.location.Region; import org.jclouds.location.Zone; @@ -32,31 +33,30 @@ import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; -/** - * - */ -@Singleton -public class ZoneIdToURIFromJoinOnRegionIdToURI implements ZoneIdToURISupplier { +public final class ZoneIdToURIFromJoinOnRegionIdToURI implements ZoneIdToURISupplier { - private final Supplier>> regionIdToURISupplier; - private final Supplier>>> regionIdToZoneIdsSupplier; + private final Supplier>> regionIdToURIs; + private final Supplier>>> regionIdToZoneIds; @Inject - protected ZoneIdToURIFromJoinOnRegionIdToURI(@Region Supplier>> regionIdToURISupplier, - @Zone Supplier>>> regionIdToZoneIdsSupplier) { - this.regionIdToURISupplier = regionIdToURISupplier; - this.regionIdToZoneIdsSupplier = regionIdToZoneIdsSupplier; + ZoneIdToURIFromJoinOnRegionIdToURI(@Region Supplier>> regionIdToURIs, + @Zone Supplier>>> regionIdToZoneIds) { + this.regionIdToURIs = regionIdToURIs; + this.regionIdToZoneIds = regionIdToZoneIds; } @Override public Map> get() { - Builder> builder = ImmutableMap.> builder(); - for (Entry> regionToURI : regionIdToURISupplier.get().entrySet()) { - for (String zone : regionIdToZoneIdsSupplier.get().get(regionToURI.getKey()).get()) { + Map>> regionIdToZoneIds = this.regionIdToZoneIds.get(); + Builder> builder = ImmutableMap.builder(); + for (Entry> regionToURI : regionIdToURIs.get().entrySet()) { + Supplier> zoneIds = regionIdToZoneIds.get(regionToURI.getKey()); + checkState(zoneIds != null, "region %s is not in the configured region to zone mappings: %s", + regionToURI.getKey(), regionIdToZoneIds); + for (String zone : zoneIds.get()) { builder.put(zone, regionToURI.getValue()); } } return builder.build(); } - } diff --git a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromRegionIdToZoneIdsValues.java b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromRegionIdToZoneIdsValues.java index 25764af126..cd54ca8b7b 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromRegionIdToZoneIdsValues.java +++ b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromRegionIdToZoneIdsValues.java @@ -16,40 +16,33 @@ */ package org.jclouds.location.suppliers.derived; -import java.util.Collection; import java.util.Map; import java.util.Set; import javax.inject.Inject; -import javax.inject.Singleton; import org.jclouds.location.Zone; import org.jclouds.location.suppliers.ZoneIdsSupplier; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -/** - * as opposed to via properties, lets look up zones via api, as they are more likely to change - */ -@Singleton -public class ZoneIdsFromRegionIdToZoneIdsValues implements ZoneIdsSupplier { +/** As opposed to via properties, lets look up zones via api, as they are more likely to change. */ +public final class ZoneIdsFromRegionIdToZoneIdsValues implements ZoneIdsSupplier { - private final Supplier>>> regionIdToZoneIdsSupplier; + private final Supplier>>> regionIdToZoneIds; @Inject - protected ZoneIdsFromRegionIdToZoneIdsValues( - @Zone Supplier>>> regionIdToZoneIdsSupplier) { - this.regionIdToZoneIdsSupplier = regionIdToZoneIdsSupplier; + ZoneIdsFromRegionIdToZoneIdsValues(@Zone Supplier>>> regionIdToZoneIds) { + this.regionIdToZoneIds = regionIdToZoneIds; } @Override public Set get() { - Collection>> zones = regionIdToZoneIdsSupplier.get().values(); - return ImmutableSet.copyOf(Iterables.concat(Iterables.transform(zones, Suppliers - .> supplierFunction()))); + ImmutableSet.Builder result = ImmutableSet.builder(); + for (Supplier> zone : regionIdToZoneIds.get().values()) { + result.addAll(zone.get()); + } + return result.build(); } - } diff --git a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromZoneIdToURIKeySet.java b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromZoneIdToURIKeySet.java index a60f4c2725..ceaf7fb75d 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromZoneIdToURIKeySet.java +++ b/core/src/main/java/org/jclouds/location/suppliers/derived/ZoneIdsFromZoneIdToURIKeySet.java @@ -20,29 +20,24 @@ import java.net.URI; import java.util.Map; import java.util.Set; -import javax.inject.Singleton; - import org.jclouds.location.Zone; import org.jclouds.location.suppliers.ZoneIdsSupplier; import com.google.common.base.Supplier; import com.google.inject.Inject; -/** - * as opposed to via properties, lets look up zones via api, as they are more likely to change - */ -@Singleton -public class ZoneIdsFromZoneIdToURIKeySet implements ZoneIdsSupplier { +/** As opposed to via properties, lets look up zones via api, as they are more likely to change. */ +public final class ZoneIdsFromZoneIdToURIKeySet implements ZoneIdsSupplier { - private final Supplier>> zoneIdToURISupplier; + private final Supplier>> zoneIdToURIs; @Inject - protected ZoneIdsFromZoneIdToURIKeySet(@Zone Supplier>> zoneIdToURISupplier) { - this.zoneIdToURISupplier = zoneIdToURISupplier; + ZoneIdsFromZoneIdToURIKeySet(@Zone Supplier>> zoneIdToURIs) { + this.zoneIdToURIs = zoneIdToURIs; } @Override public Set get() { - return zoneIdToURISupplier.get().keySet(); + return zoneIdToURIs.get().keySet(); } } diff --git a/core/src/test/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURITest.java b/core/src/test/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURITest.java new file mode 100644 index 0000000000..6407ee72b1 --- /dev/null +++ b/core/src/test/java/org/jclouds/location/suppliers/derived/ZoneIdToURIFromJoinOnRegionIdToURITest.java @@ -0,0 +1,69 @@ +/* + * 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.location.suppliers.derived; + +import static org.testng.Assert.assertEquals; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; + +@Test +public class ZoneIdToURIFromJoinOnRegionIdToURITest { + + public void zoneToRegionMappingsValid() { + Map> regionIdToURIs = Maps.newLinkedHashMap(); + regionIdToURIs.put("us-east-1", Suppliers.ofInstance(URI.create("ec2.us-east-1.amazonaws.com"))); + regionIdToURIs.put("eu-central-1", Suppliers.ofInstance(URI.create("ec2.eu-central-1.amazonaws.com"))); + Map>> regionIdToZoneIds = Maps.newLinkedHashMap(); + regionIdToZoneIds.put("us-east-1", supplyZoneIds("us-east-1a", "us-east-1b")); + regionIdToZoneIds.put("eu-central-1", supplyZoneIds("eu-central-1a")); + + Map> result = new ZoneIdToURIFromJoinOnRegionIdToURI(Suppliers.ofInstance(regionIdToURIs), + Suppliers.ofInstance(regionIdToZoneIds)).get(); + + assertEquals(result.size(), 3); + assertEquals(result.get("us-east-1a"), regionIdToURIs.get("us-east-1")); + assertEquals(result.get("us-east-1b"), regionIdToURIs.get("us-east-1")); + assertEquals(result.get("eu-central-1a"), regionIdToURIs.get("eu-central-1")); + } + + @Test(expectedExceptions = IllegalStateException.class, + expectedExceptionsMessageRegExp = "region eu-central-1 is not in the configured region to zone mappings: .*") + public void zoneToRegionMappingsInconsistentOnKeys() { + Map> regionIdToURIs = Maps.newLinkedHashMap(); + regionIdToURIs.put("us-east-1", Suppliers.ofInstance(URI.create("ec2.us-east-1.amazonaws.com"))); + regionIdToURIs.put("eu-central-1", Suppliers.ofInstance(URI.create("ec2.eu-central-1.amazonaws.com"))); + Map>> regionIdToZoneIds = Maps.newLinkedHashMap(); + regionIdToZoneIds.put("us-east-1", supplyZoneIds("us-east-1a", "us-east-1b")); + // missing regionIdToZoneIds mapping for eu-central-1 + + new ZoneIdToURIFromJoinOnRegionIdToURI(Suppliers.ofInstance(regionIdToURIs), + Suppliers.ofInstance(regionIdToZoneIds)).get(); + } + + private static Supplier> supplyZoneIds(String... zoneIds) { + return Suppliers.>ofInstance(ImmutableSet.copyOf(zoneIds)); + } +}