Skip to content

Improved messaging for all UnknownHostExceptions. Added ServiceMetadata.servicePartitions() #1602

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/next-release/feature-AWSSDKforJavav2-2d730bf.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "feature",
"category": "AWS SDK for Java v2",
"description": "Added ServiceMetadata.servicePartitions() to get partition metadata for a specific service"
}
5 changes: 5 additions & 0 deletions .changes/next-release/feature-AWSSDKforJavav2-f60cd7d.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "feature",
"category": "AWS SDK for Java v2",
"description": "Improved error messages on UnknownHostExceptions"
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,7 @@ public void generateServiceMetadata(Path baseSourcesDirectory, Partitions partit
Set<String> services = new HashSet<>();
partitions.getPartitions().forEach(p -> services.addAll(p.getServices().keySet()));

services.stream()
// Use hardcoded file for elasticache until the incorrect fips endpoint is fixed
//TODO Remove once elasticache endpoints are fixed at source
.filter(s -> !"elasticache".equals(s))
.forEach(s -> new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataGenerator(partitions,
services.forEach(s -> new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataGenerator(partitions,
s,
SERVICE_METADATA_BASE,
REGION_BASE))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,16 @@
public class ServiceMetadataGenerator implements PoetClass {

private final Partitions partitions;
private final String service;
private final String serviceEndpointPrefix;
private final String basePackage;
private final String regionBasePackage;

public ServiceMetadataGenerator(Partitions partitions,
String service,
String serviceEndpointPrefix,
String basePackage,
String regionBasePackage) {
this.partitions = partitions;
this.service = service;
this.serviceEndpointPrefix = serviceEndpointPrefix;
this.basePackage = basePackage;
this.regionBasePackage = regionBasePackage;
}
Expand All @@ -68,6 +68,8 @@ public ServiceMetadataGenerator(Partitions partitions,
public TypeSpec poetClass() {
TypeName listOfRegions = ParameterizedTypeName.get(ClassName.get(List.class), ClassName.get(regionBasePackage, "Region"));
TypeName mapOfStringString = ParameterizedTypeName.get(Map.class, String.class, String.class);
TypeName listOfServicePartitionMetadata =
ParameterizedTypeName.get(ClassName.get(List.class), ClassName.get(regionBasePackage, "ServicePartitionMetadata"));

return TypeSpec.classBuilder(className())
.addModifiers(Modifier.PUBLIC)
Expand All @@ -79,7 +81,7 @@ public TypeSpec poetClass() {
.addSuperinterface(ClassName.get(regionBasePackage, "ServiceMetadata"))
.addField(FieldSpec.builder(String.class, "ENDPOINT_PREFIX")
.addModifiers(PRIVATE, FINAL, STATIC)
.initializer("$S", service)
.initializer("$S", serviceEndpointPrefix)
.build())
.addField(FieldSpec.builder(mapOfStringString, "PARTITION_OVERRIDDEN_ENDPOINTS")
.addModifiers(PRIVATE, FINAL, STATIC)
Expand All @@ -97,15 +99,20 @@ public TypeSpec poetClass() {
.addModifiers(PRIVATE, FINAL, STATIC)
.initializer(signingRegionOverrides(partitions))
.build())
.addField(FieldSpec.builder(listOfServicePartitionMetadata, "PARTITIONS")
.addModifiers(PRIVATE, FINAL, STATIC)
.initializer(servicePartitions(partitions))
.build())
.addMethod(regions())
.addMethod(endpointFor())
.addMethod(signingRegion())
.addMethod(partitions(listOfServicePartitionMetadata))
.build();
}

@Override
public ClassName className() {
String sanitizedServiceName = service.replace(".", "-");
String sanitizedServiceName = serviceEndpointPrefix.replace(".", "-");
return ClassName.get(basePackage, Stream.of(sanitizedServiceName.split("-"))
.map(Utils::capitalize)
.collect(Collectors.joining()) + "ServiceMetadata");
Expand Down Expand Up @@ -150,8 +157,8 @@ private CodeBlock regionsField(Partitions partitions) {

partitions.getPartitions()
.stream()
.filter(p -> p.getServices().containsKey(service))
.forEach(p -> regions.addAll(p.getServices().get(service).getEndpoints().keySet()
.filter(p -> p.getServices().containsKey(serviceEndpointPrefix))
.forEach(p -> regions.addAll(p.getServices().get(serviceEndpointPrefix).getEndpoints().keySet()
.stream()
.filter(r -> RegionValidationUtil.validRegion(r, p.getRegionRegex()))
.collect(Collectors.toList())));
Expand Down Expand Up @@ -185,6 +192,39 @@ private CodeBlock signingRegionOverrides(Partitions partitions) {
return builder.add(".build()").build();
}

private CodeBlock servicePartitions(Partitions partitions) {
return CodeBlock.builder()
.add("$T.unmodifiableList($T.asList(", Collections.class, Arrays.class)
.add(commaSeparatedServicePartitions(partitions))
.add("))")
.build();
}

private CodeBlock commaSeparatedServicePartitions(Partitions partitions) {
ClassName defaultServicePartitionMetadata = ClassName.get(regionBasePackage + ".internal",
"DefaultServicePartitionMetadata");
return partitions.getPartitions()
.stream()
.filter(p -> p.getServices().containsKey(serviceEndpointPrefix))
.map(p -> CodeBlock.of("new $T($S, $L)",
defaultServicePartitionMetadata,
p.getPartition(),
globalRegion(p)))
.collect(CodeBlock.joining(","));
}

private CodeBlock globalRegion(Partition partition) {
ClassName region = ClassName.get(regionBasePackage, "Region");
Service service = partition.getServices().get(this.serviceEndpointPrefix);
boolean hasGlobalRegionForPartition = service.isRegionalized() != null &&
!service.isRegionalized() &&
service.isPartitionWideEndpointAvailable();
String globalRegionForPartition = hasGlobalRegionForPartition ? service.getPartitionEndpoint() : null;
return globalRegionForPartition == null
? CodeBlock.of("null")
: CodeBlock.of("$T.of($S)", region, globalRegionForPartition);
}

private MethodSpec regions() {
TypeName listOfRegions = ParameterizedTypeName.get(ClassName.get(List.class),
ClassName.get(regionBasePackage, "Region"));
Expand Down Expand Up @@ -219,14 +259,23 @@ private MethodSpec signingRegion() {
.build();
}

private MethodSpec partitions(TypeName listOfServicePartitionMetadata) {
return MethodSpec.methodBuilder("servicePartitions")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(listOfServicePartitionMetadata)
.addStatement("return $L", "PARTITIONS")
.build();
}

private Map<Partition, Service> getServiceData(Partitions partitions) {
Map<Partition, Service> serviceData = new TreeMap<>(Comparator.comparing(Partition::getPartition));

partitions.getPartitions()
.forEach(p -> p.getServices()
.entrySet()
.stream()
.filter(s -> s.getKey().equalsIgnoreCase(service))
.filter(s -> s.getKey().equalsIgnoreCase(serviceEndpointPrefix))
.forEach(s -> serviceData.put(p, s.getValue())));

return serviceData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public final class Service {
/**
* Returns true if the service is regionalized.
*/
private boolean isRegionalized;
private Boolean isRegionalized;

public Service() {}

Expand Down Expand Up @@ -99,15 +99,15 @@ public void setPartitionEndpoint(String partitionEndpoint) {
/**
* returns true if the service is regionalized.
*/
public boolean isRegionalized() {
public Boolean isRegionalized() {
return isRegionalized;
}

/**
* sets the regionalized property for a service..
*/
@JsonProperty(value = "isRegionalized")
public void setIsRegionalized(boolean regionalized) {
public void setIsRegionalized(Boolean regionalized) {
isRegionalized = regionalized;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.regions.ServicePartitionMetadata;
import software.amazon.awssdk.regions.internal.DefaultServicePartitionMetadata;
import software.amazon.awssdk.utils.ImmutableMap;

@Generated("software.amazon.awssdk:codegen")
Expand All @@ -19,22 +21,26 @@ public final class S3ServiceMetadata implements ServiceMetadata {
private static final Map<String, String> PARTITION_OVERRIDDEN_ENDPOINTS = ImmutableMap.<String, String> builder().build();

private static final Map<String, String> REGION_OVERRIDDEN_ENDPOINTS = ImmutableMap.<String, String> builder()
.put("ap-northeast-1", "s3.ap-northeast-1.amazonaws.com").put("ap-southeast-1", "s3.ap-southeast-1.amazonaws.com")
.put("ap-southeast-2", "s3.ap-southeast-2.amazonaws.com").put("eu-west-1", "s3.eu-west-1.amazonaws.com")
.put("sa-east-1", "s3.sa-east-1.amazonaws.com").put("us-east-1", "s3.amazonaws.com")
.put("us-west-1", "s3.us-west-1.amazonaws.com").put("us-west-2", "s3.us-west-2.amazonaws.com")
.put("fips-us-gov-west-1", "s3-fips-us-gov-west-1.amazonaws.com")
.put("us-gov-west-1", "s3.us-gov-west-1.amazonaws.com").build();
.put("ap-northeast-1", "s3.ap-northeast-1.amazonaws.com").put("ap-southeast-1", "s3.ap-southeast-1.amazonaws.com")
.put("ap-southeast-2", "s3.ap-southeast-2.amazonaws.com").put("eu-west-1", "s3.eu-west-1.amazonaws.com")
.put("sa-east-1", "s3.sa-east-1.amazonaws.com").put("us-east-1", "s3.amazonaws.com")
.put("us-west-1", "s3.us-west-1.amazonaws.com").put("us-west-2", "s3.us-west-2.amazonaws.com")
.put("fips-us-gov-west-1", "s3-fips-us-gov-west-1.amazonaws.com")
.put("us-gov-west-1", "s3.us-gov-west-1.amazonaws.com").build();

private static final List<Region> REGIONS = Collections.unmodifiableList(Arrays.asList(Region.of("ap-northeast-1"),
Region.of("ap-northeast-2"), Region.of("ap-northeast-3"), Region.of("ap-south-1"), Region.of("ap-southeast-1"),
Region.of("ap-southeast-2"), Region.of("ca-central-1"), Region.of("eu-central-1"), Region.of("eu-west-1"),
Region.of("eu-west-2"), Region.of("eu-west-3"), Region.of("sa-east-1"), Region.of("us-east-1"),
Region.of("us-east-2"), Region.of("us-west-1"), Region.of("us-west-2"), Region.of("cn-north-1"),
Region.of("cn-northwest-1"), Region.of("fips-us-gov-west-1"), Region.of("us-gov-west-1")));
Region.of("ap-northeast-2"), Region.of("ap-northeast-3"), Region.of("ap-south-1"), Region.of("ap-southeast-1"),
Region.of("ap-southeast-2"), Region.of("ca-central-1"), Region.of("eu-central-1"), Region.of("eu-west-1"),
Region.of("eu-west-2"), Region.of("eu-west-3"), Region.of("sa-east-1"), Region.of("us-east-1"),
Region.of("us-east-2"), Region.of("us-west-1"), Region.of("us-west-2"), Region.of("cn-north-1"),
Region.of("cn-northwest-1"), Region.of("fips-us-gov-west-1"), Region.of("us-gov-west-1")));

private static final Map<String, String> SIGNING_REGION_OVERRIDES = ImmutableMap.<String, String> builder()
.put("fips-us-gov-west-1", "us-gov-west-1").build();
.put("fips-us-gov-west-1", "us-gov-west-1").build();

private static final List<ServicePartitionMetadata> PARTITIONS = Collections.unmodifiableList(Arrays.asList(
new DefaultServicePartitionMetadata("aws", null), new DefaultServicePartitionMetadata("aws-cn", null),
new DefaultServicePartitionMetadata("aws-us-gov", null)));

@Override
public List<Region> regions() {
Expand All @@ -44,11 +50,16 @@ public List<Region> regions() {
@Override
public URI endpointFor(Region region) {
return URI.create(REGION_OVERRIDDEN_ENDPOINTS.containsKey(region.id()) ? REGION_OVERRIDDEN_ENDPOINTS.get(region.id())
: computeEndpoint(ENDPOINT_PREFIX, PARTITION_OVERRIDDEN_ENDPOINTS, region));
: computeEndpoint(ENDPOINT_PREFIX, PARTITION_OVERRIDDEN_ENDPOINTS, region));
}

@Override
public Region signingRegion(Region region) {
return Region.of(SIGNING_REGION_OVERRIDES.getOrDefault(region.id(), region.id()));
}

@Override
public List<ServicePartitionMetadata> servicePartitions() {
return PARTITIONS;
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,3 @@
/*
* Copyright 2010-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.regions.servicemetadata;

import java.net.URI;
Expand All @@ -24,6 +9,8 @@
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.regions.ServicePartitionMetadata;
import software.amazon.awssdk.regions.internal.DefaultServicePartitionMetadata;
import software.amazon.awssdk.utils.ImmutableMap;

@Generated("software.amazon.awssdk:codegen")
Expand Down Expand Up @@ -51,6 +38,10 @@ public final class StsServiceMetadata implements ServiceMetadata {
.put("ap-northeast-2", "ap-northeast-2").put("us-east-1-fips", "us-east-1").put("us-east-2-fips", "us-east-2")
.put("us-west-1-fips", "us-west-1").put("us-west-2-fips", "us-west-2").build();

private static final List<ServicePartitionMetadata> PARTITIONS = Collections.unmodifiableList(Arrays.asList(
new DefaultServicePartitionMetadata("aws", null), new DefaultServicePartitionMetadata("aws-cn", null),
new DefaultServicePartitionMetadata("aws-us-gov", null)));

@Override
public List<Region> regions() {
return REGIONS;
Expand All @@ -66,4 +57,9 @@ public URI endpointFor(Region region) {
public Region signingRegion(Region region) {
return Region.of(SIGNING_REGION_OVERRIDES.getOrDefault(region.id(), region.id()));
}

@Override
public List<ServicePartitionMetadata> servicePartitions() {
return PARTITIONS;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
import software.amazon.awssdk.core.interceptor.ExecutionAttribute;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
Expand All @@ -33,5 +34,10 @@ public final class AwsExecutionAttribute extends SdkExecutionAttribute {
*/
public static final ExecutionAttribute<Region> AWS_REGION = new ExecutionAttribute<>("AwsRegion");

/**
* The {@link AwsClientOption#ENDPOINT_PREFIX} for the client.
*/
public static final ExecutionAttribute<String> ENDPOINT_PREFIX = new ExecutionAttribute<>("AwsEndpointPrefix");

private AwsExecutionAttribute() {}
}
Loading