1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License").
5
+ * You may not use this file except in compliance with the License.
6
+ * A copy of the License is located at
7
+ *
8
+ * http://aws.amazon.com/apache2.0
9
+ *
10
+ * or in the "license" file accompanying this file. This file is distributed
11
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12
+ * express or implied. See the License for the specific language governing
13
+ * permissions and limitations under the License.
14
+ */
15
+
16
+ package software .amazon .awssdk .awscore .internal ;
17
+
18
+ import static com .github .tomakehurst .wiremock .client .WireMock .aResponse ;
19
+ import static com .github .tomakehurst .wiremock .client .WireMock .get ;
20
+ import static com .github .tomakehurst .wiremock .client .WireMock .put ;
21
+ import static com .github .tomakehurst .wiremock .client .WireMock .stubFor ;
22
+ import static org .assertj .core .api .Assertions .assertThat ;
23
+
24
+ import com .github .tomakehurst .wiremock .junit .WireMockRule ;
25
+ import java .util .Arrays ;
26
+ import java .util .Collection ;
27
+ import java .util .concurrent .Callable ;
28
+ import org .junit .After ;
29
+ import org .junit .Before ;
30
+ import org .junit .Rule ;
31
+ import org .junit .Test ;
32
+ import org .junit .runner .RunWith ;
33
+ import org .junit .runners .Parameterized ;
34
+ import software .amazon .awssdk .awscore .internal .defaultsmode .AutoDefaultsModeDiscovery ;
35
+ import software .amazon .awssdk .core .SdkSystemSetting ;
36
+ import software .amazon .awssdk .defaultsmode .DefaultsMode ;
37
+ import software .amazon .awssdk .regions .Region ;
38
+ import software .amazon .awssdk .regions .internal .util .EC2MetadataUtils ;
39
+ import software .amazon .awssdk .testutils .EnvironmentVariableHelper ;
40
+ import software .amazon .awssdk .utils .JavaSystemSetting ;
41
+
42
+ @ RunWith (Parameterized .class )
43
+ public class AutoDefaultsModeDiscoveryTest {
44
+ private static final EnvironmentVariableHelper ENVIRONMENT_VARIABLE_HELPER = new EnvironmentVariableHelper ();
45
+ @ Parameterized .Parameter
46
+ public TestData testData ;
47
+
48
+ @ Parameterized .Parameters
49
+ public static Collection <Object > data () {
50
+ return Arrays .asList (new Object [] {
51
+
52
+ // Mobile
53
+ new TestData ().clientRegion (Region .US_EAST_1 )
54
+ .javaVendorProperty ("The Android Project" )
55
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
56
+ .awsRegionEnvVar ("us-east-1" )
57
+ .expectedResolvedMode (DefaultsMode .MOBILE ),
58
+
59
+ // Region available from AWS execution environment
60
+ new TestData ().clientRegion (Region .US_EAST_1 )
61
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
62
+ .awsRegionEnvVar ("us-east-1" )
63
+ .expectedResolvedMode (DefaultsMode .IN_REGION ),
64
+
65
+ // Region available from AWS execution environment
66
+ new TestData ().clientRegion (Region .US_EAST_1 )
67
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
68
+ .awsDefaultRegionEnvVar ("us-west-2" )
69
+ .expectedResolvedMode (DefaultsMode .CROSS_REGION ),
70
+
71
+ // ImdsV2 available, in-region
72
+ new TestData ().clientRegion (Region .US_EAST_1 )
73
+ .awsDefaultRegionEnvVar ("us-west-2" )
74
+ .ec2MetadataConfig (new Ec2MetadataConfig ().region ("us-east-1" )
75
+ .imdsAvailable (true ))
76
+ .expectedResolvedMode (DefaultsMode .IN_REGION ),
77
+
78
+ // ImdsV2 available, cross-region
79
+ new TestData ().clientRegion (Region .US_EAST_1 )
80
+ .awsDefaultRegionEnvVar ("us-west-2" )
81
+ .ec2MetadataConfig (new Ec2MetadataConfig ().region ("us-west-2" )
82
+ .imdsAvailable (true )
83
+ .ec2MetadataDisabledEnvVar ("false" ))
84
+ .expectedResolvedMode (DefaultsMode .CROSS_REGION ),
85
+
86
+ // Imdsv2 disabled, should not query ImdsV2 and use fallback mode
87
+ new TestData ().clientRegion (Region .US_EAST_1 )
88
+ .awsDefaultRegionEnvVar ("us-west-2" )
89
+ .ec2MetadataConfig (new Ec2MetadataConfig ().region ("us-west-2" )
90
+ .imdsAvailable (true )
91
+ .ec2MetadataDisabledEnvVar ("true" ))
92
+ .expectedResolvedMode (DefaultsMode .STANDARD ),
93
+
94
+ // Imdsv2 not available, should use fallback mode.
95
+ new TestData ().clientRegion (Region .US_EAST_1 )
96
+ .awsDefaultRegionEnvVar ("us-west-2" )
97
+ .ec2MetadataConfig (new Ec2MetadataConfig ().imdsAvailable (false ))
98
+ .expectedResolvedMode (DefaultsMode .STANDARD ),
99
+ });
100
+ }
101
+
102
+ @ Rule
103
+ public WireMockRule wireMock = new WireMockRule (0 );
104
+
105
+ @ Before
106
+ public void methodSetup () {
107
+ System .setProperty (SdkSystemSetting .AWS_EC2_METADATA_SERVICE_ENDPOINT .property (),
108
+ "http://localhost:" + wireMock .port ());
109
+ }
110
+
111
+ @ After
112
+ public void cleanUp () {
113
+ EC2MetadataUtils .clearCache ();
114
+ wireMock .resetAll ();
115
+ ENVIRONMENT_VARIABLE_HELPER .reset ();
116
+ System .clearProperty (JavaSystemSetting .JAVA_VENDOR .property ());
117
+ }
118
+
119
+ @ Test
120
+ public void differentCombinationOfConfigs_shouldResolveCorrectly () throws Exception {
121
+ if (testData .javaVendorProperty != null ) {
122
+ System .setProperty (JavaSystemSetting .JAVA_VENDOR .property (), testData .javaVendorProperty );
123
+ }
124
+
125
+ if (testData .awsExecutionEnvVar != null ) {
126
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_EXECUTION_ENV .environmentVariable (),
127
+ testData .awsExecutionEnvVar );
128
+ } else {
129
+ ENVIRONMENT_VARIABLE_HELPER .remove (SdkSystemSetting .AWS_EXECUTION_ENV .environmentVariable ());
130
+ }
131
+
132
+ if (testData .awsRegionEnvVar != null ) {
133
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_REGION .environmentVariable (), testData .awsRegionEnvVar );
134
+ } else {
135
+ ENVIRONMENT_VARIABLE_HELPER .remove (SdkSystemSetting .AWS_REGION .environmentVariable ());
136
+ }
137
+
138
+ if (testData .awsDefaultRegionEnvVar != null ) {
139
+ ENVIRONMENT_VARIABLE_HELPER .set ("AWS_DEFAULT_REGION" , testData .awsDefaultRegionEnvVar );
140
+ } else {
141
+ ENVIRONMENT_VARIABLE_HELPER .remove ("AWS_DEFAULT_REGION" );
142
+ }
143
+
144
+ if (testData .ec2MetadataConfig != null ) {
145
+ if (testData .ec2MetadataConfig .ec2MetadataDisabledEnvVar != null ) {
146
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_EC2_METADATA_DISABLED .environmentVariable (),
147
+ testData .ec2MetadataConfig .ec2MetadataDisabledEnvVar );
148
+ }
149
+
150
+ if (testData .ec2MetadataConfig .imdsAvailable ) {
151
+ stubSuccessfulResponse (testData .ec2MetadataConfig .region );
152
+ }
153
+ }
154
+
155
+ Callable <DefaultsMode > result = () -> new AutoDefaultsModeDiscovery ().discover (testData .clientRegion );
156
+ assertThat (result .call ()).isEqualTo (testData .expectedResolvedMode );
157
+ }
158
+
159
+ public void stubSuccessfulResponse (String region ) {
160
+ stubFor (put ("/latest/api/token" )
161
+ .willReturn (aResponse ().withStatus (200 ).withBody ("token" )));
162
+
163
+ stubFor (get ("/latest/meta-data/placement/region" )
164
+ .willReturn (aResponse ().withStatus (200 ).withBody (region )));
165
+ }
166
+
167
+ private static final class TestData {
168
+ private Region clientRegion ;
169
+ private String javaVendorProperty ;
170
+ private String awsExecutionEnvVar ;
171
+ private String awsRegionEnvVar ;
172
+ private String awsDefaultRegionEnvVar ;
173
+ private Ec2MetadataConfig ec2MetadataConfig ;
174
+ private DefaultsMode expectedResolvedMode ;
175
+
176
+ public TestData clientRegion (Region clientRegion ) {
177
+ this .clientRegion = clientRegion ;
178
+ return this ;
179
+ }
180
+
181
+ public TestData javaVendorProperty (String javaVendorProperty ) {
182
+ this .javaVendorProperty = javaVendorProperty ;
183
+ return this ;
184
+ }
185
+
186
+ public TestData awsExecutionEnvVar (String awsExecutionEnvVar ) {
187
+ this .awsExecutionEnvVar = awsExecutionEnvVar ;
188
+ return this ;
189
+ }
190
+
191
+ public TestData awsRegionEnvVar (String awsRegionEnvVar ) {
192
+ this .awsRegionEnvVar = awsRegionEnvVar ;
193
+ return this ;
194
+ }
195
+
196
+ public TestData awsDefaultRegionEnvVar (String awsDefaultRegionEnvVar ) {
197
+ this .awsDefaultRegionEnvVar = awsDefaultRegionEnvVar ;
198
+ return this ;
199
+ }
200
+
201
+ public TestData ec2MetadataConfig (Ec2MetadataConfig ec2MetadataConfig ) {
202
+ this .ec2MetadataConfig = ec2MetadataConfig ;
203
+ return this ;
204
+ }
205
+
206
+ public TestData expectedResolvedMode (DefaultsMode expectedResolvedMode ) {
207
+ this .expectedResolvedMode = expectedResolvedMode ;
208
+ return this ;
209
+ }
210
+ }
211
+
212
+ private static final class Ec2MetadataConfig {
213
+ private boolean imdsAvailable ;
214
+ private String region ;
215
+ private String ec2MetadataDisabledEnvVar ;
216
+
217
+ public Ec2MetadataConfig imdsAvailable (boolean imdsAvailable ) {
218
+ this .imdsAvailable = imdsAvailable ;
219
+ return this ;
220
+ }
221
+
222
+ public Ec2MetadataConfig region (String region ) {
223
+ this .region = region ;
224
+ return this ;
225
+ }
226
+
227
+ public Ec2MetadataConfig ec2MetadataDisabledEnvVar (String ec2MetadataDisabledEnvVar ) {
228
+ this .ec2MetadataDisabledEnvVar = ec2MetadataDisabledEnvVar ;
229
+ return this ;
230
+ }
231
+ }
232
+ }
0 commit comments