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