Skip to content

Commit 70fa31a

Browse files
authored
Leverage SdkClientOption and SdkExecutionAttributes; fallback to simp… (#3692)
* Leverage SdkClientOption and SdkExecutionAttributes; fallback to simple ProfileFile * Addressed review comments
1 parent 77e45cf commit 70fa31a

File tree

22 files changed

+289
-44
lines changed

22 files changed

+289
-44
lines changed

core/auth/src/main/java/software/amazon/awssdk/auth/credentials/ProfileProviderCredentialsContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import software.amazon.awssdk.profiles.ProfileFile;
2323

2424
/**
25-
* Context class that defines the required properties for creation of a Credentials provider*
25+
* Context class that defines the required properties for creation of a Credentials provider.
2626
*/
2727
@SdkProtectedApi
2828
public final class ProfileProviderCredentialsContext {

core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Arrays;
2222
import java.util.List;
2323
import java.util.Optional;
24+
import java.util.function.Supplier;
2425
import software.amazon.awssdk.annotations.SdkProtectedApi;
2526
import software.amazon.awssdk.annotations.SdkTestInternalApi;
2627
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
@@ -245,7 +246,7 @@ private URI resolveEndpoint(SdkClientConfiguration config) {
245246
private URI endpointFromConfig(SdkClientConfiguration config) {
246247
return new DefaultServiceEndpointBuilder(serviceEndpointPrefix(), DEFAULT_ENDPOINT_PROTOCOL)
247248
.withRegion(config.option(AwsClientOption.AWS_REGION))
248-
.withProfileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
249+
.withProfileFile(profileFileSupplierOrFallbackToProfileFile(config))
249250
.withProfileName(config.option(SdkClientOption.PROFILE_NAME))
250251
.putAdvancedOption(ServiceMetadataAdvancedOption.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT,
251252
config.option(ServiceMetadataAdvancedOption.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT))
@@ -272,10 +273,10 @@ private Region regionFromDefaultProvider(SdkClientConfiguration config) {
272273
throw new IllegalStateException("No region was configured, and use-region-provider-chain was disabled.");
273274
}
274275

275-
ProfileFile profileFile = config.option(SdkClientOption.PROFILE_FILE);
276+
Supplier<ProfileFile> profileFile = profileFileSupplierOrFallbackToProfileFile(config);
276277
String profileName = config.option(SdkClientOption.PROFILE_NAME);
277278
return DefaultAwsRegionProviderChain.builder()
278-
.profileFile(() -> profileFile)
279+
.profileFile(profileFile)
279280
.profileName(profileName)
280281
.build()
281282
.getRegion();
@@ -286,7 +287,7 @@ private DefaultsMode resolveDefaultsMode(SdkClientConfiguration config) {
286287
config.option(AwsClientOption.DEFAULTS_MODE) != null ?
287288
config.option(AwsClientOption.DEFAULTS_MODE) :
288289
DefaultsModeResolver.create()
289-
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
290+
.profileFile(profileFileSupplierOrFallbackToProfileFile(config))
290291
.profileName(config.option(SdkClientOption.PROFILE_NAME))
291292
.resolve();
292293

@@ -313,10 +314,10 @@ private Boolean resolveDualstackEndpointEnabled(SdkClientConfiguration config) {
313314
* Load the dualstack endpoint setting from the default provider logic.
314315
*/
315316
private Boolean resolveUseDualstackFromDefaultProvider(SdkClientConfiguration config) {
316-
ProfileFile profileFile = config.option(SdkClientOption.PROFILE_FILE);
317+
Supplier<ProfileFile> profileFile = profileFileSupplierOrFallbackToProfileFile(config);
317318
String profileName = config.option(SdkClientOption.PROFILE_NAME);
318319
return DualstackEnabledProvider.builder()
319-
.profileFile(() -> profileFile)
320+
.profileFile(profileFile)
320321
.profileName(profileName)
321322
.build()
322323
.isDualstackEnabled()
@@ -336,10 +337,10 @@ private Boolean resolveFipsEndpointEnabled(SdkClientConfiguration config) {
336337
* Load the dualstack endpoint setting from the default provider logic.
337338
*/
338339
private Boolean resolveUseFipsFromDefaultProvider(SdkClientConfiguration config) {
339-
ProfileFile profileFile = config.option(SdkClientOption.PROFILE_FILE);
340+
Supplier<ProfileFile> profileFile = profileFileSupplierOrFallbackToProfileFile(config);
340341
String profileName = config.option(SdkClientOption.PROFILE_NAME);
341342
return FipsEnabledProvider.builder()
342-
.profileFile(() -> profileFile)
343+
.profileFile(profileFile)
343344
.profileName(profileName)
344345
.build()
345346
.isFipsEnabled()
@@ -353,7 +354,7 @@ private AwsCredentialsProvider resolveCredentials(SdkClientConfiguration config)
353354
return config.option(AwsClientOption.CREDENTIALS_PROVIDER) != null
354355
? config.option(AwsClientOption.CREDENTIALS_PROVIDER)
355356
: DefaultCredentialsProvider.builder()
356-
.profileFile(config.option(SdkClientOption.PROFILE_FILE))
357+
.profileFile(config.option(SdkClientOption.PROFILE_FILE_SUPPLIER))
357358
.profileName(config.option(SdkClientOption.PROFILE_NAME))
358359
.build();
359360
}
@@ -370,7 +371,7 @@ private RetryPolicy resolveAwsRetryPolicy(SdkClientConfiguration config) {
370371
}
371372

372373
RetryMode retryMode = RetryMode.resolver()
373-
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
374+
.profileFile(profileFileSupplierOrFallbackToProfileFile(config))
374375
.profileName(config.option(SdkClientOption.PROFILE_NAME))
375376
.defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE))
376377
.resolve();
@@ -466,4 +467,13 @@ private static Pair<Region, Optional<Boolean>> transformFipsPseudoRegionIfNecess
466467

467468
return Pair.of(region, Optional.empty());
468469
}
470+
471+
private Supplier<ProfileFile> profileFileSupplierOrFallbackToProfileFile(SdkClientConfiguration config) {
472+
Supplier<ProfileFile> profileFile = config.option(SdkClientOption.PROFILE_FILE_SUPPLIER);
473+
if (profileFile != null) {
474+
return profileFile;
475+
}
476+
477+
return () -> config.option(SdkClientOption.PROFILE_FILE);
478+
}
469479
}

core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ private AwsExecutionContextBuilder() {
8383
.putAttribute(SdkExecutionAttribute.CLIENT_TYPE, clientConfig.option(SdkClientOption.CLIENT_TYPE))
8484
.putAttribute(SdkExecutionAttribute.SERVICE_NAME, clientConfig.option(SdkClientOption.SERVICE_NAME))
8585
.putAttribute(SdkExecutionAttribute.PROFILE_FILE, clientConfig.option(SdkClientOption.PROFILE_FILE))
86+
.putAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER, clientConfig.option(SdkClientOption.PROFILE_FILE_SUPPLIER))
8687
.putAttribute(SdkExecutionAttribute.PROFILE_NAME, clientConfig.option(SdkClientOption.PROFILE_NAME))
8788
.putAttribute(AwsExecutionAttribute.DUALSTACK_ENDPOINT_ENABLED,
8889
clientConfig.option(AwsClientOption.DUALSTACK_ENDPOINT_ENABLED))

core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Collections;
2626
import java.util.List;
2727
import java.util.Optional;
28+
import java.util.function.Supplier;
2829
import org.junit.Before;
2930
import org.junit.Test;
3031
import org.junit.runner.RunWith;
@@ -48,6 +49,7 @@
4849
import software.amazon.awssdk.core.interceptor.trait.HttpChecksum;
4950
import software.amazon.awssdk.core.internal.util.HttpChecksumUtils;
5051
import software.amazon.awssdk.core.signer.Signer;
52+
import software.amazon.awssdk.profiles.ProfileFile;
5153

5254
@RunWith(MockitoJUnitRunner.class)
5355
public class AwsExecutionContextBuilderTest {
@@ -178,6 +180,22 @@ public void invokeInterceptorsAndCreateExecutionContext_multipleExecutionContext
178180
assertThat(checksumSpecs1).isNotSameAs(checksumSpecs2);
179181
assertThat(checksumSpecs2).isSameAs(checksumSpecs3);
180182
}
183+
184+
@Test
185+
public void invokeInterceptorsAndCreateExecutionContext_profileFileSupplier_storesValueInExecutionAttributes() {
186+
ClientExecutionParams<SdkRequest, SdkResponse> executionParams = clientExecutionParams();
187+
Supplier<ProfileFile> profileFileSupplier = () -> null;
188+
SdkClientConfiguration clientConfig = testClientConfiguration()
189+
.option(SdkClientOption.PROFILE_FILE_SUPPLIER, profileFileSupplier)
190+
.build();
191+
192+
ExecutionContext executionContext =
193+
AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams, clientConfig);
194+
195+
ExecutionAttributes executionAttributes = executionContext.executionAttributes();
196+
197+
assertThat(profileFileSupplier).isSameAs(executionAttributes.getAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER));
198+
}
181199

182200
private ClientExecutionParams<SdkRequest, SdkResponse> clientExecutionParams() {
183201
return new ClientExecutionParams<SdkRequest, SdkResponse>()

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/builder/SdkDefaultClientBuilder.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import static software.amazon.awssdk.core.client.config.SdkClientOption.INTERNAL_USER_AGENT;
3737
import static software.amazon.awssdk.core.client.config.SdkClientOption.METRIC_PUBLISHERS;
3838
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_FILE;
39+
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_FILE_SUPPLIER;
3940
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_NAME;
4041
import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_POLICY;
4142
import static software.amazon.awssdk.core.client.config.SdkClientOption.SCHEDULED_EXECUTOR_SERVICE;
@@ -86,6 +87,7 @@
8687
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
8788
import software.amazon.awssdk.metrics.MetricPublisher;
8889
import software.amazon.awssdk.profiles.ProfileFile;
90+
import software.amazon.awssdk.profiles.ProfileFileSupplier;
8991
import software.amazon.awssdk.profiles.ProfileFileSystemSetting;
9092
import software.amazon.awssdk.utils.AttributeMap;
9193
import software.amazon.awssdk.utils.Either;
@@ -231,6 +233,9 @@ private SdkClientConfiguration setOverrides(SdkClientConfiguration configuration
231233
builder.option(DISABLE_HOST_PREFIX_INJECTION,
232234
clientOverrideConfiguration.advancedOption(DISABLE_HOST_PREFIX_INJECTION).orElse(null));
233235
builder.option(PROFILE_FILE, clientOverrideConfiguration.defaultProfileFile().orElse(null));
236+
builder.option(PROFILE_FILE_SUPPLIER, clientOverrideConfiguration.defaultProfileFile()
237+
.map(ProfileFileSupplier::fixedProfileFile)
238+
.orElse(null));
234239
builder.option(PROFILE_NAME, clientOverrideConfiguration.defaultProfileName().orElse(null));
235240
builder.option(METRIC_PUBLISHERS, clientOverrideConfiguration.metricPublishers());
236241
builder.option(EXECUTION_ATTRIBUTES, clientOverrideConfiguration.executionAttributes());
@@ -261,11 +266,15 @@ protected SdkClientConfiguration mergeChildDefaults(SdkClientConfiguration confi
261266
private SdkClientConfiguration mergeGlobalDefaults(SdkClientConfiguration configuration) {
262267
// Don't load the default profile file if the customer already gave us one.
263268
ProfileFile configuredProfileFile = configuration.option(PROFILE_FILE);
264-
ProfileFile profileFile = configuredProfileFile != null ? configuredProfileFile : ProfileFile.defaultProfileFile();
269+
ProfileFile profileFile = Optional.ofNullable(configuredProfileFile).orElse(ProfileFile.defaultProfileFile());
270+
271+
Supplier<ProfileFile> configuredProfileFileSupplier = configuration.option(PROFILE_FILE_SUPPLIER);
272+
Supplier<ProfileFile> profileFileSupplier = Optional.ofNullable(configuredProfileFileSupplier).orElse(() -> profileFile);
265273

266274
return configuration.merge(c -> c.option(EXECUTION_INTERCEPTORS, new ArrayList<>())
267275
.option(ADDITIONAL_HTTP_HEADERS, new LinkedHashMap<>())
268276
.option(PROFILE_FILE, profileFile)
277+
.option(PROFILE_FILE_SUPPLIER, profileFileSupplier)
269278
.option(PROFILE_NAME, ProfileFileSystemSetting.AWS_PROFILE.getStringValueOrThrow())
270279
.option(USER_AGENT_PREFIX, SdkUserAgent.create().userAgent())
271280
.option(USER_AGENT_SUFFIX, "")
@@ -330,7 +339,9 @@ private RetryPolicy resolveRetryPolicy(SdkClientConfiguration config) {
330339
}
331340

332341
RetryMode retryMode = RetryMode.resolver()
333-
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
342+
.profileFile(config.option(SdkClientOption.PROFILE_FILE_SUPPLIER) != null ?
343+
config.option(SdkClientOption.PROFILE_FILE_SUPPLIER) :
344+
() -> config.option(SdkClientOption.PROFILE_FILE))
334345
.profileName(config.option(SdkClientOption.PROFILE_NAME))
335346
.defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE))
336347
.resolve();

core/sdk-core/src/main/java/software/amazon/awssdk/core/endpointdiscovery/providers/DefaultEndpointDiscoveryProviderChain.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ public DefaultEndpointDiscoveryProviderChain() {
3030
}
3131

3232
public DefaultEndpointDiscoveryProviderChain(SdkClientConfiguration clientConfiguration) {
33-
this(() -> clientConfiguration.option(SdkClientOption.PROFILE_FILE),
33+
this(clientConfiguration.option(SdkClientOption.PROFILE_FILE_SUPPLIER) != null ?
34+
clientConfiguration.option(SdkClientOption.PROFILE_FILE_SUPPLIER) :
35+
() -> clientConfiguration.option(SdkClientOption.PROFILE_FILE),
3436
clientConfiguration.option(SdkClientOption.PROFILE_NAME));
3537
}
3638

core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkExecutionAttribute.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.core.interceptor;
1717

1818
import java.net.URI;
19+
import java.util.function.Supplier;
1920
import software.amazon.awssdk.annotations.SdkPublicApi;
2021
import software.amazon.awssdk.core.ClientType;
2122
import software.amazon.awssdk.core.ServiceConfiguration;
@@ -77,6 +78,9 @@ public class SdkExecutionAttribute {
7778

7879
public static final ExecutionAttribute<ProfileFile> PROFILE_FILE = new ExecutionAttribute<>("ProfileFile");
7980

81+
public static final ExecutionAttribute<Supplier<ProfileFile>> PROFILE_FILE_SUPPLIER =
82+
new ExecutionAttribute<>("ProfileFileSupplier");
83+
8084
public static final ExecutionAttribute<String> PROFILE_NAME = new ExecutionAttribute<>("ProfileName");
8185

8286
/**

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/handler/BaseClientHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ private static InterceptorContext runModifyHttpRequestAndHttpContentInterceptors
201201
clientConfiguration.option(SdkClientOption.SERVICE_CONFIGURATION))
202202
.putAttribute(SdkExecutionAttribute.SERVICE_NAME, clientConfiguration.option(SdkClientOption.SERVICE_NAME))
203203
.putAttribute(SdkExecutionAttribute.PROFILE_FILE, clientConfiguration.option(SdkClientOption.PROFILE_FILE))
204+
.putAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER,
205+
clientConfiguration.option(SdkClientOption.PROFILE_FILE_SUPPLIER))
204206
.putAttribute(SdkExecutionAttribute.PROFILE_NAME, clientConfiguration.option(SdkClientOption.PROFILE_NAME));
205207

206208
ExecutionInterceptorChain interceptorChain =

core/sdk-core/src/test/java/software/amazon/awssdk/core/client/builder/DefaultClientBuilderTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static software.amazon.awssdk.core.client.config.SdkClientOption.EXECUTION_INTERCEPTORS;
3636
import static software.amazon.awssdk.core.client.config.SdkClientOption.METRIC_PUBLISHERS;
3737
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_FILE;
38+
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_FILE_SUPPLIER;
3839
import static software.amazon.awssdk.core.client.config.SdkClientOption.PROFILE_NAME;
3940
import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_POLICY;
4041
import static software.amazon.awssdk.core.internal.SdkInternalTestAdvancedClientOption.ENDPOINT_OVERRIDDEN_OVERRIDE;
@@ -59,12 +60,11 @@
5960
import org.mockito.junit.MockitoJUnitRunner;
6061
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
6162
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
62-
import software.amazon.awssdk.core.client.config.SdkClientOption;
6363
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
64+
import software.amazon.awssdk.core.client.config.SdkClientOption;
6465
import software.amazon.awssdk.core.interceptor.ExecutionAttribute;
6566
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
6667
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
67-
import software.amazon.awssdk.core.retry.RetryMode;
6868
import software.amazon.awssdk.core.retry.RetryPolicy;
6969
import software.amazon.awssdk.core.signer.NoOpSigner;
7070
import software.amazon.awssdk.core.signer.Signer;
@@ -261,6 +261,7 @@ public void close() {
261261
assertThat(config.option(API_CALL_ATTEMPT_TIMEOUT)).isEqualTo(apiCallAttemptTimeout);
262262
assertThat(config.option(DISABLE_HOST_PREFIX_INJECTION)).isEqualTo(Boolean.TRUE);
263263
assertThat(config.option(PROFILE_FILE)).isEqualTo(profileFile);
264+
assertThat(config.option(PROFILE_FILE_SUPPLIER).get()).isEqualTo(profileFile);
264265
assertThat(config.option(PROFILE_NAME)).isEqualTo(profileName);
265266
assertThat(config.option(METRIC_PUBLISHERS)).contains(metricPublisher);
266267
assertThat(config.option(EXECUTION_ATTRIBUTES).getAttribute(execAttribute)).isEqualTo("value");

services/docdb/src/main/java/software/amazon/awssdk/services/docdb/internal/RdsPresignInterceptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ private URI createEndpoint(String regionName, String serviceName, ExecutionAttri
162162

163163
return new DefaultServiceEndpointBuilder(SERVICE_NAME, Protocol.HTTPS.toString())
164164
.withRegion(region)
165-
.withProfileFile(() -> attributes.getAttribute(SdkExecutionAttribute.PROFILE_FILE))
165+
.withProfileFile(attributes.getAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER) != null ?
166+
attributes.getAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER) :
167+
() -> attributes.getAttribute(SdkExecutionAttribute.PROFILE_FILE))
166168
.withProfileName(attributes.getAttribute(SdkExecutionAttribute.PROFILE_NAME))
167169
.withDualstackEnabled(attributes.getAttribute(AwsExecutionAttribute.DUALSTACK_ENDPOINT_ENABLED))
168170
.withFipsEnabled(attributes.getAttribute(AwsExecutionAttribute.FIPS_ENDPOINT_ENABLED))

services/docdb/src/test/java/software/amazon/awssdk/services/docdb/internal/PresignRequestHandlerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ private ExecutionAttributes executionAttributes() {
165165
return new ExecutionAttributes().putAttribute(AwsSignerExecutionAttribute.AWS_CREDENTIALS, CREDENTIALS)
166166
.putAttribute(AwsSignerExecutionAttribute.SIGNING_REGION, DESTINATION_REGION)
167167
.putAttribute(SdkExecutionAttribute.PROFILE_FILE, ProfileFile.defaultProfileFile())
168+
.putAttribute(SdkExecutionAttribute.PROFILE_FILE_SUPPLIER,
169+
ProfileFile::defaultProfileFile)
168170
.putAttribute(SdkExecutionAttribute.PROFILE_NAME, "default");
169171
}
170172

services/dynamodb/src/main/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicy.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ public static RetryPolicy resolveRetryPolicy(SdkClientConfiguration config) {
6464
}
6565

6666
RetryMode retryMode = RetryMode.resolver()
67-
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
67+
.profileFile(config.option(SdkClientOption.PROFILE_FILE_SUPPLIER) != null ?
68+
config.option(SdkClientOption.PROFILE_FILE_SUPPLIER) :
69+
() -> config.option(SdkClientOption.PROFILE_FILE))
6870
.profileName(config.option(SdkClientOption.PROFILE_NAME))
6971
.defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE))
7072
.resolve();

0 commit comments

Comments
 (0)