Skip to content

[Default Configuration Part 5]: Move default configuration related classes to aws-core #2816

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
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
@Mojo(name = "generate-defaults-mode")
public class DefaultsModeGenerationMojo extends AbstractMojo {

private static final String DEFAULTS_MODE_BASE = "software.amazon.awssdk.defaultsmode";
private static final String DEFAULTS_MODE_CONFIGURATION_BASE = "software.amazon.awssdk.internal.defaultsmode";
private static final String DEFAULTS_MODE_BASE = "software.amazon.awssdk.awscore.defaultsmode";
private static final String DEFAULTS_MODE_CONFIGURATION_BASE = "software.amazon.awssdk.awscore.internal.defaultsmode";

@Parameter(property = "outputDirectory", defaultValue = "${project.build.directory}")
private String outputDirectory;
Expand All @@ -44,7 +44,7 @@ public class DefaultsModeGenerationMojo extends AbstractMojo {
private MavenProject project;

@Parameter(property = "defaultConfigurationFile", defaultValue =
"${basedir}/src/main/resources/software/amazon/awssdk/internal/defaults/sdk-default-configuration.json")
"${basedir}/src/main/resources/software/amazon/awssdk/awscore/internal/defaults/sdk-default-configuration.json")
private File defaultConfigurationFile;

public void execute() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ private CodeBlock documentation() {
.add("<p>The defaults mode can be configured:")
.add(System.lineSeparator())
.add("<ol>")
.add("<li>Directly on a client via {@code ClientOverrideConfiguration.Builder#defaultsMode"
.add("<li>Directly on a client via {@code AwsClientBuilder.Builder#defaultsMode"
+ "(DefaultsMode)}.</li>")
.add(System.lineSeparator())
.add("<li>On a configuration profile via the \"defaults_mode\" profile file property.</li>")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
* <p>
* The defaults mode can be configured:
* <ol>
* <li>Directly on a client via {@code ClientOverrideConfiguration.Builder#defaultsMode(DefaultsMode)}.</li>
* <li>Directly on a client via {@code AwsClientBuilder.Builder#defaultsMode(DefaultsMode)}.</li>
* <li>On a configuration profile via the "defaults_mode" profile file property.</li>
* <li>Globally via the "aws.defaultsMode" system property.</li>
* <li>Globally via the "AWS_DEFAULTS_MODE" environment variable.</li>
Expand Down
13 changes: 13 additions & 0 deletions core/aws-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,19 @@
</archive>
</configuration>
</plugin>
<plugin>
<groupId>software.amazon.awssdk</groupId>
<artifactId>codegen-lite-maven-plugin</artifactId>
<version>${awsjavasdk.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate-defaults-mode</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
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.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.core.client.builder.SdkClientBuilder;
import software.amazon.awssdk.regions.Region;

Expand Down Expand Up @@ -64,4 +65,24 @@ public interface AwsClientBuilder<BuilderT extends AwsClientBuilder<BuilderT, Cl
* </ol>
*/
BuilderT region(Region region);

/**
* Sets the {@link DefaultsMode} that will be used to determine how certain default configuration options are resolved in
* the SDK.
*
* <p>
* If this is not specified, the SDK will attempt to identify the defaults mode automatically using the following logic:
* <ol>
* <li>Check the "defaults_mode" profile file property.</li>
* <li>Check "aws.defaultsMode" system property.</li>
* <li>Check the "AWS_DEFAULTS_MODE" environment variable.</li>
* </ol>
*
* @param defaultsMode the defaultsMode to use
* @return This object for method chaining.
* @see DefaultsMode
*/
default BuilderT defaultsMode(DefaultsMode defaultsMode) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

package software.amazon.awssdk.awscore.client.builder;

import static software.amazon.awssdk.core.client.config.SdkClientOption.DEFAULTS_MODE;
import static software.amazon.awssdk.awscore.client.config.AwsClientOption.DEFAULTS_MODE;

import java.net.URI;
import java.util.Arrays;
Expand All @@ -27,23 +27,23 @@
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.awscore.client.config.AwsAdvancedClientOption;
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.awscore.endpoint.DefaultServiceEndpointBuilder;
import software.amazon.awssdk.awscore.eventstream.EventStreamInitialRequestInterceptor;
import software.amazon.awssdk.awscore.interceptor.HelpfulUnknownHostExceptionInterceptor;
import software.amazon.awssdk.awscore.internal.defaultsmode.AutoDefaultsModeDiscovery;
import software.amazon.awssdk.awscore.internal.defaultsmode.DefaultsModeConfiguration;
import software.amazon.awssdk.awscore.internal.defaultsmode.DefaultsModeResolver;
import software.amazon.awssdk.awscore.retry.AwsRetryPolicy;
import software.amazon.awssdk.core.client.builder.SdkDefaultClientBuilder;
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientOption;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.core.internal.defaultsmode.DefaultsModeResolver;
import software.amazon.awssdk.core.retry.RetryMode;
import software.amazon.awssdk.core.retry.RetryPolicy;
import software.amazon.awssdk.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.internal.defaultsmode.DefaultsModeConfiguration;
import software.amazon.awssdk.profiles.ProfileFile;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
Expand Down Expand Up @@ -125,7 +125,7 @@ protected final AttributeMap childHttpConfig() {
@Override
protected final AttributeMap childHttpConfig(SdkClientConfiguration configuration) {
AttributeMap attributeMap = serviceHttpConfig();
return attributeMap.merge(httpConfigFromDefaultsMode(configuration));
return mergeSmartHttpDefaults(configuration, attributeMap);
}

/**
Expand Down Expand Up @@ -160,6 +160,13 @@ protected SdkClientConfiguration mergeInternalDefaults(SdkClientConfiguration co
return configuration;
}

/**
* Return a client configuration object, populated with the following chain of priorities.
* <ol>
* <li>Defaults vended from {@link DefaultsMode} </li>
* <li>AWS Global Defaults</li>
* </ol>
*/
@Override
protected final SdkClientConfiguration finalizeChildConfiguration(SdkClientConfiguration configuration) {
configuration = finalizeServiceConfiguration(configuration);
Expand All @@ -168,9 +175,7 @@ protected final SdkClientConfiguration finalizeChildConfiguration(SdkClientConfi
.option(AwsClientOption.AWS_REGION, resolveRegion(configuration))
.build();

configuration = configuration.toBuilder()
.option(SdkClientOption.DEFAULTS_MODE, resolveDefaultsMode(configuration))
.build();
configuration = mergeSmartDefaults(configuration);

return configuration.toBuilder()
.option(AwsClientOption.CREDENTIALS_PROVIDER, resolveCredentials(configuration))
Expand All @@ -181,6 +186,16 @@ protected final SdkClientConfiguration finalizeChildConfiguration(SdkClientConfi
.build();
}

private SdkClientConfiguration mergeSmartDefaults(SdkClientConfiguration configuration) {
DefaultsMode defaultsMode = resolveDefaultsMode(configuration);
RetryMode retryMode = DefaultsModeConfiguration.defaultConfig(defaultsMode).get(SdkClientOption.DEFAULT_RETRY_MODE);

return configuration.toBuilder()
.option(DEFAULTS_MODE, defaultsMode)
.build()
.merge(c -> c.option(SdkClientOption.DEFAULT_RETRY_MODE, retryMode));
}

/**
* Optionally overridden by child classes to derive service-specific configuration from the default-applied configuration.
*/
Expand All @@ -189,11 +204,11 @@ protected SdkClientConfiguration finalizeServiceConfiguration(SdkClientConfigura
}

/**
* Return the defaults specified for each {@link DefaultsMode}
* Merged the HTTP defaults specified for each {@link DefaultsMode}
*/
private AttributeMap httpConfigFromDefaultsMode(SdkClientConfiguration sdkClientConfiguration) {
DefaultsMode defaultsMode = sdkClientConfiguration.option(DEFAULTS_MODE);
return DefaultsModeConfiguration.defaultHttpConfig(defaultsMode);
private AttributeMap mergeSmartHttpDefaults(SdkClientConfiguration configuration, AttributeMap attributeMap) {
DefaultsMode defaultsMode = configuration.option(DEFAULTS_MODE);
return attributeMap.merge(DefaultsModeConfiguration.defaultHttpConfig(defaultsMode));
}

/**
Expand Down Expand Up @@ -248,12 +263,13 @@ private Region regionFromDefaultProvider(SdkClientConfiguration config) {
}

private DefaultsMode resolveDefaultsMode(SdkClientConfiguration config) {
DefaultsMode defaultsMode = config.option(DEFAULTS_MODE) != null ?
config.option(DEFAULTS_MODE) :
DefaultsModeResolver.create()
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
.profileName(config.option(SdkClientOption.PROFILE_NAME))
.resolve();
DefaultsMode defaultsMode =
config.option(AwsClientOption.DEFAULTS_MODE) != null ?
config.option(AwsClientOption.DEFAULTS_MODE) :
DefaultsModeResolver.create()
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
.profileName(config.option(SdkClientOption.PROFILE_NAME))
.resolve();

if (defaultsMode == DefaultsMode.AUTO) {
defaultsMode = autoDefaultsModeDiscovery.discover(config.option(AwsClientOption.AWS_REGION));
Expand Down Expand Up @@ -291,18 +307,11 @@ private RetryPolicy resolveAwsRetryPolicy(SdkClientConfiguration config) {
RetryMode retryMode = RetryMode.resolver()
.profileFile(() -> config.option(SdkClientOption.PROFILE_FILE))
.profileName(config.option(SdkClientOption.PROFILE_NAME))
.defaultRetryMode(resolveDefaultRetryMode(config))
.defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE))
.resolve();
return AwsRetryPolicy.forRetryMode(retryMode);
}

private RetryMode resolveDefaultRetryMode(SdkClientConfiguration config) {
DefaultsMode defaultsMode = config.option(DEFAULTS_MODE);
RetryMode retryMode = config.option(SdkClientOption.DEFAULT_RETRY_MODE);
return retryMode != null ? retryMode :
DefaultsModeConfiguration.defaultConfig(defaultsMode).get(SdkClientOption.DEFAULT_RETRY_MODE);
}

@Override
public final BuilderT region(Region region) {
clientConfiguration.option(AwsClientOption.AWS_REGION, region);
Expand Down Expand Up @@ -333,4 +342,14 @@ private List<ExecutionInterceptor> awsInterceptors() {
return Arrays.asList(new HelpfulUnknownHostExceptionInterceptor(),
new EventStreamInitialRequestInterceptor());
}

@Override
public final BuilderT defaultsMode(DefaultsMode defaultsMode) {
clientConfiguration.option(DEFAULTS_MODE, defaultsMode);
return thisBuilder();
}

public final void setDefaultsMode(DefaultsMode defaultsMode) {
defaultsMode(defaultsMode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import software.amazon.awssdk.annotations.SdkProtectedApi;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.core.client.config.ClientOption;
import software.amazon.awssdk.regions.Region;

Expand Down Expand Up @@ -53,6 +54,11 @@ public final class AwsClientOption<T> extends ClientOption<T> {
*/
public static final AwsClientOption<String> ENDPOINT_PREFIX = new AwsClientOption<>(String.class);

/**
* Option to specify the {@link DefaultsMode}
*/
public static final AwsClientOption<DefaultsMode> DEFAULTS_MODE = new AwsClientOption<>(DefaultsMode.class);

private AwsClientOption(Class<T> valueClass) {
super(valueClass);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@

import java.util.Optional;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.core.SdkSystemSetting;
import software.amazon.awssdk.defaultsmode.DefaultsMode;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.internal.util.EC2MetadataUtils;
import software.amazon.awssdk.utils.JavaSystemSetting;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
* permissions and limitations under the License.
*/

package software.amazon.awssdk.core.internal.defaultsmode;
package software.amazon.awssdk.awscore.internal.defaultsmode;

import java.util.Locale;
import java.util.Optional;
import java.util.function.Supplier;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.core.SdkSystemSetting;
import software.amazon.awssdk.core.retry.RetryMode;
import software.amazon.awssdk.defaultsmode.DefaultsMode;
import software.amazon.awssdk.profiles.ProfileFile;
import software.amazon.awssdk.profiles.ProfileFileSystemSetting;
import software.amazon.awssdk.profiles.ProfileProperty;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@
import org.mockito.runners.MockitoJUnitRunner;
import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
import software.amazon.awssdk.auth.signer.Aws4Signer;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.awscore.internal.defaultsmode.AutoDefaultsModeDiscovery;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientOption;
import software.amazon.awssdk.core.signer.Signer;
import software.amazon.awssdk.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpConfigurationOption;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static software.amazon.awssdk.awscore.client.config.AwsAdvancedClientOption.ENABLE_DEFAULT_REGION_DETECTION;
import static software.amazon.awssdk.core.client.config.SdkClientOption.DEFAULTS_MODE;
import static software.amazon.awssdk.awscore.client.config.AwsClientOption.DEFAULTS_MODE;
import static software.amazon.awssdk.core.client.config.SdkClientOption.DEFAULT_RETRY_MODE;
import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_POLICY;

Expand All @@ -30,15 +30,15 @@
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.awscore.internal.defaultsmode.AutoDefaultsModeDiscovery;
import software.amazon.awssdk.awscore.internal.defaultsmode.DefaultsModeConfiguration;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
import software.amazon.awssdk.core.retry.RetryMode;
import software.amazon.awssdk.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpConfigurationOption;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.internal.defaultsmode.DefaultsModeConfiguration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.utils.AttributeMap;

Expand Down Expand Up @@ -83,7 +83,7 @@ public void nonLegacyDefaultsMode_shouldApplySdkDefaultsAndHttpDefaults() {

TestClient client =
testClientBuilder().region(Region.US_WEST_1)
.overrideConfiguration(o -> o.defaultsMode(targetMode))
.defaultsMode(targetMode)
.httpClientBuilder((SdkHttpClient.Builder) serviceDefaults -> {
AttributeMap defaultHttpConfig = DefaultsModeConfiguration.defaultHttpConfig(targetMode);
AttributeMap mergedDefaults = SERVICE_DEFAULTS.merge(defaultHttpConfig);
Expand All @@ -104,7 +104,7 @@ public void nonLegacyDefaultsModeAsyncClient_shouldApplySdkDefaultsAndHttpDefaul

TestAsyncClient client =
testAsyncClientBuilder().region(Region.US_WEST_1)
.overrideConfiguration(o -> o.defaultsMode(targetMode))
.defaultsMode(targetMode)
.httpClientBuilder((SdkHttpClient.Builder) serviceDefaults -> {
AttributeMap defaultHttpConfig = DefaultsModeConfiguration.defaultHttpConfig(targetMode);
AttributeMap mergedDefaults = SERVICE_DEFAULTS.merge(defaultHttpConfig);
Expand All @@ -123,8 +123,8 @@ public void nonLegacyDefaultsModeAsyncClient_shouldApplySdkDefaultsAndHttpDefaul
public void clientOverrideRetryMode_shouldTakePrecedence() {
TestClient client =
testClientBuilder().region(Region.US_WEST_1)
.overrideConfiguration(o -> o.defaultsMode(DefaultsMode.IN_REGION)
.retryPolicy(RetryMode.LEGACY))
.defaultsMode(DefaultsMode.IN_REGION)
.overrideConfiguration(o -> o.retryPolicy(RetryMode.LEGACY))
.build();
assertThat(client.clientConfiguration.option(DEFAULTS_MODE)).isEqualTo(DefaultsMode.IN_REGION);
assertThat(client.clientConfiguration.option(RETRY_POLICY).retryMode()).isEqualTo(RetryMode.LEGACY);
Expand All @@ -136,7 +136,7 @@ public void autoMode_shouldResolveDefaultsMode() {
when(autoModeDiscovery.discover(any(Region.class))).thenReturn(expectedMode);
TestClient client =
testClientBuilder().region(Region.US_WEST_1)
.overrideConfiguration(o -> o.defaultsMode(DefaultsMode.AUTO))
.defaultsMode(DefaultsMode.AUTO)
.build();

assertThat(client.clientConfiguration.option(DEFAULTS_MODE)).isEqualTo(expectedMode);
Expand Down
Loading