Skip to content

Commit 468fce7

Browse files
committed
Update public APIs to Supplier<ProfileFile> instead of ProfileFileSupplier
1 parent c3e743b commit 468fce7

File tree

6 files changed

+134
-36
lines changed

6 files changed

+134
-36
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.auth.credentials;
1717

1818
import java.util.Optional;
19+
import java.util.function.Supplier;
1920
import software.amazon.awssdk.annotations.SdkPublicApi;
2021
import software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider;
2122
import software.amazon.awssdk.profiles.ProfileFile;
@@ -53,7 +54,7 @@ public final class DefaultCredentialsProvider
5354

5455
private final LazyAwsCredentialsProvider providerChain;
5556

56-
private final ProfileFileSupplier profileFileSupplier;
57+
private final Supplier<ProfileFile> profileFile;
5758

5859
private final String profileName;
5960

@@ -65,7 +66,7 @@ public final class DefaultCredentialsProvider
6566
* @see #builder()
6667
*/
6768
private DefaultCredentialsProvider(Builder builder) {
68-
this.profileFileSupplier = builder.profileFileSupplier;
69+
this.profileFile = builder.profileFile;
6970
this.profileName = builder.profileName;
7071
this.reuseLastProviderEnabled = builder.reuseLastProviderEnabled;
7172
this.asyncCredentialUpdateEnabled = builder.asyncCredentialUpdateEnabled;
@@ -93,15 +94,15 @@ private static LazyAwsCredentialsProvider createChain(Builder builder) {
9394
EnvironmentVariableCredentialsProvider.create(),
9495
WebIdentityTokenFileCredentialsProvider.create(),
9596
ProfileCredentialsProvider.builder()
96-
.profileFile(builder.profileFileSupplier)
97+
.profileFile(builder.profileFile)
9798
.profileName(builder.profileName)
9899
.build(),
99100
ContainerCredentialsProvider.builder()
100101
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
101102
.build(),
102103
InstanceProfileCredentialsProvider.builder()
103104
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
104-
.profileFile(builder.profileFileSupplier)
105+
.profileFile(builder.profileFile)
105106
.profileName(builder.profileName)
106107
.build()
107108
};
@@ -146,7 +147,7 @@ public Builder toBuilder() {
146147
* Configuration that defines the {@link DefaultCredentialsProvider}'s behavior.
147148
*/
148149
public static final class Builder implements CopyableBuilder<Builder, DefaultCredentialsProvider> {
149-
private ProfileFileSupplier profileFileSupplier;
150+
private Supplier<ProfileFile> profileFile;
150151
private String profileName;
151152
private Boolean reuseLastProviderEnabled = true;
152153
private Boolean asyncCredentialUpdateEnabled = false;
@@ -158,7 +159,7 @@ private Builder() {
158159
}
159160

160161
private Builder(DefaultCredentialsProvider credentialsProvider) {
161-
this.profileFileSupplier = credentialsProvider.profileFileSupplier;
162+
this.profileFile = credentialsProvider.profileFile;
162163
this.profileName = credentialsProvider.profileName;
163164
this.reuseLastProviderEnabled = credentialsProvider.reuseLastProviderEnabled;
164165
this.asyncCredentialUpdateEnabled = credentialsProvider.asyncCredentialUpdateEnabled;
@@ -170,8 +171,8 @@ public Builder profileFile(ProfileFile profileFile) {
170171
.orElse(null));
171172
}
172173

173-
public Builder profileFile(ProfileFileSupplier profileFileSupplier) {
174-
this.profileFileSupplier = profileFileSupplier;
174+
public Builder profileFile(Supplier<ProfileFile> profileFileSupplier) {
175+
this.profileFile = profileFileSupplier;
175176
return this;
176177
}
177178

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Collections;
2828
import java.util.Map;
2929
import java.util.Optional;
30+
import java.util.function.Supplier;
3031
import software.amazon.awssdk.annotations.SdkPublicApi;
3132
import software.amazon.awssdk.annotations.SdkTestInternalApi;
3233
import software.amazon.awssdk.auth.credentials.internal.Ec2MetadataConfigProvider;
@@ -79,7 +80,7 @@ public final class InstanceProfileCredentialsProvider
7980

8081
private final String asyncThreadName;
8182

82-
private final ProfileFileSupplier profileFileSupplier;
83+
private final Supplier<ProfileFile> profileFile;
8384

8485
private final String profileName;
8586

@@ -91,13 +92,13 @@ private InstanceProfileCredentialsProvider(BuilderImpl builder) {
9192
this.endpoint = builder.endpoint;
9293
this.asyncCredentialUpdateEnabled = builder.asyncCredentialUpdateEnabled;
9394
this.asyncThreadName = builder.asyncThreadName;
94-
this.profileFileSupplier = builder.profileFileSupplier;
95+
this.profileFile = builder.profileFile;
9596
this.profileName = builder.profileName;
9697

9798
this.httpCredentialsLoader = HttpCredentialsLoader.create();
9899
this.configProvider =
99100
Ec2MetadataConfigProvider.builder()
100-
.profileFile(builder.profileFileSupplier)
101+
.profileFile(builder.profileFile)
101102
.profileName(builder.profileName)
102103
.build();
103104

@@ -282,7 +283,7 @@ public interface Builder extends HttpCredentialsProvider.Builder<InstanceProfile
282283
*
283284
* <p>By default, {@link ProfileFile#defaultProfileFile()} is used.
284285
*
285-
* @see #profileFile(ProfileFileSupplier)
286+
* @see #profileFile(Supplier)
286287
*/
287288
Builder profileFile(ProfileFile profileFile);
288289

@@ -292,7 +293,7 @@ public interface Builder extends HttpCredentialsProvider.Builder<InstanceProfile
292293
* @param profileFileSupplier Supplier interface for generating a ProfileFile instance.
293294
* @see #profileFile(ProfileFile)
294295
*/
295-
Builder profileFile(ProfileFileSupplier profileFileSupplier);
296+
Builder profileFile(Supplier<ProfileFile> profileFileSupplier);
296297

297298
/**
298299
* Configure the profile name used for loading IMDS-related configuration, like the endpoint mode (IPv4 vs IPv6).
@@ -314,7 +315,7 @@ static final class BuilderImpl implements Builder {
314315
private String endpoint;
315316
private Boolean asyncCredentialUpdateEnabled;
316317
private String asyncThreadName;
317-
private ProfileFileSupplier profileFileSupplier;
318+
private Supplier<ProfileFile> profileFile;
318319
private String profileName;
319320

320321
private BuilderImpl() {
@@ -326,7 +327,7 @@ private BuilderImpl(InstanceProfileCredentialsProvider provider) {
326327
this.endpoint = provider.endpoint;
327328
this.asyncCredentialUpdateEnabled = provider.asyncCredentialUpdateEnabled;
328329
this.asyncThreadName = provider.asyncThreadName;
329-
this.profileFileSupplier = provider.profileFileSupplier;
330+
this.profileFile = provider.profileFile;
330331
this.profileName = provider.profileName;
331332
}
332333

@@ -377,12 +378,12 @@ public void setProfileFile(ProfileFile profileFile) {
377378
}
378379

379380
@Override
380-
public Builder profileFile(ProfileFileSupplier profileFileSupplier) {
381-
this.profileFileSupplier = profileFileSupplier;
381+
public Builder profileFile(Supplier<ProfileFile> profileFileSupplier) {
382+
this.profileFile = profileFileSupplier;
382383
return this;
383384
}
384385

385-
public void setProfileFile(ProfileFileSupplier profileFileSupplier) {
386+
public void setProfileFile(Supplier<ProfileFile> profileFileSupplier) {
386387
profileFile(profileFileSupplier);
387388
}
388389

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

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public final class ProfileCredentialsProvider
5151

5252
private AwsCredentialsProvider credentialsProvider;
5353
private final RuntimeException loadException;
54-
private final ProfileFileSupplier profileFileSupplier;
54+
private final Supplier<ProfileFile> profileFile;
5555
private volatile ProfileFile currentProfileFile;
5656
private final String profileName;
5757
private final Supplier<ProfileFile> defaultProfileFileLoader;
@@ -64,15 +64,14 @@ private ProfileCredentialsProvider(BuilderImpl builder) {
6464

6565
RuntimeException thrownException = null;
6666
String selectedProfileName = null;
67-
ProfileFileSupplier selectedProfileSupplier = null;
67+
Supplier<ProfileFile> selectedProfileSupplier = null;
6868

6969
try {
7070
selectedProfileName = Optional.ofNullable(builder.profileName)
7171
.orElseGet(ProfileFileSystemSetting.AWS_PROFILE::getStringValueOrThrow);
7272

73-
selectedProfileSupplier = Optional.ofNullable(builder.profileFileSupplier)
74-
.orElseGet(() -> ProfileFileSupplier
75-
.fixedProfileFile(builder.defaultProfileFileLoader.get()));
73+
selectedProfileSupplier = Optional.ofNullable(builder.profileFile)
74+
.orElseGet(() -> builder.defaultProfileFileLoader);
7675

7776
} catch (RuntimeException e) {
7877
// If we couldn't load the credentials provider for some reason, save an exception describing why. This exception
@@ -83,7 +82,7 @@ private ProfileCredentialsProvider(BuilderImpl builder) {
8382

8483
this.loadException = thrownException;
8584
this.profileName = selectedProfileName;
86-
this.profileFileSupplier = selectedProfileSupplier;
85+
this.profileFile = selectedProfileSupplier;
8786
}
8887

8988
/**
@@ -131,7 +130,7 @@ private void handleProfileFileReload(ProfileFile profileFile) {
131130
}
132131

133132
private ProfileFile refreshProfileFile() {
134-
return profileFileSupplier.get();
133+
return profileFile.get();
135134
}
136135

137136
private boolean isNewProfileFile(ProfileFile profileFile) {
@@ -148,7 +147,9 @@ public String toString() {
148147

149148
@Override
150149
public void close() {
151-
profileFileSupplier.close();
150+
if (profileFile instanceof SdkAutoCloseable) {
151+
((SdkAutoCloseable) profileFile).close();
152+
}
152153
// The delegate credentials provider may be closeable (eg. if it's an STS credentials provider). In this case, we should
153154
// clean it up when this credentials provider is closed.
154155
IoUtils.closeIfCloseable(credentialsProvider, null);
@@ -178,7 +179,7 @@ public interface Builder extends CopyableBuilder<Builder, ProfileCredentialsProv
178179
/**
179180
* Define the profile file that should be used by this credentials provider. By default, the
180181
* {@link ProfileFile#defaultProfileFile()} is used.
181-
* @see #profileFile(ProfileFileSupplier)
182+
* @see #profileFile(Supplier)
182183
*/
183184
Builder profileFile(ProfileFile profileFile);
184185

@@ -194,7 +195,7 @@ public interface Builder extends CopyableBuilder<Builder, ProfileCredentialsProv
194195
* @param profileFileSupplier Supplier interface for generating a ProfileFile instance.
195196
* @see #profileFile(ProfileFile)
196197
*/
197-
Builder profileFile(ProfileFileSupplier profileFileSupplier);
198+
Builder profileFile(Supplier<ProfileFile> profileFileSupplier);
198199

199200
/**
200201
* Define the name of the profile that should be used by this credentials provider. By default, the value in
@@ -210,7 +211,7 @@ public interface Builder extends CopyableBuilder<Builder, ProfileCredentialsProv
210211
}
211212

212213
static final class BuilderImpl implements Builder {
213-
private ProfileFileSupplier profileFileSupplier;
214+
private Supplier<ProfileFile> profileFile;
214215
private String profileName;
215216
private Supplier<ProfileFile> defaultProfileFileLoader = ProfileFile::defaultProfileFile;
216217

@@ -220,7 +221,7 @@ static final class BuilderImpl implements Builder {
220221
BuilderImpl(ProfileCredentialsProvider provider) {
221222
this.profileName = provider.profileName;
222223
this.defaultProfileFileLoader = provider.defaultProfileFileLoader;
223-
this.profileFileSupplier = provider.profileFileSupplier;
224+
this.profileFile = provider.profileFile;
224225
}
225226

226227
@Override
@@ -240,12 +241,12 @@ public Builder profileFile(Consumer<ProfileFile.Builder> profileFile) {
240241
}
241242

242243
@Override
243-
public Builder profileFile(ProfileFileSupplier profileFileSupplier) {
244-
this.profileFileSupplier = profileFileSupplier;
244+
public Builder profileFile(Supplier<ProfileFile> profileFileSupplier) {
245+
this.profileFile = profileFileSupplier;
245246
return this;
246247
}
247248

248-
public void setProfileFile(ProfileFileSupplier supplier) {
249+
public void setProfileFile(Supplier<ProfileFile> supplier) {
249250
profileFile(supplier);
250251
}
251252

core/auth/src/test/java/software/amazon/awssdk/auth/credentials/DefaultCredentialsProviderTest.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.Arrays;
2121
import java.util.List;
22+
import java.util.function.Supplier;
2223
import org.junit.jupiter.api.Test;
2324
import software.amazon.awssdk.profiles.ProfileFile;
2425
import software.amazon.awssdk.profiles.ProfileFileSupplier;
@@ -27,7 +28,7 @@
2728
class DefaultCredentialsProviderTest {
2829

2930
@Test
30-
void resolveCredentials_requestFallsIntoProfileCredentialsProviderWithProfileFile_returnsCredentials() {
31+
void resolveCredentials_ProfileCredentialsProviderWithProfileFile_returnsCredentials() {
3132
DefaultCredentialsProvider provider = DefaultCredentialsProvider
3233
.builder()
3334
.profileFile(credentialFile("test", "access", "secret"))
@@ -41,7 +42,7 @@ void resolveCredentials_requestFallsIntoProfileCredentialsProviderWithProfileFil
4142
}
4243

4344
@Test
44-
void resolveCredentials_requestFallsIntoProfileCredentialsProviderWithProfileFileSupplier_returnsCredentials() {
45+
void resolveCredentials_ProfileCredentialsProviderWithProfileFileSupplier_resolvesCredentialsPerCall() {
4546
List<ProfileFile> profileFileList = Arrays.asList(credentialFile("test", "access", "secret"),
4647
credentialFile("test", "modified", "update"));
4748
ProfileFileSupplier profileFileSupplier = supply(profileFileList);
@@ -63,6 +64,39 @@ void resolveCredentials_requestFallsIntoProfileCredentialsProviderWithProfileFil
6364
});
6465
}
6566

67+
@Test
68+
void resolveCredentials_ProfileCredentialsProviderWithProfileFileSupplier_returnsCredentials() {
69+
ProfileFile profileFile = credentialFile("test", "access", "secret");
70+
ProfileFileSupplier profileFileSupplier = ProfileFileSupplier.fixedProfileFile(profileFile);
71+
72+
DefaultCredentialsProvider provider = DefaultCredentialsProvider
73+
.builder()
74+
.profileFile(profileFileSupplier)
75+
.profileName("test")
76+
.build();
77+
78+
assertThat(provider.resolveCredentials()).satisfies(awsCredentials -> {
79+
assertThat(awsCredentials.accessKeyId()).isEqualTo("access");
80+
assertThat(awsCredentials.secretAccessKey()).isEqualTo("secret");
81+
});
82+
}
83+
84+
@Test
85+
void resolveCredentials_ProfileCredentialsProviderWithSupplierProfileFile_returnsCredentials() {
86+
Supplier<ProfileFile> supplier = () -> credentialFile("test", "access", "secret");
87+
88+
DefaultCredentialsProvider provider = DefaultCredentialsProvider
89+
.builder()
90+
.profileFile(supplier)
91+
.profileName("test")
92+
.build();
93+
94+
assertThat(provider.resolveCredentials()).satisfies(awsCredentials -> {
95+
assertThat(awsCredentials.accessKeyId()).isEqualTo("access");
96+
assertThat(awsCredentials.secretAccessKey()).isEqualTo("secret");
97+
});
98+
}
99+
66100
private ProfileFile credentialFile(String credentialFile) {
67101
return ProfileFile.builder()
68102
.content(new StringInputStream(credentialFile))

core/auth/src/test/java/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProviderTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.time.ZoneOffset;
4444
import java.util.Arrays;
4545
import java.util.List;
46+
import java.util.function.Supplier;
4647
import java.util.stream.Collectors;
4748
import org.junit.AfterClass;
4849
import org.junit.Before;
@@ -305,6 +306,47 @@ public void resolveCredentials_customProfileFileSupplierAndNameSettingEndpointOv
305306
}
306307
}
307308

309+
@Test
310+
public void resolveCredentials_customSupplierProfileFileAndNameSettingEndpointOverride_usesCorrectEndpointFromSupplier() {
311+
System.clearProperty(SdkSystemSetting.AWS_EC2_METADATA_SERVICE_ENDPOINT.property());
312+
WireMockServer mockMetadataEndpoint_2 = new WireMockServer(WireMockConfiguration.options().dynamicPort());
313+
mockMetadataEndpoint_2.start();
314+
try {
315+
String stubToken = "some-token";
316+
mockMetadataEndpoint_2.stubFor(put(urlPathEqualTo(TOKEN_RESOURCE_PATH)).willReturn(aResponse().withBody(stubToken)));
317+
mockMetadataEndpoint_2.stubFor(get(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH)).willReturn(aResponse().withBody("some-profile")));
318+
mockMetadataEndpoint_2.stubFor(get(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH + "some-profile")).willReturn(aResponse().withBody(STUB_CREDENTIALS)));
319+
320+
String mockServer2Endpoint = "http://localhost:" + mockMetadataEndpoint_2.port();
321+
322+
ProfileFile config = configFile("profile test",
323+
Pair.of(ProfileProperty.EC2_METADATA_SERVICE_ENDPOINT, mockServer2Endpoint));
324+
325+
Supplier<ProfileFile> supplier = () -> config;
326+
327+
InstanceProfileCredentialsProvider provider = InstanceProfileCredentialsProvider
328+
.builder()
329+
.profileFile(supplier)
330+
.profileName("test")
331+
.build();
332+
333+
AwsCredentials awsCredentials1 = provider.resolveCredentials();
334+
335+
assertThat(awsCredentials1).isNotNull();
336+
337+
String userAgentHeader = "User-Agent";
338+
String userAgent = SdkUserAgent.create().userAgent();
339+
mockMetadataEndpoint_2.verify(putRequestedFor(urlPathEqualTo(TOKEN_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
340+
mockMetadataEndpoint_2.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
341+
mockMetadataEndpoint_2.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH + "some-profile")).withHeader(userAgentHeader, equalTo(userAgent)));
342+
343+
// all requests should have gone to the second server, and none to the other one
344+
mockMetadataEndpoint.verify(0, RequestPatternBuilder.allRequests());
345+
} finally {
346+
mockMetadataEndpoint_2.stop();
347+
}
348+
}
349+
308350
@Test
309351
public void resolveCredentials_doesNotFailIfImdsReturnsExpiredCredentials() {
310352
String credentialsResponse =

0 commit comments

Comments
 (0)