Skip to content

Commit b815c13

Browse files
authored
Ignore unknown properties on endpoints in endpoint rules. (#6139)
* Ignore unknown properties on endpoints in endpoint rules. * Add changelog * Remove unrelated files * Fix failing test
1 parent a6be409 commit b815c13

File tree

6 files changed

+144
-1
lines changed

6 files changed

+144
-1
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Ignore unknown properties on endpoints in endpoint rules."
6+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodeGeneratorVisitor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@
2222
import java.util.List;
2323
import java.util.Map;
2424
import java.util.stream.Collectors;
25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
2527
import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute;
2628
import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme;
2729
import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme;
2830
import software.amazon.awssdk.codegen.model.config.customization.KeyTypePair;
2931
import software.amazon.awssdk.endpoints.Endpoint;
3032

3133
public class CodeGeneratorVisitor extends WalkRuleExpressionVisitor {
34+
private static final Logger log = LoggerFactory.getLogger(CodeGeneratorVisitor.class);
35+
3236
private final CodeBlock.Builder builder;
3337
private final RuleRuntimeTypeMirror typeMirror;
3438
private final SymbolTable symbolTable;
@@ -344,7 +348,7 @@ public Void visitPropertiesExpression(PropertiesExpression e) {
344348
} else if (knownEndpointAttributes.containsKey(k)) {
345349
addAttributeBlock(k, v);
346350
} else {
347-
throw new RuntimeException("unknown endpoint property: " + k);
351+
log.warn("Ignoring unknown endpoint property: {}", k);
348352
}
349353
});
350354
return null;

codegen/src/test/java/software/amazon/awssdk/codegen/poet/ClientTestModels.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,26 @@ public static IntermediateModel queryServiceModelsWithOverrideKnowProperties() {
175175
return new IntermediateModelBuilder(models).build();
176176
}
177177

178+
public static IntermediateModel queryServiceModelsWithUnknownEndpointProperties() {
179+
File serviceModel = new File(ClientTestModels.class.getResource("client/c2j/query/service-2.json").getFile());
180+
File waitersModel = new File(ClientTestModels.class.getResource("client/c2j/query/waiters-2.json").getFile());
181+
File endpointRuleSetModel =
182+
new File(ClientTestModels.class.getResource("client/c2j/query/endpoint-rule-set-unknown-properties.json").getFile());
183+
File endpointTestsModel =
184+
new File(ClientTestModels.class.getResource("client/c2j/query/endpoint-tests.json").getFile());
185+
186+
C2jModels models = C2jModels
187+
.builder()
188+
.serviceModel(getServiceModel(serviceModel))
189+
.waitersModel(getWaiters(waitersModel))
190+
.customizationConfig(CustomizationConfig.create())
191+
.endpointRuleSetModel(getEndpointRuleSet(endpointRuleSetModel))
192+
.endpointTestSuiteModel(getEndpointTestSuite(endpointTestsModel))
193+
.build();
194+
195+
return new IntermediateModelBuilder(models).build();
196+
}
197+
178198
public static IntermediateModel queryServiceModelsEndpointAuthParamsWithAllowList() {
179199
File serviceModel = new File(ClientTestModels.class.getResource("client/c2j/query/service-2.json").getFile());
180200
File customizationModel =

codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderCompiledRulesClassSpecTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,11 @@ void knowPropertiesOverride() {
3737
new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithOverrideKnowProperties());
3838
assertThat(endpointProviderSpec, generatesTo("endpoint-provider-know-prop-override-class.java"));
3939
}
40+
41+
@Test
42+
void unknownEndpointProperties() {
43+
ClassSpec endpointProviderSpec =
44+
new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithUnknownEndpointProperties());
45+
assertThat(endpointProviderSpec, generatesTo("endpoint-provider-unknown-property-class.java"));
46+
}
4047
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"version": "1.0",
3+
"parameters": {
4+
"Endpoint": {
5+
"builtIn": "SDK::Endpoint",
6+
"required": false,
7+
"documentation": "Override the endpoint used to send this request",
8+
"type": "String"
9+
}
10+
},
11+
"rules": [
12+
{
13+
"conditions": [
14+
{
15+
"fn": "isSet",
16+
"argv": [
17+
{
18+
"ref": "Endpoint"
19+
}
20+
]
21+
}
22+
],
23+
"rules": [
24+
{
25+
"conditions": [],
26+
"endpoint": {
27+
"url": {
28+
"ref": "Endpoint"
29+
},
30+
"properties": {
31+
"unknownProperty": "value"
32+
},
33+
"headers": {}
34+
},
35+
"type": "endpoint"
36+
}
37+
],
38+
"type": "tree"
39+
},
40+
{
41+
"conditions": [],
42+
"error": "Invalid Configuration: Missing Endpoint",
43+
"type": "error"
44+
}
45+
]
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package software.amazon.awssdk.services.query.endpoints.internal;
2+
3+
import java.net.URI;
4+
import java.util.concurrent.CompletableFuture;
5+
import software.amazon.awssdk.annotations.Generated;
6+
import software.amazon.awssdk.annotations.SdkInternalApi;
7+
import software.amazon.awssdk.core.exception.SdkClientException;
8+
import software.amazon.awssdk.endpoints.Endpoint;
9+
import software.amazon.awssdk.services.query.endpoints.QueryEndpointParams;
10+
import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider;
11+
import software.amazon.awssdk.utils.CompletableFutureUtils;
12+
13+
@Generated("software.amazon.awssdk:codegen")
14+
@SdkInternalApi
15+
public final class DefaultQueryEndpointProvider implements QueryEndpointProvider {
16+
@Override
17+
public CompletableFuture<Endpoint> resolveEndpoint(QueryEndpointParams params) {
18+
try {
19+
RuleResult result = endpointRule0(params);
20+
if (result.canContinue()) {
21+
throw SdkClientException.create("Rule engine did not reach an error or endpoint result");
22+
}
23+
if (result.isError()) {
24+
String errorMsg = result.error();
25+
if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) {
26+
errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest.";
27+
}
28+
throw SdkClientException.create(errorMsg);
29+
}
30+
return CompletableFuture.completedFuture(result.endpoint());
31+
} catch (Exception error) {
32+
return CompletableFutureUtils.failedFuture(error);
33+
}
34+
}
35+
36+
private static RuleResult endpointRule0(QueryEndpointParams params) {
37+
RuleResult result = endpointRule1(params);
38+
if (result.isResolved()) {
39+
return result;
40+
}
41+
return RuleResult.error("Invalid Configuration: Missing Endpoint");
42+
}
43+
44+
private static RuleResult endpointRule1(QueryEndpointParams params) {
45+
if (params.endpoint() != null) {
46+
return RuleResult.endpoint(Endpoint.builder().url(URI.create(params.endpoint())).build());
47+
}
48+
return RuleResult.carryOn();
49+
}
50+
51+
@Override
52+
public boolean equals(Object rhs) {
53+
return rhs != null && getClass().equals(rhs.getClass());
54+
}
55+
56+
@Override
57+
public int hashCode() {
58+
return getClass().hashCode();
59+
}
60+
}

0 commit comments

Comments
 (0)