1# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"). You
4# may not use this file except in compliance with the License. A copy of
5# the License is located at
6#
7# http://aws.amazon.com/apache2.0/
8#
9# or in the "license" file accompanying this file. This file is
10# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11# ANY KIND, either express or implied. See the License for the specific
12# language governing permissions and limitations under the License.
13import pytest
14
15from botocore.client import ClientEndpointBridge
16from botocore.exceptions import NoRegionError
17
18from tests import create_session, mock, BaseSessionTest, ClientHTTPStubber
19
20
21# NOTE: sqs endpoint updated to be the CN in the SSL cert because
22# a bug in python2.6 prevents subjectAltNames from being parsed
23# and subsequently being used in cert validation.
24# Same thing is needed for rds.
25KNOWN_REGIONS = {
26    'ap-northeast-1': {
27        'apigateway': 'apigateway.ap-northeast-1.amazonaws.com',
28        'appstream': 'appstream.ap-northeast-1.amazonaws.com',
29        'autoscaling': 'autoscaling.ap-northeast-1.amazonaws.com',
30        'cloudformation': 'cloudformation.ap-northeast-1.amazonaws.com',
31        'cloudhsm': 'cloudhsm.ap-northeast-1.amazonaws.com',
32        'cloudsearch': 'cloudsearch.ap-northeast-1.amazonaws.com',
33        'cloudtrail': 'cloudtrail.ap-northeast-1.amazonaws.com',
34        'codedeploy': 'codedeploy.ap-northeast-1.amazonaws.com',
35        'cognito-identity': 'cognito-identity.ap-northeast-1.amazonaws.com',
36        'cognito-sync': 'cognito-sync.ap-northeast-1.amazonaws.com',
37        'config': 'config.ap-northeast-1.amazonaws.com',
38        'datapipeline': 'datapipeline.ap-northeast-1.amazonaws.com',
39        'directconnect': 'directconnect.ap-northeast-1.amazonaws.com',
40        'ds': 'ds.ap-northeast-1.amazonaws.com',
41        'dynamodb': 'dynamodb.ap-northeast-1.amazonaws.com',
42        'ec2': 'ec2.ap-northeast-1.amazonaws.com',
43        'ecs': 'ecs.ap-northeast-1.amazonaws.com',
44        'elasticache': 'elasticache.ap-northeast-1.amazonaws.com',
45        'elasticbeanstalk': 'elasticbeanstalk.ap-northeast-1.amazonaws.com',
46        'elasticloadbalancing': 'elasticloadbalancing.ap-northeast-1.amazonaws.com',
47        'elasticmapreduce': 'ap-northeast-1.elasticmapreduce.amazonaws.com',
48        'elastictranscoder': 'elastictranscoder.ap-northeast-1.amazonaws.com',
49        'glacier': 'glacier.ap-northeast-1.amazonaws.com',
50        'iot': 'iot.ap-northeast-1.amazonaws.com',
51        'kinesis': 'kinesis.ap-northeast-1.amazonaws.com',
52        'kms': 'kms.ap-northeast-1.amazonaws.com',
53        'lambda': 'lambda.ap-northeast-1.amazonaws.com',
54        'logs': 'logs.ap-northeast-1.amazonaws.com',
55        'monitoring': 'monitoring.ap-northeast-1.amazonaws.com',
56        'rds': 'rds.ap-northeast-1.amazonaws.com',
57        'redshift': 'redshift.ap-northeast-1.amazonaws.com',
58        's3': 's3.ap-northeast-1.amazonaws.com',
59        'sdb': 'sdb.ap-northeast-1.amazonaws.com',
60        'sns': 'sns.ap-northeast-1.amazonaws.com',
61        'sqs': 'ap-northeast-1.queue.amazonaws.com',
62        'storagegateway': 'storagegateway.ap-northeast-1.amazonaws.com',
63        'streams.dynamodb': 'streams.dynamodb.ap-northeast-1.amazonaws.com',
64        'sts': 'sts.ap-northeast-1.amazonaws.com',
65        'swf': 'swf.ap-northeast-1.amazonaws.com',
66        'workspaces': 'workspaces.ap-northeast-1.amazonaws.com'
67    },
68    'ap-southeast-1': {
69        'autoscaling': 'autoscaling.ap-southeast-1.amazonaws.com',
70        'cloudformation': 'cloudformation.ap-southeast-1.amazonaws.com',
71        'cloudhsm': 'cloudhsm.ap-southeast-1.amazonaws.com',
72        'cloudsearch': 'cloudsearch.ap-southeast-1.amazonaws.com',
73        'cloudtrail': 'cloudtrail.ap-southeast-1.amazonaws.com',
74        'config': 'config.ap-southeast-1.amazonaws.com',
75        'directconnect': 'directconnect.ap-southeast-1.amazonaws.com',
76        'ds': 'ds.ap-southeast-1.amazonaws.com',
77        'dynamodb': 'dynamodb.ap-southeast-1.amazonaws.com',
78        'ec2': 'ec2.ap-southeast-1.amazonaws.com',
79        'elasticache': 'elasticache.ap-southeast-1.amazonaws.com',
80        'elasticbeanstalk': 'elasticbeanstalk.ap-southeast-1.amazonaws.com',
81        'elasticloadbalancing': 'elasticloadbalancing.ap-southeast-1.amazonaws.com',
82        'elasticmapreduce': 'ap-southeast-1.elasticmapreduce.amazonaws.com',
83        'elastictranscoder': 'elastictranscoder.ap-southeast-1.amazonaws.com',
84        'kinesis': 'kinesis.ap-southeast-1.amazonaws.com',
85        'kms': 'kms.ap-southeast-1.amazonaws.com',
86        'logs': 'logs.ap-southeast-1.amazonaws.com',
87        'monitoring': 'monitoring.ap-southeast-1.amazonaws.com',
88        'rds': 'rds.ap-southeast-1.amazonaws.com',
89        'redshift': 'redshift.ap-southeast-1.amazonaws.com',
90        's3': 's3.ap-southeast-1.amazonaws.com',
91        'sdb': 'sdb.ap-southeast-1.amazonaws.com',
92        'sns': 'sns.ap-southeast-1.amazonaws.com',
93        'sqs': 'ap-southeast-1.queue.amazonaws.com',
94        'storagegateway': 'storagegateway.ap-southeast-1.amazonaws.com',
95        'streams.dynamodb': 'streams.dynamodb.ap-southeast-1.amazonaws.com',
96        'sts': 'sts.ap-southeast-1.amazonaws.com',
97        'swf': 'swf.ap-southeast-1.amazonaws.com',
98        'workspaces': 'workspaces.ap-southeast-1.amazonaws.com'
99    },
100    'ap-southeast-2': {
101        'autoscaling': 'autoscaling.ap-southeast-2.amazonaws.com',
102        'cloudformation': 'cloudformation.ap-southeast-2.amazonaws.com',
103        'cloudhsm': 'cloudhsm.ap-southeast-2.amazonaws.com',
104        'cloudsearch': 'cloudsearch.ap-southeast-2.amazonaws.com',
105        'cloudtrail': 'cloudtrail.ap-southeast-2.amazonaws.com',
106        'codedeploy': 'codedeploy.ap-southeast-2.amazonaws.com',
107        'config': 'config.ap-southeast-2.amazonaws.com',
108        'datapipeline': 'datapipeline.ap-southeast-2.amazonaws.com',
109        'directconnect': 'directconnect.ap-southeast-2.amazonaws.com',
110        'ds': 'ds.ap-southeast-2.amazonaws.com',
111        'dynamodb': 'dynamodb.ap-southeast-2.amazonaws.com',
112        'ec2': 'ec2.ap-southeast-2.amazonaws.com',
113        'ecs': 'ecs.ap-southeast-2.amazonaws.com',
114        'elasticache': 'elasticache.ap-southeast-2.amazonaws.com',
115        'elasticbeanstalk': 'elasticbeanstalk.ap-southeast-2.amazonaws.com',
116        'elasticloadbalancing': 'elasticloadbalancing.ap-southeast-2.amazonaws.com',
117        'elasticmapreduce': 'ap-southeast-2.elasticmapreduce.amazonaws.com',
118        'glacier': 'glacier.ap-southeast-2.amazonaws.com',
119        'kinesis': 'kinesis.ap-southeast-2.amazonaws.com',
120        'kms': 'kms.ap-southeast-2.amazonaws.com',
121        'logs': 'logs.ap-southeast-2.amazonaws.com',
122        'monitoring': 'monitoring.ap-southeast-2.amazonaws.com',
123        'rds': 'rds.ap-southeast-2.amazonaws.com',
124        'redshift': 'redshift.ap-southeast-2.amazonaws.com',
125        's3': 's3.ap-southeast-2.amazonaws.com',
126        'sdb': 'sdb.ap-southeast-2.amazonaws.com',
127        'sns': 'sns.ap-southeast-2.amazonaws.com',
128        'sqs': 'ap-southeast-2.queue.amazonaws.com',
129        'storagegateway': 'storagegateway.ap-southeast-2.amazonaws.com',
130        'streams.dynamodb': 'streams.dynamodb.ap-southeast-2.amazonaws.com',
131        'sts': 'sts.ap-southeast-2.amazonaws.com',
132        'swf': 'swf.ap-southeast-2.amazonaws.com',
133        'workspaces': 'workspaces.ap-southeast-2.amazonaws.com'
134    },
135    'aws-us-gov-global': {
136        'iam': 'iam.us-gov.amazonaws.com'
137    },
138    'cn-north-1': {
139        'autoscaling': 'autoscaling.cn-north-1.amazonaws.com.cn',
140        'cloudformation': 'cloudformation.cn-north-1.amazonaws.com.cn',
141        'cloudtrail': 'cloudtrail.cn-north-1.amazonaws.com.cn',
142        'directconnect': 'directconnect.cn-north-1.amazonaws.com.cn',
143        'dynamodb': 'dynamodb.cn-north-1.amazonaws.com.cn',
144        'ec2': 'ec2.cn-north-1.amazonaws.com.cn',
145        'elasticache': 'elasticache.cn-north-1.amazonaws.com.cn',
146        'elasticbeanstalk': 'elasticbeanstalk.cn-north-1.amazonaws.com.cn',
147        'elasticloadbalancing': 'elasticloadbalancing.cn-north-1.amazonaws.com.cn',
148        'elasticmapreduce': 'elasticmapreduce.cn-north-1.amazonaws.com.cn',
149        'glacier': 'glacier.cn-north-1.amazonaws.com.cn',
150        'iam': 'iam.cn-north-1.amazonaws.com.cn',
151        'kinesis': 'kinesis.cn-north-1.amazonaws.com.cn',
152        'monitoring': 'monitoring.cn-north-1.amazonaws.com.cn',
153        'rds': 'rds.cn-north-1.amazonaws.com.cn',
154        's3': 's3.cn-north-1.amazonaws.com.cn',
155        'sns': 'sns.cn-north-1.amazonaws.com.cn',
156        'sqs': 'cn-north-1.queue.amazonaws.com.cn',
157        'storagegateway': 'storagegateway.cn-north-1.amazonaws.com.cn',
158        'streams.dynamodb': 'streams.dynamodb.cn-north-1.amazonaws.com.cn',
159        'sts': 'sts.cn-north-1.amazonaws.com.cn',
160        'swf': 'swf.cn-north-1.amazonaws.com.cn'
161    },
162    'eu-central-1': {
163        'autoscaling': 'autoscaling.eu-central-1.amazonaws.com',
164        'cloudformation': 'cloudformation.eu-central-1.amazonaws.com',
165        'cloudhsm': 'cloudhsm.eu-central-1.amazonaws.com',
166        'cloudsearch': 'cloudsearch.eu-central-1.amazonaws.com',
167        'cloudtrail': 'cloudtrail.eu-central-1.amazonaws.com',
168        'codedeploy': 'codedeploy.eu-central-1.amazonaws.com',
169        'config': 'config.eu-central-1.amazonaws.com',
170        'directconnect': 'directconnect.eu-central-1.amazonaws.com',
171        'dynamodb': 'dynamodb.eu-central-1.amazonaws.com',
172        'ec2': 'ec2.eu-central-1.amazonaws.com',
173        'elasticache': 'elasticache.eu-central-1.amazonaws.com',
174        'elasticbeanstalk': 'elasticbeanstalk.eu-central-1.amazonaws.com',
175        'elasticloadbalancing': 'elasticloadbalancing.eu-central-1.amazonaws.com',
176        'elasticmapreduce': 'elasticmapreduce.eu-central-1.amazonaws.com',
177        'glacier': 'glacier.eu-central-1.amazonaws.com',
178        'kinesis': 'kinesis.eu-central-1.amazonaws.com',
179        'kms': 'kms.eu-central-1.amazonaws.com',
180        'logs': 'logs.eu-central-1.amazonaws.com',
181        'monitoring': 'monitoring.eu-central-1.amazonaws.com',
182        'rds': 'rds.eu-central-1.amazonaws.com',
183        'redshift': 'redshift.eu-central-1.amazonaws.com',
184        's3': 's3.eu-central-1.amazonaws.com',
185        'sns': 'sns.eu-central-1.amazonaws.com',
186        'sqs': 'eu-central-1.queue.amazonaws.com',
187        'storagegateway': 'storagegateway.eu-central-1.amazonaws.com',
188        'streams.dynamodb': 'streams.dynamodb.eu-central-1.amazonaws.com',
189        'sts': 'sts.eu-central-1.amazonaws.com',
190        'swf': 'swf.eu-central-1.amazonaws.com'
191    },
192    'eu-west-1': {
193        'apigateway': 'apigateway.eu-west-1.amazonaws.com',
194        'autoscaling': 'autoscaling.eu-west-1.amazonaws.com',
195        'cloudformation': 'cloudformation.eu-west-1.amazonaws.com',
196        'cloudhsm': 'cloudhsm.eu-west-1.amazonaws.com',
197        'cloudsearch': 'cloudsearch.eu-west-1.amazonaws.com',
198        'cloudtrail': 'cloudtrail.eu-west-1.amazonaws.com',
199        'codedeploy': 'codedeploy.eu-west-1.amazonaws.com',
200        'cognito-identity': 'cognito-identity.eu-west-1.amazonaws.com',
201        'cognito-sync': 'cognito-sync.eu-west-1.amazonaws.com',
202        'config': 'config.eu-west-1.amazonaws.com',
203        'datapipeline': 'datapipeline.eu-west-1.amazonaws.com',
204        'directconnect': 'directconnect.eu-west-1.amazonaws.com',
205        'ds': 'ds.eu-west-1.amazonaws.com',
206        'dynamodb': 'dynamodb.eu-west-1.amazonaws.com',
207        'ec2': 'ec2.eu-west-1.amazonaws.com',
208        'ecs': 'ecs.eu-west-1.amazonaws.com',
209        'elasticache': 'elasticache.eu-west-1.amazonaws.com',
210        'elasticbeanstalk': 'elasticbeanstalk.eu-west-1.amazonaws.com',
211        'elasticloadbalancing': 'elasticloadbalancing.eu-west-1.amazonaws.com',
212        'elasticmapreduce': 'eu-west-1.elasticmapreduce.amazonaws.com',
213        'elastictranscoder': 'elastictranscoder.eu-west-1.amazonaws.com',
214        'email': 'email.eu-west-1.amazonaws.com',
215        'glacier': 'glacier.eu-west-1.amazonaws.com',
216        'iot': 'iot.eu-west-1.amazonaws.com',
217        'kinesis': 'kinesis.eu-west-1.amazonaws.com',
218        'kms': 'kms.eu-west-1.amazonaws.com',
219        'lambda': 'lambda.eu-west-1.amazonaws.com',
220        'logs': 'logs.eu-west-1.amazonaws.com',
221        'machinelearning': 'machinelearning.eu-west-1.amazonaws.com',
222        'monitoring': 'monitoring.eu-west-1.amazonaws.com',
223        'rds': 'rds.eu-west-1.amazonaws.com',
224        'redshift': 'redshift.eu-west-1.amazonaws.com',
225        's3': 's3.eu-west-1.amazonaws.com',
226        'sdb': 'sdb.eu-west-1.amazonaws.com',
227        'sns': 'sns.eu-west-1.amazonaws.com',
228        'sqs': 'eu-west-1.queue.amazonaws.com',
229        'ssm': 'ssm.eu-west-1.amazonaws.com',
230        'storagegateway': 'storagegateway.eu-west-1.amazonaws.com',
231        'streams.dynamodb': 'streams.dynamodb.eu-west-1.amazonaws.com',
232        'sts': 'sts.eu-west-1.amazonaws.com',
233        'swf': 'swf.eu-west-1.amazonaws.com',
234        'workspaces': 'workspaces.eu-west-1.amazonaws.com'
235    },
236    'fips-us-gov-west-1': {
237        's3': 's3-fips.us-gov-west-1.amazonaws.com'
238    },
239    's3-external-1': {
240        's3': 's3-external-1.amazonaws.com'
241    },
242    'sa-east-1': {
243        'autoscaling': 'autoscaling.sa-east-1.amazonaws.com',
244        'cloudformation': 'cloudformation.sa-east-1.amazonaws.com',
245        'cloudsearch': 'cloudsearch.sa-east-1.amazonaws.com',
246        'cloudtrail': 'cloudtrail.sa-east-1.amazonaws.com',
247        'config': 'config.sa-east-1.amazonaws.com',
248        'directconnect': 'directconnect.sa-east-1.amazonaws.com',
249        'dynamodb': 'dynamodb.sa-east-1.amazonaws.com',
250        'ec2': 'ec2.sa-east-1.amazonaws.com',
251        'elasticache': 'elasticache.sa-east-1.amazonaws.com',
252        'elasticbeanstalk': 'elasticbeanstalk.sa-east-1.amazonaws.com',
253        'elasticloadbalancing': 'elasticloadbalancing.sa-east-1.amazonaws.com',
254        'elasticmapreduce': 'sa-east-1.elasticmapreduce.amazonaws.com',
255        'kms': 'kms.sa-east-1.amazonaws.com',
256        'monitoring': 'monitoring.sa-east-1.amazonaws.com',
257        'rds': 'rds.sa-east-1.amazonaws.com',
258        's3': 's3.sa-east-1.amazonaws.com',
259        'sdb': 'sdb.sa-east-1.amazonaws.com',
260        'sns': 'sns.sa-east-1.amazonaws.com',
261        'sqs': 'sa-east-1.queue.amazonaws.com',
262        'storagegateway': 'storagegateway.sa-east-1.amazonaws.com',
263        'streams.dynamodb': 'streams.dynamodb.sa-east-1.amazonaws.com',
264        'sts': 'sts.sa-east-1.amazonaws.com',
265        'swf': 'swf.sa-east-1.amazonaws.com'
266    },
267    'us-east-1': {
268        'apigateway': 'apigateway.us-east-1.amazonaws.com',
269        'appstream': 'appstream.us-east-1.amazonaws.com',
270        'autoscaling': 'autoscaling.us-east-1.amazonaws.com',
271        'cloudformation': 'cloudformation.us-east-1.amazonaws.com',
272        'cloudfront': 'cloudfront.amazonaws.com',
273        'cloudhsm': 'cloudhsm.us-east-1.amazonaws.com',
274        'cloudsearch': 'cloudsearch.us-east-1.amazonaws.com',
275        'cloudtrail': 'cloudtrail.us-east-1.amazonaws.com',
276        'codecommit': 'codecommit.us-east-1.amazonaws.com',
277        'codedeploy': 'codedeploy.us-east-1.amazonaws.com',
278        'codepipeline': 'codepipeline.us-east-1.amazonaws.com',
279        'cognito-identity': 'cognito-identity.us-east-1.amazonaws.com',
280        'cognito-sync': 'cognito-sync.us-east-1.amazonaws.com',
281        'config': 'config.us-east-1.amazonaws.com',
282        'datapipeline': 'datapipeline.us-east-1.amazonaws.com',
283        'directconnect': 'directconnect.us-east-1.amazonaws.com',
284        'ds': 'ds.us-east-1.amazonaws.com',
285        'dynamodb': 'dynamodb.us-east-1.amazonaws.com',
286        'ec2': 'ec2.us-east-1.amazonaws.com',
287        'ecs': 'ecs.us-east-1.amazonaws.com',
288        'elasticache': 'elasticache.us-east-1.amazonaws.com',
289        'elasticbeanstalk': 'elasticbeanstalk.us-east-1.amazonaws.com',
290        'elasticloadbalancing': 'elasticloadbalancing.us-east-1.amazonaws.com',
291        'elasticmapreduce': 'elasticmapreduce.us-east-1.amazonaws.com',
292        'elastictranscoder': 'elastictranscoder.us-east-1.amazonaws.com',
293        'email': 'email.us-east-1.amazonaws.com',
294        'glacier': 'glacier.us-east-1.amazonaws.com',
295        'iam': 'iam.amazonaws.com',
296        'importexport': 'importexport.amazonaws.com',
297        'iot': 'iot.us-east-1.amazonaws.com',
298        'kinesis': 'kinesis.us-east-1.amazonaws.com',
299        'kms': 'kms.us-east-1.amazonaws.com',
300        'lambda': 'lambda.us-east-1.amazonaws.com',
301        'logs': 'logs.us-east-1.amazonaws.com',
302        'machinelearning': 'machinelearning.us-east-1.amazonaws.com',
303        'mobileanalytics': 'mobileanalytics.us-east-1.amazonaws.com',
304        'monitoring': 'monitoring.us-east-1.amazonaws.com',
305        'opsworks': 'opsworks.us-east-1.amazonaws.com',
306        'rds': 'rds.amazonaws.com',
307        'redshift': 'redshift.us-east-1.amazonaws.com',
308        'route53': 'route53.amazonaws.com',
309        'route53domains': 'route53domains.us-east-1.amazonaws.com',
310        's3': 's3.us-east-1.amazonaws.com',
311        'sdb': 'sdb.amazonaws.com',
312        'sns': 'sns.us-east-1.amazonaws.com',
313        'sqs': 'queue.amazonaws.com',
314        'ssm': 'ssm.us-east-1.amazonaws.com',
315        'storagegateway': 'storagegateway.us-east-1.amazonaws.com',
316        'streams.dynamodb': 'streams.dynamodb.us-east-1.amazonaws.com',
317        'sts': 'sts.us-east-1.amazonaws.com',
318        'support': 'support.us-east-1.amazonaws.com',
319        'swf': 'swf.us-east-1.amazonaws.com',
320        'workspaces': 'workspaces.us-east-1.amazonaws.com',
321        'waf': 'waf.amazonaws.com'
322    },
323    'us-gov-west-1': {
324        'autoscaling': 'autoscaling.us-gov-west-1.amazonaws.com',
325        'cloudformation': 'cloudformation.us-gov-west-1.amazonaws.com',
326        'cloudhsm': 'cloudhsm.us-gov-west-1.amazonaws.com',
327        'cloudtrail': 'cloudtrail.us-gov-west-1.amazonaws.com',
328        'dynamodb': 'dynamodb.us-gov-west-1.amazonaws.com',
329        'ec2': 'ec2.us-gov-west-1.amazonaws.com',
330        'elasticache': 'elasticache.us-gov-west-1.amazonaws.com',
331        'elasticloadbalancing': 'elasticloadbalancing.us-gov-west-1.amazonaws.com',
332        'elasticmapreduce': 'elasticmapreduce.us-gov-west-1.amazonaws.com',
333        'glacier': 'glacier.us-gov-west-1.amazonaws.com',
334        'iam': 'iam.us-gov.amazonaws.com',
335        'kms': 'kms.us-gov-west-1.amazonaws.com',
336        'monitoring': 'monitoring.us-gov-west-1.amazonaws.com',
337        'rds': 'rds.us-gov-west-1.amazonaws.com',
338        'redshift': 'redshift.us-gov-west-1.amazonaws.com',
339        's3': 's3.us-gov-west-1.amazonaws.com',
340        'sns': 'sns.us-gov-west-1.amazonaws.com',
341        'sqs': 'us-gov-west-1.queue.amazonaws.com',
342        'sts': 'sts.us-gov-west-1.amazonaws.com',
343        'swf': 'swf.us-gov-west-1.amazonaws.com'
344    },
345    'us-west-1': {
346        'autoscaling': 'autoscaling.us-west-1.amazonaws.com',
347        'cloudformation': 'cloudformation.us-west-1.amazonaws.com',
348        'cloudsearch': 'cloudsearch.us-west-1.amazonaws.com',
349        'cloudtrail': 'cloudtrail.us-west-1.amazonaws.com',
350        'config': 'config.us-west-1.amazonaws.com',
351        'directconnect': 'directconnect.us-west-1.amazonaws.com',
352        'dynamodb': 'dynamodb.us-west-1.amazonaws.com',
353        'ec2': 'ec2.us-west-1.amazonaws.com',
354        'ecs': 'ecs.us-west-1.amazonaws.com',
355        'elasticache': 'elasticache.us-west-1.amazonaws.com',
356        'elasticbeanstalk': 'elasticbeanstalk.us-west-1.amazonaws.com',
357        'elasticloadbalancing': 'elasticloadbalancing.us-west-1.amazonaws.com',
358        'elasticmapreduce': 'us-west-1.elasticmapreduce.amazonaws.com',
359        'elastictranscoder': 'elastictranscoder.us-west-1.amazonaws.com',
360        'glacier': 'glacier.us-west-1.amazonaws.com',
361        'kinesis': 'kinesis.us-west-1.amazonaws.com',
362        'kms': 'kms.us-west-1.amazonaws.com',
363        'logs': 'logs.us-west-1.amazonaws.com',
364        'monitoring': 'monitoring.us-west-1.amazonaws.com',
365        'rds': 'rds.us-west-1.amazonaws.com',
366        's3': 's3.us-west-1.amazonaws.com',
367        'sdb': 'sdb.us-west-1.amazonaws.com',
368        'sns': 'sns.us-west-1.amazonaws.com',
369        'sqs': 'us-west-1.queue.amazonaws.com',
370        'storagegateway': 'storagegateway.us-west-1.amazonaws.com',
371        'streams.dynamodb': 'streams.dynamodb.us-west-1.amazonaws.com',
372        'sts': 'sts.us-west-1.amazonaws.com',
373        'swf': 'swf.us-west-1.amazonaws.com'
374    },
375    'us-west-2': {
376        'apigateway': 'apigateway.us-west-2.amazonaws.com',
377        'autoscaling': 'autoscaling.us-west-2.amazonaws.com',
378        'cloudformation': 'cloudformation.us-west-2.amazonaws.com',
379        'cloudhsm': 'cloudhsm.us-west-2.amazonaws.com',
380        'cloudsearch': 'cloudsearch.us-west-2.amazonaws.com',
381        'cloudtrail': 'cloudtrail.us-west-2.amazonaws.com',
382        'codedeploy': 'codedeploy.us-west-2.amazonaws.com',
383        'codepipeline': 'codepipeline.us-west-2.amazonaws.com',
384        'config': 'config.us-west-2.amazonaws.com',
385        'datapipeline': 'datapipeline.us-west-2.amazonaws.com',
386        'devicefarm': 'devicefarm.us-west-2.amazonaws.com',
387        'directconnect': 'directconnect.us-west-2.amazonaws.com',
388        'ds': 'ds.us-west-2.amazonaws.com',
389        'dynamodb': 'dynamodb.us-west-2.amazonaws.com',
390        'ec2': 'ec2.us-west-2.amazonaws.com',
391        'ecs': 'ecs.us-west-2.amazonaws.com',
392        'elasticache': 'elasticache.us-west-2.amazonaws.com',
393        'elasticbeanstalk': 'elasticbeanstalk.us-west-2.amazonaws.com',
394        'elasticfilesystem': 'elasticfilesystem.us-west-2.amazonaws.com',
395        'elasticloadbalancing': 'elasticloadbalancing.us-west-2.amazonaws.com',
396        'elasticmapreduce': 'us-west-2.elasticmapreduce.amazonaws.com',
397        'elastictranscoder': 'elastictranscoder.us-west-2.amazonaws.com',
398        'email': 'email.us-west-2.amazonaws.com',
399        'glacier': 'glacier.us-west-2.amazonaws.com',
400        'iot': 'iot.us-west-2.amazonaws.com',
401        'kinesis': 'kinesis.us-west-2.amazonaws.com',
402        'kms': 'kms.us-west-2.amazonaws.com',
403        'lambda': 'lambda.us-west-2.amazonaws.com',
404        'logs': 'logs.us-west-2.amazonaws.com',
405        'monitoring': 'monitoring.us-west-2.amazonaws.com',
406        'rds': 'rds.us-west-2.amazonaws.com',
407        'redshift': 'redshift.us-west-2.amazonaws.com',
408        's3': 's3.us-west-2.amazonaws.com',
409        'sdb': 'sdb.us-west-2.amazonaws.com',
410        'sns': 'sns.us-west-2.amazonaws.com',
411        'sqs': 'us-west-2.queue.amazonaws.com',
412        'ssm': 'ssm.us-west-2.amazonaws.com',
413        'storagegateway': 'storagegateway.us-west-2.amazonaws.com',
414        'streams.dynamodb': 'streams.dynamodb.us-west-2.amazonaws.com',
415        'sts': 'sts.us-west-2.amazonaws.com',
416        'swf': 'swf.us-west-2.amazonaws.com',
417        'workspaces': 'workspaces.us-west-2.amazonaws.com'
418    }
419}
420
421
422# Lists the services in the aws partition that do not require a region
423# when resolving an endpoint because these services have partitionWide
424# endpoints.
425KNOWN_AWS_PARTITION_WIDE = {
426    'importexport': 'https://importexport.amazonaws.com',
427    'cloudfront': 'https://cloudfront.amazonaws.com',
428    'waf': 'https://waf.amazonaws.com',
429    'route53': 'https://route53.amazonaws.com',
430    's3': 'https://s3.amazonaws.com',
431    'sts': 'https://sts.amazonaws.com',
432    'iam': 'https://iam.amazonaws.com'
433}
434
435
436def _get_patched_session():
437    with mock.patch('os.environ') as environ:
438        environ['AWS_ACCESS_KEY_ID'] = 'access_key'
439        environ['AWS_SECRET_ACCESS_KEY'] = 'secret_key'
440        environ['AWS_CONFIG_FILE'] = 'no-exist-foo'
441        session = create_session()
442    return session
443
444
445def _known_endpoints_by_region():
446    for region_name, service_dict in KNOWN_REGIONS.items():
447        for service_name, endpoint in service_dict.items():
448            yield service_name, region_name, endpoint
449
450
451@pytest.mark.parametrize(
452    "service_name, region_name, expected_endpoint",
453    _known_endpoints_by_region()
454)
455def test_single_service_region_endpoint(service_name, region_name, expected_endpoint):
456    # Verify the actual values from the partition files.  While
457    # TestEndpointHeuristics verified the generic functionality given any
458    # endpoints file, this test actually verifies the partition data against a
459    # fixed list of known endpoints.  This list doesn't need to be kept 100% up
460    # to date, but serves as a basis for regressions as the endpoint data
461    # logic evolves.
462    resolver = _get_patched_session()._get_internal_component(
463        'endpoint_resolver')
464    bridge = ClientEndpointBridge(resolver, None, None)
465    result = bridge.resolve(service_name, region_name)
466    expected = 'https://%s' % expected_endpoint
467    assert result['endpoint_url'] == expected
468
469
470# Ensure that all S3 regions use s3v4 instead of v4
471def test_all_s3_endpoints_have_s3v4():
472    session = _get_patched_session()
473    partitions = session.get_available_partitions()
474    resolver = session._get_internal_component('endpoint_resolver')
475    for partition_name in partitions:
476        for endpoint in session.get_available_regions('s3', partition_name):
477            resolved = resolver.construct_endpoint('s3', endpoint)
478            assert 's3v4' in resolved['signatureVersions']
479            assert 'v4' not in resolved['signatureVersions']
480
481
482@pytest.mark.parametrize(
483    "service_name, expected_endpoint",
484    KNOWN_AWS_PARTITION_WIDE.items()
485)
486def test_single_service_partition_endpoint(service_name, expected_endpoint):
487    resolver = _get_patched_session()._get_internal_component(
488        'endpoint_resolver')
489    bridge = ClientEndpointBridge(resolver)
490    result = bridge.resolve(service_name)
491    assert result['endpoint_url'] == expected_endpoint
492
493
494def test_non_partition_endpoint_requires_region():
495    resolver = _get_patched_session()._get_internal_component(
496        'endpoint_resolver')
497    with pytest.raises(NoRegionError):
498        resolver.construct_endpoint('ec2')
499
500
501class TestEndpointResolution(BaseSessionTest):
502
503    def setUp(self):
504        super(TestEndpointResolution, self).setUp()
505        self.xml_response = (
506            b'<?xml version="1.0" encoding="UTF-8"?>\n\n'
507            b'<ListRolesResponse '
508            b'xmlns="https://iam.amazonaws.com/doc/2010-05-08/">\n'
509            b'<ListRolesResult>\n</ListRolesResult>'
510            b'</ListRolesResponse>'
511        )
512
513    def create_stubbed_client(self, service_name, region_name, **kwargs):
514        client = self.session.create_client(service_name, region_name, **kwargs)
515        http_stubber = ClientHTTPStubber(client)
516        http_stubber.start()
517        return client, http_stubber
518
519    def test_regionalized_client_endpoint_resolution(self):
520        client, stubber = self.create_stubbed_client('s3', 'us-east-2')
521        stubber.add_response()
522        client.list_buckets()
523        self.assertEqual(
524            stubber.requests[0].url,
525            'https://s3.us-east-2.amazonaws.com/'
526        )
527
528    def test_regionalized_client_with_unknown_region(self):
529        client, stubber = self.create_stubbed_client('s3', 'not-real')
530        stubber.add_response()
531        client.list_buckets()
532        # Validate we don't fall back to partition endpoint for
533        # regionalized services.
534        self.assertEqual(
535            stubber.requests[0].url,
536            'https://s3.not-real.amazonaws.com/'
537        )
538
539    def test_unregionalized_client_endpoint_resolution(self):
540        client, stubber = self.create_stubbed_client('iam', 'us-west-2')
541        stubber.add_response(body=self.xml_response)
542        client.list_roles()
543        self.assertTrue(
544            stubber.requests[0].url.startswith('https://iam.amazonaws.com/')
545        )
546
547    def test_unregionalized_client_with_unknown_region(self):
548        client, stubber = self.create_stubbed_client('iam', 'not-real')
549        stubber.add_response(body=self.xml_response)
550        client.list_roles()
551        self.assertTrue(
552            stubber.requests[0].url.startswith('https://iam.amazonaws.com/')
553        )
554