Skip to content

Commit 1ef81ff

Browse files
authored
fix: add forcePathStyle and enableAccelerate config properties back to the S3 client (#1099)
1 parent 84f0836 commit 1ef81ff

File tree

6 files changed

+165
-5
lines changed

6 files changed

+165
-5
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "256a9c00-f658-4ee8-9e02-2cf46b76a900",
3+
"type": "bugfix",
4+
"description": "Add `forcePathStyle` and `enableAccelerate` config properties back to the S3 client.",
5+
"issues": [
6+
"awslabs/aws-sdk-kotlin#1098"
7+
]
8+
}

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/customization/s3/ClientConfigIntegration.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,23 @@ class ClientConfigIntegration : KotlinIntegration {
2828
model.expectShape<ServiceShape>(settings.service).isS3
2929

3030
companion object {
31+
val EnableAccelerateProp: ConfigProperty = ConfigProperty {
32+
name = "enableAccelerate"
33+
useSymbolWithNullableBuilder(KotlinTypes.Boolean, "false")
34+
documentation = """
35+
Flag to support [S3 transfer acceleration](https://docs.aws.amazon.com/AmazonS3/latest/userguide/transfer-acceleration.html)
36+
with this client.
37+
""".trimIndent()
38+
}
39+
40+
val ForcePathStyleProp: ConfigProperty = ConfigProperty {
41+
name = "forcePathStyle"
42+
useSymbolWithNullableBuilder(KotlinTypes.Boolean, "false")
43+
documentation = """
44+
Flag to use legacy path-style addressing when making requests.
45+
""".trimIndent()
46+
}
47+
3148
val UseArnRegionProp: ConfigProperty = ConfigProperty {
3249
name = "useArnRegion"
3350
useSymbolWithNullableBuilder(KotlinTypes.Boolean, "false")
@@ -66,6 +83,8 @@ class ClientConfigIntegration : KotlinIntegration {
6683

6784
override fun additionalServiceConfigProps(ctx: CodegenContext): List<ConfigProperty> =
6885
listOf(
86+
EnableAccelerateProp,
87+
ForcePathStyleProp,
6988
UseArnRegionProp,
7089
DisableMrapProp,
7190
)

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/endpoints/BindAwsEndpointBuiltins.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ fun renderBindAwsBuiltins(ctx: ProtocolGenerator.GenerationContext, writer: Kotl
5050
"AWS::UseFIPS" -> renderBasicConfigBinding(writer, it, AwsServiceConfigIntegration.UseFipsProp.propertyName)
5151
"AWS::UseDualStack" -> renderBasicConfigBinding(writer, it, AwsServiceConfigIntegration.UseDualStackProp.propertyName)
5252

53+
"AWS::S3::Accelerate" -> renderBasicConfigBinding(writer, it, S3ClientConfigIntegration.EnableAccelerateProp.propertyName)
54+
"AWS::S3::ForcePathStyle" -> renderBasicConfigBinding(writer, it, S3ClientConfigIntegration.ForcePathStyleProp.propertyName)
5355
"AWS::S3::DisableMultiRegionAccessPoints" -> renderBasicConfigBinding(writer, it, S3ClientConfigIntegration.DisableMrapProp.propertyName)
5456
"AWS::S3::UseArnRegion" -> renderBasicConfigBinding(writer, it, S3ClientConfigIntegration.DisableMrapProp.propertyName)
5557
"AWS::S3Control::UseArnRegion" -> renderBasicConfigBinding(writer, it, S3ControlClientConfigIntegration.UseArnRegionProp.propertyName)

services/s3/common/src/aws/sdk/kotlin/services/s3/internal/FinalizeS3Config.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ import aws.sdk.kotlin.runtime.config.profile.AwsProfile
88
import aws.sdk.kotlin.runtime.config.profile.AwsSharedConfig
99
import aws.sdk.kotlin.runtime.config.profile.getBooleanOrNull
1010
import aws.sdk.kotlin.services.s3.S3Client
11+
import aws.smithy.kotlin.runtime.config.resolve
1112
import aws.smithy.kotlin.runtime.util.LazyAsyncValue
13+
import aws.smithy.kotlin.runtime.util.PlatformProvider
1214

13-
internal suspend fun finalizeS3Config(builder: S3Client.Builder, sharedConfig: LazyAsyncValue<AwsSharedConfig>) {
14-
sharedConfig.get().activeProfile.let {
15-
builder.config.useArnRegion = builder.config.useArnRegion ?: it.useArnRegion
16-
builder.config.disableMrap = builder.config.disableMrap ?: it.disableMrap
17-
}
15+
internal suspend fun finalizeS3Config(
16+
builder: S3Client.Builder,
17+
sharedConfig: LazyAsyncValue<AwsSharedConfig>,
18+
provider: PlatformProvider = PlatformProvider.System,
19+
) {
20+
val activeProfile = sharedConfig.get().activeProfile
21+
builder.config.useArnRegion = builder.config.useArnRegion ?: S3Setting.UseArnRegion.resolve(provider) ?: activeProfile.useArnRegion
22+
builder.config.disableMrap = builder.config.disableMrap ?: S3Setting.DisableMultiRegionAccessPoints.resolve(provider) ?: activeProfile.disableMrap
1823
}
1924

2025
private val AwsProfile.useArnRegion: Boolean?
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.services.s3.internal
6+
7+
import aws.smithy.kotlin.runtime.config.*
8+
9+
/**
10+
* S3 specific system settings
11+
*/
12+
internal object S3Setting {
13+
/**
14+
* Configure whether the S3 client should uses the access point ARN AWS region to construct the regional endpoint
15+
* for the request. See [Amazon S3 access points](https://docs.aws.amazon.com/sdkref/latest/guide/feature-s3-access-point.html)
16+
*/
17+
public val UseArnRegion: EnvironmentSetting<Boolean> = boolEnvSetting("aws.s3UseArnRegion", "AWS_S3_USE_ARN_REGION")
18+
19+
/**
20+
* Configure whether the S3 client potentially attempts cross-Region requests.
21+
* See [Amazon S3 Multi-Region Access Points](https://docs.aws.amazon.com/sdkref/latest/guide/feature-s3-mrap.html)
22+
*/
23+
public val DisableMultiRegionAccessPoints: EnvironmentSetting<Boolean> = boolEnvSetting("aws.s3DisableMultiRegionAccessPoints", "AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS")
24+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.services.s3.internal
6+
7+
import aws.sdk.kotlin.runtime.config.profile.loadAwsSharedConfig
8+
import aws.sdk.kotlin.services.s3.S3Client
9+
import aws.smithy.kotlin.runtime.util.TestPlatformProvider
10+
import aws.smithy.kotlin.runtime.util.asyncLazy
11+
import kotlinx.coroutines.test.runTest
12+
import kotlin.test.Test
13+
import kotlin.test.assertEquals
14+
15+
class FinalizeConfigTest {
16+
@Test
17+
fun testExplicitConfigTakesPrecedence() = runTest {
18+
val builder = S3Client.builder()
19+
builder.config.useArnRegion = false
20+
builder.config.disableMrap = true
21+
val platform = TestPlatformProvider(
22+
fs = mapOf(
23+
"/users/test/.aws/config" to "[default]\ns3_use_arn_region = true\ns3_disable_multiregion_access_points = false",
24+
),
25+
)
26+
val sharedConfig = asyncLazy { loadAwsSharedConfig(platform) }
27+
28+
finalizeS3Config(builder, sharedConfig, platform)
29+
assertEquals(false, builder.config.useArnRegion)
30+
assertEquals(true, builder.config.disableMrap)
31+
}
32+
33+
@Test
34+
fun testSystemProperties() = runTest {
35+
val builder = S3Client.builder()
36+
val platform = TestPlatformProvider(
37+
env = mapOf(
38+
S3Setting.UseArnRegion.envVar to "false",
39+
S3Setting.DisableMultiRegionAccessPoints.envVar to "true",
40+
),
41+
props = mapOf(
42+
S3Setting.UseArnRegion.sysProp to "true",
43+
S3Setting.DisableMultiRegionAccessPoints.sysProp to "false",
44+
),
45+
fs = mapOf(
46+
"/users/test/.aws/config" to "[default]\ns3_use_arn_region = false\ns3_disable_multiregion_access_points = true",
47+
),
48+
)
49+
val sharedConfig = asyncLazy { loadAwsSharedConfig(platform) }
50+
51+
finalizeS3Config(builder, sharedConfig, platform)
52+
assertEquals(true, builder.config.useArnRegion)
53+
assertEquals(false, builder.config.disableMrap)
54+
}
55+
56+
@Test
57+
fun testEnvironmentVariables() = runTest {
58+
val builder = S3Client.builder()
59+
val platform = TestPlatformProvider(
60+
env = mapOf(
61+
S3Setting.UseArnRegion.envVar to "false",
62+
S3Setting.DisableMultiRegionAccessPoints.envVar to "true",
63+
),
64+
fs = mapOf(
65+
"/users/test/.aws/config" to "[default]\ns3_use_arn_region = true\ns3_disable_multiregion_access_points = false",
66+
),
67+
)
68+
val sharedConfig = asyncLazy { loadAwsSharedConfig(platform) }
69+
70+
finalizeS3Config(builder, sharedConfig, platform)
71+
assertEquals(false, builder.config.useArnRegion)
72+
assertEquals(true, builder.config.disableMrap)
73+
}
74+
75+
@Test
76+
fun testProfile() = runTest {
77+
val builder = S3Client.builder()
78+
val platform = TestPlatformProvider(
79+
fs = mapOf(
80+
"/users/test/.aws/config" to "[default]\ns3_use_arn_region = true\ns3_disable_multiregion_access_points = false",
81+
),
82+
)
83+
val sharedConfig = asyncLazy { loadAwsSharedConfig(platform) }
84+
85+
finalizeS3Config(builder, sharedConfig, platform)
86+
assertEquals(true, builder.config.useArnRegion)
87+
assertEquals(false, builder.config.disableMrap)
88+
}
89+
90+
@Test
91+
fun testConfigPropertiesPresent() {
92+
// regression test to verify that these config properties are generated and can be set
93+
// see https://github.com/awslabs/aws-sdk-kotlin/issues/1098
94+
val builder = S3Client.builder()
95+
builder.config.disableMrap = true
96+
builder.config.useArnRegion = true
97+
builder.config.forcePathStyle = true
98+
builder.config.enableAccelerate = true
99+
builder.config.useDualStack = true
100+
builder.config.useFips = true
101+
}
102+
}

0 commit comments

Comments
 (0)