mirror of https://github.com/apache/jclouds.git
backfilled tests and refactored most of org.jclouds.location.suppliers package
This commit is contained in:
parent
cf4acc8000
commit
dd89ad3068
|
@ -22,12 +22,15 @@ import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
import org.jclouds.Constants;
|
import org.jclouds.Constants;
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
import org.jclouds.aws.filters.FormSigner;
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
import org.jclouds.cloudwatch.config.CloudWatchRestClientModule;
|
import org.jclouds.cloudwatch.config.CloudWatchRestClientModule;
|
||||||
import org.jclouds.cloudwatch.xml.GetMetricStatisticsResponseHandler;
|
import org.jclouds.cloudwatch.xml.GetMetricStatisticsResponseHandler;
|
||||||
|
@ -42,6 +45,7 @@ import org.jclouds.rest.RestContextSpec;
|
||||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.TypeLiteral;
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
|
@ -50,7 +54,8 @@ import com.google.inject.TypeLiteral;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
|
// NOTE:without testName, this will not call @Before* and fail w/NPE during
|
||||||
|
// surefire
|
||||||
@Test(groups = "unit", testName = "CloudWatchAsyncClientTest")
|
@Test(groups = "unit", testName = "CloudWatchAsyncClientTest")
|
||||||
public class CloudWatchAsyncClientTest extends RestClientTest<CloudWatchAsyncClient> {
|
public class CloudWatchAsyncClientTest extends RestClientTest<CloudWatchAsyncClient> {
|
||||||
|
|
||||||
|
@ -95,6 +100,19 @@ public class CloudWatchAsyncClientTest extends RestClientTest<CloudWatchAsyncCli
|
||||||
super.configure();
|
super.configure();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void bindRegionsToProvider() {
|
||||||
|
bindRegionsToProvider(Regions.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Regions implements javax.inject.Provider<Map<String, URI>> {
|
||||||
|
@Override
|
||||||
|
public Map<String, URI> get() {
|
||||||
|
return ImmutableMap.<String, URI> of(Region.EU_WEST_1, URI.create("https://ec2.eu-west-1.amazonaws.com"),
|
||||||
|
Region.US_EAST_1, URI.create("https://ec2.us-east-1.amazonaws.com"), Region.US_WEST_1,
|
||||||
|
URI.create("https://ec2.us-west-1.amazonaws.com"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String provideTimeStamp(final DateService dateService,
|
protected String provideTimeStamp(final DateService dateService,
|
||||||
@Named(Constants.PROPERTY_SESSION_INTERVAL) int expiration) {
|
@Named(Constants.PROPERTY_SESSION_INTERVAL) int expiration) {
|
||||||
|
|
|
@ -26,7 +26,7 @@ import org.jclouds.compute.config.BindComputeSuppliersByClass;
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.location.suppliers.OnlyLocationOrFirstZoneOrRegionMatchingRegionId;
|
import org.jclouds.location.suppliers.OnlyLocationOrFirstRegionOptionallyMatchingRegionId;
|
||||||
import org.jclouds.location.suppliers.ZoneToRegionToProviderOrJustProvider;
|
import org.jclouds.location.suppliers.ZoneToRegionToProviderOrJustProvider;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
@ -46,7 +46,7 @@ public class EC2BindComputeSuppliersByClass extends BindComputeSuppliersByClass
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Class<? extends Supplier<Location>> defineDefaultLocationSupplier() {
|
protected Class<? extends Supplier<Location>> defineDefaultLocationSupplier() {
|
||||||
return OnlyLocationOrFirstZoneOrRegionMatchingRegionId.class;
|
return OnlyLocationOrFirstRegionOptionallyMatchingRegionId.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class OrgAndVDCToLocationSupplier extends JustProvider {
|
||||||
OrgAndVDCToLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
OrgAndVDCToLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
||||||
@org.jclouds.vcloud.endpoints.Org Supplier<Map<String, ReferenceType>> orgNameToResource,
|
@org.jclouds.vcloud.endpoints.Org Supplier<Map<String, ReferenceType>> orgNameToResource,
|
||||||
Supplier<Map<String, ? extends Org>> orgNameToVDCResource, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
Supplier<Map<String, ? extends Org>> orgNameToVDCResource, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
||||||
super(isoCodes, providerName, endpoint);
|
super(providerName, endpoint, isoCodes);
|
||||||
this.orgNameToResource = checkNotNull(orgNameToResource, "orgNameToResource");
|
this.orgNameToResource = checkNotNull(orgNameToResource, "orgNameToResource");
|
||||||
this.orgNameToVDCResource = checkNotNull(orgNameToVDCResource, "orgNameToVDCResource");
|
this.orgNameToVDCResource = checkNotNull(orgNameToVDCResource, "orgNameToVDCResource");
|
||||||
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class OrgAndVDCToLocationSupplier extends JustProvider {
|
||||||
OrgAndVDCToLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
OrgAndVDCToLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
||||||
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<Map<String, ReferenceType>> orgNameToResource,
|
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<Map<String, ReferenceType>> orgNameToResource,
|
||||||
Supplier<Map<String, ? extends Org>> orgNameToVDCResource, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
Supplier<Map<String, ? extends Org>> orgNameToVDCResource, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
||||||
super(isoCodes, providerName, endpoint);
|
super(providerName, endpoint, isoCodes);
|
||||||
this.orgNameToResource = checkNotNull(orgNameToResource, "orgNameToResource");
|
this.orgNameToResource = checkNotNull(orgNameToResource, "orgNameToResource");
|
||||||
this.orgNameToVDCResource = checkNotNull(orgNameToVDCResource, "orgNameToVDCResource");
|
this.orgNameToVDCResource = checkNotNull(orgNameToVDCResource, "orgNameToVDCResource");
|
||||||
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
||||||
|
|
|
@ -21,7 +21,7 @@ package org.jclouds.location.config;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.location.suppliers.OnlyLocationOrFirstZoneOrRegionMatchingRegionId;
|
import org.jclouds.location.suppliers.OnlyLocationOrFirstRegionOptionallyMatchingRegionId;
|
||||||
import org.jclouds.location.suppliers.RegionToProviderOrJustProvider;
|
import org.jclouds.location.suppliers.RegionToProviderOrJustProvider;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
@ -39,7 +39,7 @@ public class RegionsLocationModule extends LocationModule {
|
||||||
bind(new TypeLiteral<Supplier<Set<? extends Location>>>() {
|
bind(new TypeLiteral<Supplier<Set<? extends Location>>>() {
|
||||||
}).to(RegionToProviderOrJustProvider.class);
|
}).to(RegionToProviderOrJustProvider.class);
|
||||||
bind(new TypeLiteral<Supplier<Location>>() {
|
bind(new TypeLiteral<Supplier<Location>>() {
|
||||||
}).to(OnlyLocationOrFirstZoneOrRegionMatchingRegionId.class);
|
}).to(OnlyLocationOrFirstRegionOptionallyMatchingRegionId.class);
|
||||||
super.configure();
|
super.configure();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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.functions;
|
||||||
|
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public enum ToIdAndScope implements Function<Location, String> {
|
||||||
|
INSTANCE;
|
||||||
|
@Override
|
||||||
|
public String apply(Location input) {
|
||||||
|
return input.getId() + ":" + input.getScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "toIdAndScope()";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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.predicates;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.domain.LocationScope;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class LocationPredicates {
|
||||||
|
|
||||||
|
public static Predicate<Location> isZone() {
|
||||||
|
return IsZone.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
static enum IsZone implements Predicate<Location> {
|
||||||
|
INSTANCE;
|
||||||
|
@Override
|
||||||
|
public boolean apply(Location input) {
|
||||||
|
return input.getScope() == LocationScope.ZONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "isZone()";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Predicate<Location> isRegion() {
|
||||||
|
return IsRegion.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum IsRegion implements Predicate<Location> {
|
||||||
|
INSTANCE;
|
||||||
|
@Override
|
||||||
|
public boolean apply(Location input) {
|
||||||
|
return input.getScope() == LocationScope.REGION;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "isRegion()";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Predicate<Location> isZoneOrRegionWhereRegionIdEquals(String region) {
|
||||||
|
return new IsZoneOrRegionWhereRegionIdEquals(region);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class IsZoneOrRegionWhereRegionIdEquals implements Predicate<Location> {
|
||||||
|
|
||||||
|
private final String region;
|
||||||
|
|
||||||
|
IsZoneOrRegionWhereRegionIdEquals(String region) {
|
||||||
|
this.region = checkNotNull(region, "region");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Location input) {
|
||||||
|
switch (input.getScope()) {
|
||||||
|
case ZONE:
|
||||||
|
return input.getParent().getId().equals(region);
|
||||||
|
case REGION:
|
||||||
|
return input.getId().equals(region);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "isRegionAndIdEqualsOrIsZoneParentIdEquals(" + region + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -46,7 +46,7 @@ public class JustProvider implements Supplier<Set<? extends Location>> {
|
||||||
private final Set<String> isoCodes;
|
private final Set<String> isoCodes;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public JustProvider(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint) {
|
public JustProvider(@Provider String providerName, @Provider URI endpoint, @Iso3166 Set<String> isoCodes) {
|
||||||
this.providerName = checkNotNull(providerName, "providerName");
|
this.providerName = checkNotNull(providerName, "providerName");
|
||||||
this.endpoint = checkNotNull(endpoint, "endpoint");
|
this.endpoint = checkNotNull(endpoint, "endpoint");
|
||||||
this.isoCodes = checkNotNull(isoCodes, "isoCodes");
|
this.isoCodes = checkNotNull(isoCodes, "isoCodes");
|
||||||
|
@ -54,8 +54,8 @@ public class JustProvider implements Supplier<Set<? extends Location>> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<? extends Location> get() {
|
public Set<? extends Location> get() {
|
||||||
return ImmutableSet.of(new LocationBuilder().scope(LocationScope.PROVIDER).id(providerName).description(
|
return ImmutableSet.of(new LocationBuilder().scope(LocationScope.PROVIDER).id(providerName)
|
||||||
endpoint.toASCIIString()).iso3166Codes(isoCodes).build());
|
.description(endpoint.toASCIIString()).iso3166Codes(isoCodes).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -20,10 +20,15 @@ package org.jclouds.location.suppliers;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.collect.Iterables.getOnlyElement;
|
import static com.google.common.collect.Iterables.getOnlyElement;
|
||||||
|
import static com.google.common.collect.Iterables.transform;
|
||||||
|
import static org.jclouds.location.predicates.LocationPredicates.isRegion;
|
||||||
|
import static org.jclouds.location.predicates.LocationPredicates.isZone;
|
||||||
|
import static org.jclouds.location.predicates.LocationPredicates.isZoneOrRegionWhereRegionIdEquals;
|
||||||
|
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
@ -31,53 +36,27 @@ import org.jclouds.collect.Memoized;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
import org.jclouds.location.Region;
|
import org.jclouds.location.Region;
|
||||||
|
import org.jclouds.location.functions.ToIdAndScope;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.inject.Injector;
|
|
||||||
import com.google.inject.Key;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class OnlyLocationOrFirstZoneOrRegionMatchingRegionId implements Supplier<Location> {
|
public class OnlyLocationOrFirstRegionOptionallyMatchingRegionId implements Supplier<Location> {
|
||||||
@Singleton
|
|
||||||
public static final class IsRegionAndIdEqualsOrIsZoneParentIdEquals implements Predicate<Location> {
|
|
||||||
|
|
||||||
private final String region;
|
private final Predicate<Location> locationPredicate;
|
||||||
|
|
||||||
@Inject
|
|
||||||
IsRegionAndIdEqualsOrIsZoneParentIdEquals(@Region String region) {
|
|
||||||
this.region = checkNotNull(region, "region");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Location input) {
|
|
||||||
switch (input.getScope()) {
|
|
||||||
case ZONE:
|
|
||||||
return input.getParent().getId().equals(region);
|
|
||||||
case REGION:
|
|
||||||
return input.getId().equals(region);
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "isRegionAndIdEqualsOrIsZoneParentIdEquals(" + region + ")";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Injector injector;
|
|
||||||
private final Supplier<Set<? extends Location>> locationsSupplier;
|
private final Supplier<Set<? extends Location>> locationsSupplier;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
OnlyLocationOrFirstZoneOrRegionMatchingRegionId(Injector injector,
|
OnlyLocationOrFirstRegionOptionallyMatchingRegionId(@Nullable @Region String region,
|
||||||
@Memoized Supplier<Set<? extends Location>> locationsSupplier) {
|
@Memoized Supplier<Set<? extends Location>> locationsSupplier) {
|
||||||
this.injector = checkNotNull(injector, "injector");
|
this.locationPredicate = region == null ? Predicates.<Location>or(isZone(), isRegion())
|
||||||
|
: isZoneOrRegionWhereRegionIdEquals(region);
|
||||||
this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplier");
|
this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplier");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,16 +66,12 @@ public class OnlyLocationOrFirstZoneOrRegionMatchingRegionId implements Supplier
|
||||||
Set<? extends Location> locations = locationsSupplier.get();
|
Set<? extends Location> locations = locationsSupplier.get();
|
||||||
if (locationsSupplier.get().size() == 1)
|
if (locationsSupplier.get().size() == 1)
|
||||||
return getOnlyElement(locationsSupplier.get());
|
return getOnlyElement(locationsSupplier.get());
|
||||||
IsRegionAndIdEqualsOrIsZoneParentIdEquals matcher = null;
|
|
||||||
try {
|
try {
|
||||||
String region = injector.getInstance(Key.get(String.class, Region.class));
|
Location toReturn = Iterables.find(locations, locationPredicate);
|
||||||
if (region == null)
|
|
||||||
return Iterables.get(locationsSupplier.get(), 0);
|
|
||||||
matcher = injector.getInstance(IsRegionAndIdEqualsOrIsZoneParentIdEquals.class);
|
|
||||||
Location toReturn = Iterables.find(locations, matcher);
|
|
||||||
return toReturn.getScope() == LocationScope.REGION ? toReturn : toReturn.getParent();
|
return toReturn.getScope() == LocationScope.REGION ? toReturn : toReturn.getParent();
|
||||||
} catch (NoSuchElementException e) {
|
} catch (NoSuchElementException e) {
|
||||||
throw new IllegalStateException(String.format("region %s not found in %s", matcher, locations));
|
throw new NoSuchElementException(String.format("couldn't find region matching %s in %s", locationPredicate,
|
||||||
|
transform(locations, ToIdAndScope.INSTANCE)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -21,7 +21,10 @@ package org.jclouds.location.suppliers;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.collect.Iterables.find;
|
import static com.google.common.collect.Iterables.find;
|
||||||
import static com.google.common.collect.Iterables.getOnlyElement;
|
import static com.google.common.collect.Iterables.getOnlyElement;
|
||||||
|
import static com.google.common.collect.Iterables.transform;
|
||||||
|
import static org.jclouds.location.predicates.LocationPredicates.isZone;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -29,9 +32,8 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.collect.Memoized;
|
import org.jclouds.collect.Memoized;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.location.functions.ToIdAndScope;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,33 +43,25 @@ import com.google.common.base.Supplier;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class OnlyLocationOrFirstZone implements Supplier<Location> {
|
public class OnlyLocationOrFirstZone implements Supplier<Location> {
|
||||||
@Singleton
|
|
||||||
public static final class IsZone implements Predicate<Location> {
|
|
||||||
@Override
|
|
||||||
public boolean apply(Location input) {
|
|
||||||
return input.getScope() == LocationScope.ZONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "isZone()";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Supplier<Set<? extends Location>> locationsSupplier;
|
private final Supplier<Set<? extends Location>> locationsSupplier;
|
||||||
private final IsZone isZone;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
OnlyLocationOrFirstZone(@Memoized Supplier<Set<? extends Location>> locationsSupplier, IsZone isZone) {
|
OnlyLocationOrFirstZone(@Memoized Supplier<Set<? extends Location>> locationsSupplier) {
|
||||||
this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplierSupplier");
|
this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplierSupplier");
|
||||||
this.isZone = checkNotNull(isZone, "isZone");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Location get() {
|
public Location get() {
|
||||||
if (locationsSupplier.get().size() == 1)
|
Set<? extends Location> locations = locationsSupplier.get();
|
||||||
return getOnlyElement(locationsSupplier.get());
|
if (locations.size() == 1)
|
||||||
return find(locationsSupplier.get(), isZone);
|
return getOnlyElement(locations);
|
||||||
|
try {
|
||||||
|
return find(locations, isZone());
|
||||||
|
} catch (NoSuchElementException e) {
|
||||||
|
throw new NoSuchElementException("none to of the locations are scope ZONE: "
|
||||||
|
+ transform(locations, ToIdAndScope.INSTANCE));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -50,7 +50,7 @@ public class RegionToProviderOrJustProvider extends JustProvider {
|
||||||
@Inject
|
@Inject
|
||||||
public RegionToProviderOrJustProvider(@Iso3166 Set<String> isoCodes, @Provider String providerName,
|
public RegionToProviderOrJustProvider(@Iso3166 Set<String> isoCodes, @Provider String providerName,
|
||||||
@Provider URI endpoint, @Region Set<String> regions, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
@Provider URI endpoint, @Region Set<String> regions, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
||||||
super(isoCodes, providerName, endpoint);
|
super(providerName, endpoint, isoCodes);
|
||||||
this.regions = checkNotNull(regions, "regions");
|
this.regions = checkNotNull(regions, "regions");
|
||||||
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
import org.jclouds.domain.LocationScope;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code JustProvider}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "JustProviderTest")
|
||||||
|
public class JustProviderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws SecurityException, NoSuchMethodException {
|
||||||
|
JustProvider fn = new JustProvider("servo", URI.create("http://servo"), ImmutableSet.of("US"));
|
||||||
|
assertEquals(
|
||||||
|
fn.get(),
|
||||||
|
ImmutableSet.of(new LocationBuilder().scope(LocationScope.PROVIDER).id("servo").description("http://servo")
|
||||||
|
.iso3166Codes(ImmutableSet.of("US")).build()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
import org.jclouds.domain.LocationScope;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Suppliers;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code OnlyLocationOrFirstRegionOptionallyMatchingRegionId}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "OnlyLocationOrFirstRegionOptionallyMatchingRegionIdTest")
|
||||||
|
public class OnlyLocationOrFirstRegionOptionallyMatchingRegionIdTest {
|
||||||
|
Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("servo").description("http://servo")
|
||||||
|
.build();
|
||||||
|
Location region = new LocationBuilder().scope(LocationScope.REGION).id("servo-r1").description("http://r1.servo")
|
||||||
|
.parent(provider).build();
|
||||||
|
Location region2 = new LocationBuilder().scope(LocationScope.REGION).id("servo-r2").description("http://r2.servo")
|
||||||
|
.parent(provider).build();
|
||||||
|
Location zone = new LocationBuilder().scope(LocationScope.ZONE).id("servo-z").description("http://z.r.servo")
|
||||||
|
.parent(region).build();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDidntMatchRegionIdThrowsNSEEWithReasonableMessage() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider, region, region2, zone));
|
||||||
|
OnlyLocationOrFirstRegionOptionallyMatchingRegionId fn = new OnlyLocationOrFirstRegionOptionallyMatchingRegionId(
|
||||||
|
"foo", supplier);
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn.get();
|
||||||
|
assert false;
|
||||||
|
} catch (NoSuchElementException e) {
|
||||||
|
assertEquals(
|
||||||
|
e.getMessage(),
|
||||||
|
"couldn't find region matching isRegionAndIdEqualsOrIsZoneParentIdEquals(foo) in [servo:PROVIDER, servo-r1:REGION, servo-r2:REGION, servo-z:ZONE]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoRegionUsesProvider() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider));
|
||||||
|
OnlyLocationOrFirstRegionOptionallyMatchingRegionId fn = new OnlyLocationOrFirstRegionOptionallyMatchingRegionId(
|
||||||
|
null, supplier);
|
||||||
|
assertEquals(fn.get(), provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFirstRegion() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider, region, region2, zone));
|
||||||
|
OnlyLocationOrFirstRegionOptionallyMatchingRegionId fn = new OnlyLocationOrFirstRegionOptionallyMatchingRegionId(
|
||||||
|
null, supplier);
|
||||||
|
assertEquals(fn.get(), region);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFindRegion() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider, region, region2, zone));
|
||||||
|
OnlyLocationOrFirstRegionOptionallyMatchingRegionId fn = new OnlyLocationOrFirstRegionOptionallyMatchingRegionId(
|
||||||
|
region2.getId(), supplier);
|
||||||
|
assertEquals(fn.get(), region2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
import org.jclouds.domain.LocationScope;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Suppliers;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code OnlyLocationOrFirstZone}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "OnlyLocationOrFirstZoneTest")
|
||||||
|
public class OnlyLocationOrFirstZoneTest {
|
||||||
|
Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("servo").description("http://servo")
|
||||||
|
.build();
|
||||||
|
Location region = new LocationBuilder().scope(LocationScope.REGION).id("servo-r").description("http://r.servo")
|
||||||
|
.parent(provider).build();
|
||||||
|
Location zone = new LocationBuilder().scope(LocationScope.ZONE).id("servo-z").description("http://z.r.servo")
|
||||||
|
.parent(region).build();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDidntFindZoneThrowsNSEEWithReasonableMessage() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider, region));
|
||||||
|
OnlyLocationOrFirstZone fn = new OnlyLocationOrFirstZone(supplier);
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn.get();
|
||||||
|
assert false;
|
||||||
|
} catch (NoSuchElementException e) {
|
||||||
|
assertEquals(e.getMessage(), "none to of the locations are scope ZONE: [servo:PROVIDER, servo-r:REGION]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoZoneUsesProvider() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider));
|
||||||
|
OnlyLocationOrFirstZone fn = new OnlyLocationOrFirstZone(supplier);
|
||||||
|
assertEquals(fn.get(), provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFirstZone() {
|
||||||
|
Supplier<Set<? extends Location>> supplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||||
|
.<Location> of(provider, region, zone));
|
||||||
|
OnlyLocationOrFirstZone fn = new OnlyLocationOrFirstZone(supplier);
|
||||||
|
assertEquals(fn.get(), zone);
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ import javax.inject.Singleton;
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.location.suppliers.OnlyLocationOrFirstZoneOrRegionMatchingRegionId;
|
import org.jclouds.location.suppliers.OnlyLocationOrFirstRegionOptionallyMatchingRegionId;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
|
@ -66,7 +66,7 @@ public abstract class BindLoadBalancerSuppliersByClass extends AbstractModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Class<? extends Supplier<Location>> defineDefaultLocationSupplier() {
|
protected Class<? extends Supplier<Location>> defineDefaultLocationSupplier() {
|
||||||
return OnlyLocationOrFirstZoneOrRegionMatchingRegionId.class;
|
return OnlyLocationOrFirstRegionOptionallyMatchingRegionId.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void bindImageSupplier(Class<? extends Supplier<Set<? extends Image>>> clazz) {
|
protected void bindImageSupplier(Class<? extends Supplier<Set<? extends Image>>> clazz) {
|
||||||
|
|
|
@ -18,20 +18,17 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.aws.s3.binders;
|
package org.jclouds.aws.s3.binders;
|
||||||
|
|
||||||
import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_SERVICE_PATH;
|
import static org.jclouds.http.utils.ModifyRequest.endpoint;
|
||||||
import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS;
|
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.ws.rs.core.UriBuilder;
|
import javax.ws.rs.core.UriBuilder;
|
||||||
|
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.http.utils.ModifyRequest;
|
|
||||||
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
import org.jclouds.rest.binders.BindAsHostPrefix;
|
import org.jclouds.rest.binders.BindAsHostPrefix;
|
||||||
import org.jclouds.s3.Bucket;
|
import org.jclouds.s3.Bucket;
|
||||||
|
@ -48,10 +45,9 @@ public class AssignCorrectHostnameAndBindAsHostPrefixIfConfigured extends BindAs
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public AssignCorrectHostnameAndBindAsHostPrefixIfConfigured(BindAsHostPrefix bindAsHostPrefix,
|
public AssignCorrectHostnameAndBindAsHostPrefixIfConfigured(BindAsHostPrefix bindAsHostPrefix,
|
||||||
@Named(PROPERTY_S3_VIRTUAL_HOST_BUCKETS) boolean isVhostStyle,
|
RegionToEndpointOrProviderIfNull r2, Provider<UriBuilder> uriBuilderProvider,
|
||||||
@Named(PROPERTY_S3_SERVICE_PATH) String servicePath, RegionToEndpointOrProviderIfNull r2,
|
@Bucket Map<String, String> bucketToRegion) {
|
||||||
Provider<UriBuilder> uriBuilderProvider, @Bucket Map<String, String> bucketToRegion) {
|
super(bindAsHostPrefix, true, "/", uriBuilderProvider);
|
||||||
super(bindAsHostPrefix, isVhostStyle, servicePath, uriBuilderProvider);
|
|
||||||
this.bucketToRegion = bucketToRegion;
|
this.bucketToRegion = bucketToRegion;
|
||||||
this.r2 = r2;
|
this.r2 = r2;
|
||||||
}
|
}
|
||||||
|
@ -62,9 +58,7 @@ public class AssignCorrectHostnameAndBindAsHostPrefixIfConfigured extends BindAs
|
||||||
String region = bucketToRegion.get(bucket);
|
String region = bucketToRegion.get(bucket);
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
URI endpoint = r2.apply(region);
|
URI endpoint = r2.apply(region);
|
||||||
request = ModifyRequest.endpoint(
|
request = endpoint(request, uriBuilderProvider.get().uri(endpoint).path(request.getEndpoint().getPath())
|
||||||
request,
|
|
||||||
uriBuilderProvider.get().uri(endpoint).path(request.getEndpoint().getPath())
|
|
||||||
.replaceQuery(request.getEndpoint().getQuery()).build());
|
.replaceQuery(request.getEndpoint().getQuery()).build());
|
||||||
}
|
}
|
||||||
return super.bindToRequest(request, payload);
|
return super.bindToRequest(request, payload);
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.aws.s3;
|
package org.jclouds.aws.s3;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -29,6 +28,7 @@ import java.util.concurrent.ConcurrentMap;
|
||||||
import org.jclouds.aws.s3.config.AWSS3RestClientModule;
|
import org.jclouds.aws.s3.config.AWSS3RestClientModule;
|
||||||
import org.jclouds.aws.s3.functions.ETagFromHttpResponseViaRegex;
|
import org.jclouds.aws.s3.functions.ETagFromHttpResponseViaRegex;
|
||||||
import org.jclouds.aws.s3.functions.UploadIdFromHttpResponseViaRegex;
|
import org.jclouds.aws.s3.functions.UploadIdFromHttpResponseViaRegex;
|
||||||
|
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
|
||||||
import org.jclouds.date.TimeStamp;
|
import org.jclouds.date.TimeStamp;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.http.RequiresHttp;
|
import org.jclouds.http.RequiresHttp;
|
||||||
|
@ -45,6 +45,7 @@ import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
|
||||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||||
import org.jclouds.s3.domain.ObjectMetadata;
|
import org.jclouds.s3.domain.ObjectMetadata;
|
||||||
import org.jclouds.s3.domain.ObjectMetadataBuilder;
|
import org.jclouds.s3.domain.ObjectMetadataBuilder;
|
||||||
|
import org.jclouds.s3.domain.S3Object;
|
||||||
import org.jclouds.s3.functions.ReturnFalseIfBucketAlreadyOwnedByYouOrIllegalState;
|
import org.jclouds.s3.functions.ReturnFalseIfBucketAlreadyOwnedByYouOrIllegalState;
|
||||||
import org.jclouds.s3.options.PutBucketOptions;
|
import org.jclouds.s3.options.PutBucketOptions;
|
||||||
import org.jclouds.s3.options.PutObjectOptions;
|
import org.jclouds.s3.options.PutObjectOptions;
|
||||||
|
@ -84,6 +85,26 @@ public class AWSS3AsyncClientTest extends org.jclouds.s3.S3AsyncClientTest<AWSS3
|
||||||
checkFilters(request);
|
checkFilters(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testPutObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||||
|
NoSuchMethodException, IOException {
|
||||||
|
|
||||||
|
Method method = AWSS3AsyncClient.class
|
||||||
|
.getMethod("putObject", String.class, S3Object.class, PutObjectOptions[].class);
|
||||||
|
HttpRequest request = processor.createRequest(method, "bucket",
|
||||||
|
blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB));
|
||||||
|
|
||||||
|
assertRequestLineEquals(request, "PUT https://bucket." + url + "/hello HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n");
|
||||||
|
assertPayloadEquals(request, "hello", "text/plain", false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, request, ParseETagHeader.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, null);
|
||||||
|
|
||||||
|
checkFilters(request);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void testGetBucketLocation() throws SecurityException, NoSuchMethodException, IOException {
|
public void testGetBucketLocation() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
Method method = AWSS3AsyncClient.class.getMethod("getBucketLocation", String.class);
|
Method method = AWSS3AsyncClient.class.getMethod("getBucketLocation", String.class);
|
||||||
|
@ -111,8 +132,8 @@ public class AWSS3AsyncClientTest extends org.jclouds.s3.S3AsyncClientTest<AWSS3
|
||||||
@Override
|
@Override
|
||||||
public void testPutBucketDefault() throws ArrayIndexOutOfBoundsException, SecurityException,
|
public void testPutBucketDefault() throws ArrayIndexOutOfBoundsException, SecurityException,
|
||||||
IllegalArgumentException, NoSuchMethodException, IOException {
|
IllegalArgumentException, NoSuchMethodException, IOException {
|
||||||
Method method = AWSS3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array
|
Method method = AWSS3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class,
|
||||||
.newInstance(PutBucketOptions.class, 0).getClass());
|
PutBucketOptions[].class);
|
||||||
HttpRequest request = processor.createRequest(method, (String) null, "bucket");
|
HttpRequest request = processor.createRequest(method, (String) null, "bucket");
|
||||||
|
|
||||||
assertRequestLineEquals(request, "PUT https://bucket.bucketendpoint/ HTTP/1.1");
|
assertRequestLineEquals(request, "PUT https://bucket.bucketendpoint/ HTTP/1.1");
|
||||||
|
@ -224,8 +245,8 @@ public class AWSS3AsyncClientTest extends org.jclouds.s3.S3AsyncClientTest<AWSS3
|
||||||
|
|
||||||
public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||||
NoSuchMethodException, IOException {
|
NoSuchMethodException, IOException {
|
||||||
Method method = AWSS3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array
|
Method method = AWSS3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class,
|
||||||
.newInstance(PutBucketOptions.class, 0).getClass());
|
PutBucketOptions[].class);
|
||||||
HttpRequest request = processor.createRequest(method, "EU", "bucket");
|
HttpRequest request = processor.createRequest(method, "EU", "bucket");
|
||||||
|
|
||||||
assertRequestLineEquals(request, "PUT https://bucket.bucketendpoint/ HTTP/1.1");
|
assertRequestLineEquals(request, "PUT https://bucket.bucketendpoint/ HTTP/1.1");
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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.aws.s3.binders;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.inject.Provider;
|
||||||
|
import javax.ws.rs.core.UriBuilder;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
|
import org.jclouds.rest.binders.BindAsHostPrefix;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.sun.jersey.api.uri.UriBuilderImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of
|
||||||
|
* {@code AssignCorrectHostnameAndBindAsHostPrefixIfConfigured}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
// NOTE:without testName, this will not call @Before* and fail w/NPE during
|
||||||
|
// surefire
|
||||||
|
@Test(groups = "unit", testName = "AssignCorrectHostnameAndBindAsHostPrefixIfConfiguredTest")
|
||||||
|
public class AssignCorrectHostnameAndBindAsHostPrefixIfConfiguredTest {
|
||||||
|
Provider<UriBuilder> uriBuilderProvider = new Provider<UriBuilder>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UriBuilder get() {
|
||||||
|
return new UriBuilderImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public void testWhenNoBucketRegionMappingInCache() {
|
||||||
|
HttpRequest request = new HttpRequest("GET", URI.create("https://s3.amazonaws.com"));
|
||||||
|
|
||||||
|
AssignCorrectHostnameAndBindAsHostPrefixIfConfigured binder = new AssignCorrectHostnameAndBindAsHostPrefixIfConfigured(
|
||||||
|
new BindAsHostPrefix(uriBuilderProvider), new RegionToEndpointOrProviderIfNull("aws-s3",
|
||||||
|
URI.create("https://s3.amazonaws.com"), ImmutableMap.of("us-standard",
|
||||||
|
URI.create("https://s3.amazonaws.com"), "us-west-1",
|
||||||
|
URI.create("https://s3-us-west-1.amazonaws.com"))), uriBuilderProvider,
|
||||||
|
ImmutableMap.<String, String> of());
|
||||||
|
|
||||||
|
request = binder.bindToRequest(request, "bucket");
|
||||||
|
assertEquals(request.getRequestLine(), "GET https://bucket.s3.amazonaws.com HTTP/1.1");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testWhenBucketRegionMappingInCache() {
|
||||||
|
HttpRequest request = new HttpRequest("GET", URI.create("https://s3.amazonaws.com"));
|
||||||
|
|
||||||
|
AssignCorrectHostnameAndBindAsHostPrefixIfConfigured binder = new AssignCorrectHostnameAndBindAsHostPrefixIfConfigured(
|
||||||
|
new BindAsHostPrefix(uriBuilderProvider), new RegionToEndpointOrProviderIfNull("aws-s3",
|
||||||
|
URI.create("https://s3.amazonaws.com"), ImmutableMap.of("us-standard",
|
||||||
|
URI.create("https://s3.amazonaws.com"), "us-west-1",
|
||||||
|
URI.create("https://s3-us-west-1.amazonaws.com"))), uriBuilderProvider,
|
||||||
|
ImmutableMap.<String, String> of("bucket", "us-west-1"));
|
||||||
|
|
||||||
|
request = binder.bindToRequest(request, "bucket");
|
||||||
|
assertEquals(request.getRequestLine(), "GET https://bucket.s3-us-west-1.amazonaws.com HTTP/1.1");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.cloudloadbalancers.config;
|
package org.jclouds.cloudloadbalancers.config;
|
||||||
|
|
||||||
|
import static com.google.common.collect.Iterables.get;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -37,10 +39,13 @@ import org.jclouds.http.RequiresHttp;
|
||||||
import org.jclouds.http.annotation.ClientError;
|
import org.jclouds.http.annotation.ClientError;
|
||||||
import org.jclouds.http.annotation.Redirection;
|
import org.jclouds.http.annotation.Redirection;
|
||||||
import org.jclouds.http.annotation.ServerError;
|
import org.jclouds.http.annotation.ServerError;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.json.config.GsonModule.DateAdapter;
|
import org.jclouds.json.config.GsonModule.DateAdapter;
|
||||||
import org.jclouds.json.config.GsonModule.Iso8601DateAdapter;
|
import org.jclouds.json.config.GsonModule.Iso8601DateAdapter;
|
||||||
|
import org.jclouds.location.Provider;
|
||||||
import org.jclouds.location.Region;
|
import org.jclouds.location.Region;
|
||||||
import org.jclouds.location.config.ProvideRegionToURIViaProperties;
|
import org.jclouds.location.config.ProvideRegionToURIViaProperties;
|
||||||
|
import org.jclouds.logging.Logger.LoggerFactory;
|
||||||
import org.jclouds.openstack.OpenStackAuthAsyncClient.AuthenticationResponse;
|
import org.jclouds.openstack.OpenStackAuthAsyncClient.AuthenticationResponse;
|
||||||
import org.jclouds.openstack.config.OpenStackAuthenticationModule;
|
import org.jclouds.openstack.config.OpenStackAuthenticationModule;
|
||||||
import org.jclouds.openstack.reference.AuthHeaders;
|
import org.jclouds.openstack.reference.AuthHeaders;
|
||||||
|
@ -48,6 +53,7 @@ import org.jclouds.rest.ConfiguresRestClient;
|
||||||
import org.jclouds.rest.config.RestClientModule;
|
import org.jclouds.rest.config.RestClientModule;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.collect.ImmutableBiMap;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
@ -118,6 +124,20 @@ public class CloudLoadBalancersRestClientModule extends
|
||||||
return endpoints.keySet();
|
return endpoints.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
@Nullable
|
||||||
|
@Region
|
||||||
|
protected String getDefaultRegion(@Provider URI uri, @Region Map<String, URI> map, LoggerFactory logFactory) {
|
||||||
|
String region = ImmutableBiMap.copyOf(map).inverse().get(uri);
|
||||||
|
if (region == null && map.size() > 0) {
|
||||||
|
logFactory.getLogger(getClass().getName()).warn(
|
||||||
|
"failed to find region for current endpoint %s in %s; choosing first: %s", uri, map, region);
|
||||||
|
region = get(map.keySet(), 0);
|
||||||
|
}
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void bindErrorHandlers() {
|
protected void bindErrorHandlers() {
|
||||||
bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(
|
bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(
|
||||||
|
|
|
@ -21,6 +21,8 @@ package org.jclouds.cloudloadbalancers.features;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.cloudloadbalancers.CloudLoadBalancersAsyncClient;
|
import org.jclouds.cloudloadbalancers.CloudLoadBalancersAsyncClient;
|
||||||
|
@ -40,6 +42,7 @@ import org.testng.annotations.BeforeClass;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,6 +53,19 @@ public abstract class BaseCloudLoadBalancersAsyncClientTest<T> extends RestClien
|
||||||
@RequiresHttp
|
@RequiresHttp
|
||||||
@ConfiguresRestClient
|
@ConfiguresRestClient
|
||||||
public static class CloudLoadBalancersRestClientModuleExtension extends CloudLoadBalancersRestClientModule {
|
public static class CloudLoadBalancersRestClientModuleExtension extends CloudLoadBalancersRestClientModule {
|
||||||
|
|
||||||
|
protected void bindRegionsToProvider() {
|
||||||
|
bindRegionsToProvider(Regions.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Regions implements javax.inject.Provider<Map<String, URI>> {
|
||||||
|
@Override
|
||||||
|
public Map<String, URI> get() {
|
||||||
|
return ImmutableMap.<String, URI> of("DFW",
|
||||||
|
URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/1234"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String accountID(Supplier<AuthenticationResponse> in) {
|
protected String accountID(Supplier<AuthenticationResponse> in) {
|
||||||
return "1234";
|
return "1234";
|
||||||
|
|
|
@ -53,7 +53,7 @@ public class GoGridLocationSupplier extends JustProvider {
|
||||||
@Inject
|
@Inject
|
||||||
GoGridLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
GoGridLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
||||||
GoGridClient sync, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
GoGridClient sync, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
||||||
super(isoCodes, providerName, endpoint);
|
super(providerName, endpoint, isoCodes);
|
||||||
this.sync = checkNotNull(sync, "sync");
|
this.sync = checkNotNull(sync, "sync");
|
||||||
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class RimuHostingLocationSupplier extends JustProvider {
|
||||||
@Inject
|
@Inject
|
||||||
RimuHostingLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
RimuHostingLocationSupplier(@Iso3166 Set<String> isoCodes, @Provider String providerName, @Provider URI endpoint,
|
||||||
RimuHostingClient sync, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
RimuHostingClient sync, @Iso3166 Map<String, Set<String>> isoCodesById) {
|
||||||
super(isoCodes, providerName, endpoint);
|
super(providerName, endpoint, isoCodes);
|
||||||
this.sync = checkNotNull(sync, "sync");
|
this.sync = checkNotNull(sync, "sync");
|
||||||
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById");
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,8 @@ import com.google.common.collect.ImmutableSet;
|
||||||
@Test(singleThreaded = true, groups = "unit")
|
@Test(singleThreaded = true, groups = "unit")
|
||||||
public class DatacenterToLocationTest {
|
public class DatacenterToLocationTest {
|
||||||
|
|
||||||
static DatacenterToLocation function = new DatacenterToLocation(new JustProvider(ImmutableSet.<String> of(), "softlayer",
|
static DatacenterToLocation function = new DatacenterToLocation(new JustProvider("softlayer", URI.create("foo"),
|
||||||
URI.create("foo")));;
|
ImmutableSet.<String> of()));
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDatacenterToLocation() {
|
public void testDatacenterToLocation() {
|
||||||
|
|
Loading…
Reference in New Issue