Skip to content
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

Skip rules based endpoints for most services #3520

Merged
merged 9 commits into from Oct 27, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/next-release/bugfix-AWsSDKforJavav2-ddeebe8.json
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "AWs SDK for Java v2",
"contributor": "",
"description": "We are only enabling rules based endpoints for S3, S3Control, and EventBridge for now in order to roll back incorrect hostprefix handling in the Java SDK. EventBridge are unaffected by this issue because it does not have a `hostPrefix` in its service model. S3 and S3Control have `hostPrefix` in the model, it is handled by the rule set."
}
Expand Up @@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.codegen.emitters.GeneratorTask;
Expand Down Expand Up @@ -45,6 +46,10 @@ public EndpointProviderTasks(GeneratorTaskParams dependencies) {

@Override
protected List<GeneratorTask> createTasks() throws Exception {
if (!generatorTaskParams.getModel().getCustomizationConfig().useRuleBasedEndpoints()) {
return Collections.emptyList();
}

List<GeneratorTask> tasks = new ArrayList<>();
tasks.add(generateInterface());
tasks.add(generateParams());
Expand Down
Expand Up @@ -213,6 +213,11 @@ public class CustomizationConfig {

private boolean useGlobalEndpoint;

/**
* Whether Endpoints 2.0/rule based endpoints should be used for endpoint resolution.
*/
private boolean useRuleBasedEndpoints = false;

private CustomizationConfig() {
}

Expand Down Expand Up @@ -550,4 +555,11 @@ public void setSkipEndpointTests(Map<String, String> skipEndpointTests) {
this.skipEndpointTests = skipEndpointTests;
}

public boolean useRuleBasedEndpoints() {
return useRuleBasedEndpoints;
}

public void setUseRuleBasedEndpoints(boolean useRuleBasedEndpoints) {
this.useRuleBasedEndpoints = useRuleBasedEndpoints;
}
}
Expand Up @@ -68,7 +68,9 @@ public TypeSpec poetSpec() {
}
}

builder.addMethod(endpointProviderMethod());
if (endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addMethod(endpointProviderMethod());
}

if (BearerAuthUtils.usesBearerAuth(model)) {
builder.addMethod(bearerTokenProviderMethod());
Expand Down
Expand Up @@ -110,9 +110,11 @@ public TypeSpec poetSpec() {
builder.addMethod(finalizeServiceConfigurationMethod());
defaultAwsAuthSignerMethod().ifPresent(builder::addMethod);
builder.addMethod(signingNameMethod());
builder.addMethod(defaultEndpointProviderMethod());
if (endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addMethod(defaultEndpointProviderMethod());
}

if (hasClientContextParams()) {
if (hasClientContextParams() && endpointRulesSpecUtils.isEndpointRulesEnabled()) {
model.getClientContextParams().forEach((n, m) -> {
builder.addMethod(clientContextParamSetter(n, m));
});
Expand Down Expand Up @@ -184,9 +186,11 @@ private MethodSpec mergeServiceDefaultsMethod() {
.addModifiers(PROTECTED, FINAL)
.returns(SdkClientConfiguration.class)
.addParameter(SdkClientConfiguration.class, "config")
.addCode("return config.merge(c -> c")
.addCode(".option($T.ENDPOINT_PROVIDER, defaultEndpointProvider())",
SdkClientOption.class);
.addCode("return config.merge(c -> c");

if (endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addCode(".option($T.ENDPOINT_PROVIDER, defaultEndpointProvider())", SdkClientOption.class);
}

if (defaultAwsAuthSignerMethod().isPresent()) {
builder.addCode(".option($T.SIGNER, defaultSigner())\n", SdkAdvancedClientOption.class);
Expand Down Expand Up @@ -252,9 +256,11 @@ private MethodSpec finalizeServiceConfigurationMethod() {
ParameterizedTypeName.get(List.class, ExecutionInterceptor.class),
ArrayList.class);

builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.resolverInterceptorName());
builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.authSchemesInterceptorName());
builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.requestModifierInterceptorName());
if (endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.resolverInterceptorName());
builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.authSchemesInterceptorName());
builder.addStatement("endpointInterceptors.add(new $T())", endpointRulesSpecUtils.requestModifierInterceptorName());
}

builder.addCode("$1T interceptorFactory = new $1T();\n", ClasspathInterceptorChainFactory.class)
.addCode("$T<$T> interceptors = interceptorFactory.getInterceptors($S);\n",
Expand Down
Expand Up @@ -73,9 +73,8 @@ public TypeSpec poetSpec() {
builder.addMethod(serviceConfigurationConsumerBuilderMethod());
}

builder.addMethod(endpointProviderMethod());

if (hasClientContextParams()) {
if (hasClientContextParams() && endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addMethod(endpointProviderMethod());
model.getClientContextParams().forEach((n, m) -> {
builder.addMethod(clientContextParamSetter(n, m));
});
Expand Down
Expand Up @@ -68,7 +68,9 @@ public TypeSpec poetSpec() {
}
}

builder.addMethod(endpointProviderMethod());
if (endpointRulesSpecUtils.isEndpointRulesEnabled()) {
builder.addMethod(endpointProviderMethod());
}

if (BearerAuthUtils.usesBearerAuth(model)) {
builder.addMethod(tokenProviderMethodImpl());
Expand Down
Expand Up @@ -182,4 +182,8 @@ public boolean isS3Control() {
public TypeName resolverReturnType() {
return ParameterizedTypeName.get(CompletableFuture.class, Endpoint.class);
}

public boolean isEndpointRulesEnabled() {
return intermediateModel.getCustomizationConfig().useRuleBasedEndpoints();
}
}
Expand Up @@ -6,5 +6,6 @@
"Invalid EndpointId (empty)": "Need operationInputs for EndpointId param",
"Valid endpointId with fips disabled and dualstack true": "Need operationInputs for EndpointId param",
"Valid endpointId with custom sdk endpoint": "Need operationInputs for EndpointId param"
}
},
"useRuleBasedEndpoints": true
}
Expand Up @@ -235,6 +235,7 @@
]
},
"delegateAsyncClientClass": true,
"useGlobalEndpoint": true
"useGlobalEndpoint": true,
"useRuleBasedEndpoints": true
}
}
Expand Up @@ -53,5 +53,6 @@
"Accesspoint ARN with region mismatch and UseArnRegion unset": "SDK defaults to useArnRegion = false",
"Bucket ARN with region mismatch and UseArnRegion unset": "SDK defaults to useArnRegion = false",
"Accesspoint ARN with region mismatch, UseArnRegion=false and custom endpoint": "Does not work for client tests because operationInputs needed (so an operation that doesn't required AccountId is used)"
}
},
"useRuleBasedEndpoints": true
}
@@ -1,3 +1,4 @@
{
"skipEndpointTestGeneration": true
"skipEndpointTestGeneration": true,
"useRuleBasedEndpoints": true
}
Expand Up @@ -21,7 +21,6 @@

import java.net.URI;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
Expand Down Expand Up @@ -85,7 +84,6 @@ public void nullHostPrefix_shouldThrowException() {
}

@Test
@Disabled // TODO fix with S3 endpoints 2.0 update
public void syncValidHostPrefix_shouldPrefixEndpoint() {
mockHttpClient.stubNextResponse(HttpExecuteResponse.builder()
.response(SdkHttpResponse.builder().statusCode(200)
Expand All @@ -98,7 +96,6 @@ public void syncValidHostPrefix_shouldPrefixEndpoint() {
}

@Test
@Disabled // TODO fix with S3 endpoints 2.0 update
public void asyncValidHostPrefix_shouldPrefixEndpoint() {
mockAsyncClient.stubNextResponse(HttpExecuteResponse.builder()
.response(SdkHttpResponse.builder().statusCode(200)
Expand Down
Expand Up @@ -35,10 +35,10 @@
import software.amazon.awssdk.core.signer.Signer;
import software.amazon.awssdk.endpoints.Endpoint;
import software.amazon.awssdk.services.protocolquery.model.AllTypesRequest;
import software.amazon.awssdk.services.protocolquery.endpoints.internal.ProtocolQueryEndpointAuthSchemeInterceptor;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RestJsonEndpointProvidersEndpointAuthSchemeInterceptor;

public class EndpointAuthSchemeInterceptorTest {
private static final ExecutionInterceptor INTERCEPTOR = new ProtocolQueryEndpointAuthSchemeInterceptor();
private static final ExecutionInterceptor INTERCEPTOR = new RestJsonEndpointProvidersEndpointAuthSchemeInterceptor();

@Test
public void modifyRequest_sigV4Scheme_overridesCorrectSigner() {
Expand Down
@@ -1,27 +1,27 @@
package software.amazon.awssdk.services.rules;

import java.util.List;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.BooleanEqualsFn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Expr;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.ExprVisitor;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Fn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.FnVisitor;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.GetAttr;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.IsSet;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.IsValidHostLabel;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.IsVirtualHostableS3Bucket;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Literal;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Not;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.ParseArn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.ParseUrl;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.PartitionFn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Ref;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Rule;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.RuleValueVisitor;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.StringEqualsFn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Substring;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.UriEncodeFn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.BooleanEqualsFn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Expr;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ExprVisitor;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Fn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.FnVisitor;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.GetAttr;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsSet;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsValidHostLabel;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsVirtualHostableS3Bucket;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Literal;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Not;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParseArn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParseUrl;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.PartitionFn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Ref;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Rule;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleValueVisitor;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.StringEqualsFn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Substring;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.UriEncodeFn;

public abstract class DefaultVisitor<R> implements RuleValueVisitor<R>, ExprVisitor<R>, FnVisitor<R> {
public abstract R getDefault();
Expand Down
Expand Up @@ -6,13 +6,13 @@
import java.util.NoSuchElementException;
import java.util.Optional;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Identifier;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Parameter;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.ParameterType;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.RuleEngine;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.RuleError;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Value;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Parameter;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParameterType;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleEngine;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleError;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Value;
import software.amazon.awssdk.utils.Pair;

public class EndpointTest {
Expand Down
Expand Up @@ -4,7 +4,7 @@
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;

public class EndpointTestSuite {
public static final String SERVICE = "service";
Expand Down
Expand Up @@ -28,7 +28,7 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.rules.testutil.TestDiscovery;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
Expand Down
Expand Up @@ -22,10 +22,10 @@
import org.junit.jupiter.api.Test;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
import software.amazon.awssdk.protocols.jsoncore.JsonNodeParser;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Identifier;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.RuleEngine;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Value;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleEngine;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Value;
import software.amazon.awssdk.utils.MapUtils;

public class RuleEngineTest {
Expand Down
Expand Up @@ -2,12 +2,12 @@

import java.util.List;
import java.util.stream.Stream;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Condition;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Expr;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Fn;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Rule;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Condition;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Expr;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Fn;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Rule;

public abstract class TraversingVisitor<R> extends DefaultVisitor<Stream<R>> {
public Stream<R> visitRuleset(EndpointRuleset ruleset) {
Expand Down
Expand Up @@ -3,10 +3,10 @@
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Identifier;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Literal;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.Template;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Literal;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Template;

/**
* Validate that URIs start with a scheme
Expand Down
Expand Up @@ -13,7 +13,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
import software.amazon.awssdk.services.protocolrestjson.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset;
import software.amazon.awssdk.services.rules.EndpointTest;
import software.amazon.awssdk.services.rules.EndpointTestSuite;

Expand Down