From d7ba355a65f17664c56a7fedd7423a16605f2469 Mon Sep 17 00:00:00 2001 From: gruebel Date: Thu, 26 Dec 2019 17:12:22 +0100 Subject: [PATCH] Add missing regions to all services --- moto/apigateway/models.py | 8 ++++ moto/athena/models.py | 9 +++- moto/awslambda/models.py | 16 ++++--- moto/batch/models.py | 14 ++++-- moto/cloudformation/models.py | 14 +++++- moto/cloudwatch/models.py | 13 ++++- moto/codepipeline/models.py | 6 +++ moto/cognitoidentity/models.py | 13 ++++- moto/cognitoidp/models.py | 11 ++++- moto/config/models.py | 7 ++- moto/datapipeline/models.py | 12 ++++- moto/datasync/models.py | 11 +++-- moto/dynamodb2/models.py | 13 +++-- moto/dynamodbstreams/models.py | 18 +++++-- moto/ec2/models.py | 48 ++++++++++++++++++- moto/ecs/models.py | 14 ++++-- moto/emr/models.py | 9 +++- moto/events/models.py | 11 +++-- moto/glacier/models.py | 10 +++- moto/iot/models.py | 11 +++-- moto/iotdata/models.py | 12 +++-- moto/kinesis/models.py | 10 +++- moto/kms/models.py | 9 +++- moto/logs/models.py | 12 +++-- moto/polly/models.py | 13 +++-- moto/rds2/models.py | 11 +++-- moto/redshift/models.py | 11 +++-- moto/resourcegroups/models.py | 18 +++++-- moto/resourcegroupstaggingapi/models.py | 20 +++++--- moto/secretsmanager/models.py | 16 +++++-- moto/sns/models.py | 4 ++ moto/sqs/models.py | 9 +++- moto/stepfunctions/models.py | 16 +++++-- moto/swf/models/__init__.py | 9 +++- scripts/template/lib/models.py.j2 | 11 +++-- .../test_availability_zones_and_regions.py | 4 +- tests/test_ec2/test_regions.py | 10 +++- tests/test_glacier/test_glacier_jobs.py | 2 +- 38 files changed, 358 insertions(+), 107 deletions(-) diff --git a/moto/apigateway/models.py b/moto/apigateway/models.py index 8b5fb787f..fd2fb7064 100644 --- a/moto/apigateway/models.py +++ b/moto/apigateway/models.py @@ -847,3 +847,11 @@ class APIGatewayBackend(BaseBackend): apigateway_backends = {} for region_name in Session().get_available_regions("apigateway"): apigateway_backends[region_name] = APIGatewayBackend(region_name) +for region_name in Session().get_available_regions( + "apigateway", partition_name="aws-us-gov" +): + apigateway_backends[region_name] = APIGatewayBackend(region_name) +for region_name in Session().get_available_regions( + "apigateway", partition_name="aws-cn" +): + apigateway_backends[region_name] = APIGatewayBackend(region_name) diff --git a/moto/athena/models.py b/moto/athena/models.py index 2f41046a9..6aeca0ffa 100644 --- a/moto/athena/models.py +++ b/moto/athena/models.py @@ -1,7 +1,8 @@ from __future__ import unicode_literals import time -import boto3 +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.core import ACCOUNT_ID @@ -77,5 +78,9 @@ class AthenaBackend(BaseBackend): athena_backends = {} -for region in boto3.Session().get_available_regions("athena"): +for region in Session().get_available_regions("athena"): + athena_backends[region] = AthenaBackend(region) +for region in Session().get_available_regions("athena", partition_name="aws-us-gov"): + athena_backends[region] = AthenaBackend(region) +for region in Session().get_available_regions("athena", partition_name="aws-cn"): athena_backends[region] = AthenaBackend(region) diff --git a/moto/awslambda/models.py b/moto/awslambda/models.py index b1b8f57a8..5795ff5df 100644 --- a/moto/awslambda/models.py +++ b/moto/awslambda/models.py @@ -24,6 +24,8 @@ import weakref import requests.adapters import boto.awslambda +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.core.exceptions import RESTError from moto.iam.models import iam_backend @@ -1043,10 +1045,10 @@ def do_validate_s3(): return os.environ.get("VALIDATE_LAMBDA_S3", "") in ["", "1", "true"] -# Handle us forgotten regions, unless Lambda truly only runs out of US and -lambda_backends = { - _region.name: LambdaBackend(_region.name) for _region in boto.awslambda.regions() -} - -lambda_backends["ap-southeast-2"] = LambdaBackend("ap-southeast-2") -lambda_backends["us-gov-west-1"] = LambdaBackend("us-gov-west-1") +lambda_backends = {} +for region in Session().get_available_regions("lambda"): + lambda_backends[region] = LambdaBackend(region) +for region in Session().get_available_regions("lambda", partition_name="aws-us-gov"): + lambda_backends[region] = LambdaBackend(region) +for region in Session().get_available_regions("lambda", partition_name="aws-cn"): + lambda_backends[region] = LambdaBackend(region) diff --git a/moto/batch/models.py b/moto/batch/models.py index e12cc8f84..fc35f2997 100644 --- a/moto/batch/models.py +++ b/moto/batch/models.py @@ -1,5 +1,4 @@ from __future__ import unicode_literals -import boto3 import re import requests.adapters from itertools import cycle @@ -12,6 +11,8 @@ import docker import functools import threading import dateutil.parser +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.iam import iam_backends from moto.ec2 import ec2_backends @@ -1317,7 +1318,10 @@ class BatchBackend(BaseBackend): job.terminate(reason) -available_regions = boto3.session.Session().get_available_regions("batch") -batch_backends = { - region: BatchBackend(region_name=region) for region in available_regions -} +batch_backends = {} +for region in Session().get_available_regions("batch"): + batch_backends[region] = BatchBackend(region) +for region in Session().get_available_regions("batch", partition_name="aws-us-gov"): + batch_backends[region] = BatchBackend(region) +for region in Session().get_available_regions("batch", partition_name="aws-cn"): + batch_backends[region] = BatchBackend(region) diff --git a/moto/cloudformation/models.py b/moto/cloudformation/models.py index 71ceaf168..073d84ce8 100644 --- a/moto/cloudformation/models.py +++ b/moto/cloudformation/models.py @@ -5,6 +5,8 @@ import yaml import uuid import boto.cloudformation +from boto3 import Session + from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel @@ -717,5 +719,13 @@ class CloudFormationBackend(BaseBackend): cloudformation_backends = {} -for region in boto.cloudformation.regions(): - cloudformation_backends[region.name] = CloudFormationBackend() +for region in Session().get_available_regions("cloudformation"): + cloudformation_backends[region] = CloudFormationBackend() +for region in Session().get_available_regions( + "cloudformation", partition_name="aws-us-gov" +): + cloudformation_backends[region] = CloudFormationBackend() +for region in Session().get_available_regions( + "cloudformation", partition_name="aws-cn" +): + cloudformation_backends[region] = CloudFormationBackend() diff --git a/moto/cloudwatch/models.py b/moto/cloudwatch/models.py index 662005237..18f5965a8 100644 --- a/moto/cloudwatch/models.py +++ b/moto/cloudwatch/models.py @@ -1,4 +1,7 @@ import json + +from boto3 import Session + from moto.core.utils import iso_8601_datetime_with_milliseconds from moto.core import BaseBackend, BaseModel from moto.core.exceptions import RESTError @@ -431,5 +434,11 @@ class LogGroup(BaseModel): cloudwatch_backends = {} -for region in boto.ec2.cloudwatch.regions(): - cloudwatch_backends[region.name] = CloudWatchBackend() +for region in Session().get_available_regions("cloudwatch"): + cloudwatch_backends[region] = CloudWatchBackend() +for region in Session().get_available_regions( + "cloudwatch", partition_name="aws-us-gov" +): + cloudwatch_backends[region] = CloudWatchBackend() +for region in Session().get_available_regions("cloudwatch", partition_name="aws-cn"): + cloudwatch_backends[region] = CloudWatchBackend() diff --git a/moto/codepipeline/models.py b/moto/codepipeline/models.py index b3e76f838..b67d48989 100644 --- a/moto/codepipeline/models.py +++ b/moto/codepipeline/models.py @@ -149,3 +149,9 @@ class CodePipelineBackend(BaseBackend): codepipeline_backends = {} for region in Session().get_available_regions("codepipeline"): codepipeline_backends[region] = CodePipelineBackend() +for region in Session().get_available_regions( + "codepipeline", partition_name="aws-us-gov" +): + codepipeline_backends[region] = CodePipelineBackend() +for region in Session().get_available_regions("codepipeline", partition_name="aws-cn"): + codepipeline_backends[region] = CodePipelineBackend() diff --git a/moto/cognitoidentity/models.py b/moto/cognitoidentity/models.py index 2a4f5d4bc..20fd1241e 100644 --- a/moto/cognitoidentity/models.py +++ b/moto/cognitoidentity/models.py @@ -4,6 +4,7 @@ import datetime import json import boto.cognito.identity +from boto3 import Session from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel @@ -136,5 +137,13 @@ class CognitoIdentityBackend(BaseBackend): cognitoidentity_backends = {} -for region in boto.cognito.identity.regions(): - cognitoidentity_backends[region.name] = CognitoIdentityBackend(region.name) +for region in Session().get_available_regions("cognito-identity"): + cognitoidentity_backends[region] = CognitoIdentityBackend(region) +for region in Session().get_available_regions( + "cognito-identity", partition_name="aws-us-gov" +): + cognitoidentity_backends[region] = CognitoIdentityBackend(region) +for region in Session().get_available_regions( + "cognito-identity", partition_name="aws-cn" +): + cognitoidentity_backends[region] = CognitoIdentityBackend(region) diff --git a/moto/cognitoidp/models.py b/moto/cognitoidp/models.py index 6700920ce..70db9b7fa 100644 --- a/moto/cognitoidp/models.py +++ b/moto/cognitoidp/models.py @@ -10,6 +10,7 @@ import time import uuid import boto.cognito.identity +from boto3 import Session from jose import jws from moto.compat import OrderedDict @@ -749,8 +750,14 @@ class CognitoIdpBackend(BaseBackend): cognitoidp_backends = {} -for region in boto.cognito.identity.regions(): - cognitoidp_backends[region.name] = CognitoIdpBackend(region.name) +for region in Session().get_available_regions("cognito-idp"): + cognitoidp_backends[region] = CognitoIdpBackend(region) +for region in Session().get_available_regions( + "cognito-idp", partition_name="aws-us-gov" +): + cognitoidp_backends[region] = CognitoIdpBackend(region) +for region in Session().get_available_regions("cognito-idp", partition_name="aws-cn"): + cognitoidp_backends[region] = CognitoIdpBackend(region) # Hack to help moto-server process requests on localhost, where the region isn't diff --git a/moto/config/models.py b/moto/config/models.py index 9015762fe..45dccd1ba 100644 --- a/moto/config/models.py +++ b/moto/config/models.py @@ -1084,6 +1084,9 @@ class ConfigBackend(BaseBackend): config_backends = {} -boto3_session = Session() -for region in boto3_session.get_available_regions("config"): +for region in Session().get_available_regions("config"): + config_backends[region] = ConfigBackend() +for region in Session().get_available_regions("config", partition_name="aws-us-gov"): + config_backends[region] = ConfigBackend() +for region in Session().get_available_regions("config", partition_name="aws-cn"): config_backends[region] = ConfigBackend() diff --git a/moto/datapipeline/models.py b/moto/datapipeline/models.py index cc1fe777e..1964db008 100644 --- a/moto/datapipeline/models.py +++ b/moto/datapipeline/models.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals import datetime import boto.datapipeline +from boto3 import Session + from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel from .utils import get_random_pipeline_id, remove_capitalization_of_dict_keys @@ -142,5 +144,11 @@ class DataPipelineBackend(BaseBackend): datapipeline_backends = {} -for region in boto.datapipeline.regions(): - datapipeline_backends[region.name] = DataPipelineBackend() +for region in Session().get_available_regions("datapipeline"): + datapipeline_backends[region] = DataPipelineBackend() +for region in Session().get_available_regions( + "datapipeline", partition_name="aws-us-gov" +): + datapipeline_backends[region] = DataPipelineBackend() +for region in Session().get_available_regions("datapipeline", partition_name="aws-cn"): + datapipeline_backends[region] = DataPipelineBackend(region) diff --git a/moto/datasync/models.py b/moto/datasync/models.py index 17a2659fb..702cace5b 100644 --- a/moto/datasync/models.py +++ b/moto/datasync/models.py @@ -1,4 +1,5 @@ -import boto3 +from boto3 import Session + from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel @@ -226,5 +227,9 @@ class DataSyncBackend(BaseBackend): datasync_backends = {} -for region in boto3.Session().get_available_regions("datasync"): - datasync_backends[region] = DataSyncBackend(region_name=region) +for region in Session().get_available_regions("datasync"): + datasync_backends[region] = DataSyncBackend(region) +for region in Session().get_available_regions("datasync", partition_name="aws-us-gov"): + datasync_backends[region] = DataSyncBackend(region) +for region in Session().get_available_regions("datasync", partition_name="aws-cn"): + datasync_backends[region] = DataSyncBackend(region) diff --git a/moto/dynamodb2/models.py b/moto/dynamodb2/models.py index 121f564a4..1fcde527c 100644 --- a/moto/dynamodb2/models.py +++ b/moto/dynamodb2/models.py @@ -8,7 +8,7 @@ import re import uuid import six -import boto3 +from boto3 import Session from botocore.exceptions import ParamValidationError from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel @@ -1484,7 +1484,10 @@ class DynamoDBBackend(BaseBackend): return table.ttl -available_regions = boto3.session.Session().get_available_regions("dynamodb") -dynamodb_backends = { - region: DynamoDBBackend(region_name=region) for region in available_regions -} +dynamodb_backends = {} +for region in Session().get_available_regions("dynamodb"): + dynamodb_backends[region] = DynamoDBBackend(region) +for region in Session().get_available_regions("dynamodb", partition_name="aws-us-gov"): + dynamodb_backends[region] = DynamoDBBackend(region) +for region in Session().get_available_regions("dynamodb", partition_name="aws-cn"): + dynamodb_backends[region] = DynamoDBBackend(region) diff --git a/moto/dynamodbstreams/models.py b/moto/dynamodbstreams/models.py index 6e99d8ef6..dc6f0e0d3 100644 --- a/moto/dynamodbstreams/models.py +++ b/moto/dynamodbstreams/models.py @@ -2,9 +2,10 @@ from __future__ import unicode_literals import os import json -import boto3 import base64 +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.dynamodb2.models import dynamodb_backends @@ -139,7 +140,14 @@ class DynamoDBStreamsBackend(BaseBackend): return json.dumps(shard_iterator.get(limit)) -available_regions = boto3.session.Session().get_available_regions("dynamodbstreams") -dynamodbstreams_backends = { - region: DynamoDBStreamsBackend(region=region) for region in available_regions -} +dynamodbstreams_backends = {} +for region in Session().get_available_regions("dynamodbstreams"): + dynamodbstreams_backends[region] = DynamoDBStreamsBackend(region) +for region in Session().get_available_regions( + "dynamodbstreams", partition_name="aws-us-gov" +): + dynamodbstreams_backends[region] = DynamoDBStreamsBackend(region) +for region in Session().get_available_regions( + "dynamodbstreams", partition_name="aws-cn" +): + dynamodbstreams_backends[region] = DynamoDBStreamsBackend(region) diff --git a/moto/ec2/models.py b/moto/ec2/models.py index 374494faa..e492ae7c6 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -8,6 +8,8 @@ import os import re import six import warnings + +from boto3 import Session from pkg_resources import resource_filename import boto.ec2 @@ -1473,7 +1475,13 @@ class Zone(object): class RegionsAndZonesBackend(object): - regions = [Region(ri.name, ri.endpoint) for ri in boto.ec2.regions()] + regions = [] + for region in Session().get_available_regions("ec2"): + regions.append(Region(region, "ec2.{}.amazonaws.com".format(region))) + for region in Session().get_available_regions("ec2", partition_name="aws-us-gov"): + regions.append(Region(region, "ec2.{}.amazonaws.com".format(region))) + for region in Session().get_available_regions("ec2", partition_name="aws-cn"): + regions.append(Region(region, "ec2.{}.amazonaws.com.cn".format(region))) zones = { "ap-south-1": [ @@ -1536,6 +1544,11 @@ class RegionsAndZonesBackend(object): zone_id="apne1-az2", ), ], + "ap-east-1": [ + Zone(region_name="ap-east-1", name="ap-east-1a", zone_id="ape1-az1"), + Zone(region_name="ap-east-1", name="ap-east-1b", zone_id="ape1-az2"), + Zone(region_name="ap-east-1", name="ap-east-1c", zone_id="ape1-az3"), + ], "sa-east-1": [ Zone(region_name="sa-east-1", name="sa-east-1a", zone_id="sae1-az1"), Zone(region_name="sa-east-1", name="sa-east-1c", zone_id="sae1-az3"), @@ -1605,10 +1618,32 @@ class RegionsAndZonesBackend(object): Zone(region_name="us-west-2", name="us-west-2b", zone_id="usw2-az1"), Zone(region_name="us-west-2", name="us-west-2c", zone_id="usw2-az3"), ], + "me-south-1": [ + Zone(region_name="me-south-1", name="me-south-1a", zone_id="mes1-az1"), + Zone(region_name="me-south-1", name="me-south-1b", zone_id="mes1-az2"), + Zone(region_name="me-south-1", name="me-south-1c", zone_id="mes1-az3"), + ], "cn-north-1": [ Zone(region_name="cn-north-1", name="cn-north-1a", zone_id="cnn1-az1"), Zone(region_name="cn-north-1", name="cn-north-1b", zone_id="cnn1-az2"), ], + "cn-northwest-1": [ + Zone( + region_name="cn-northwest-1", + name="cn-northwest-1a", + zone_id="cnnw1-az1", + ), + Zone( + region_name="cn-northwest-1", + name="cn-northwest-1b", + zone_id="cnnw1-az2", + ), + Zone( + region_name="cn-northwest-1", + name="cn-northwest-1c", + zone_id="cnnw1-az3", + ), + ], "us-gov-west-1": [ Zone( region_name="us-gov-west-1", name="us-gov-west-1a", zone_id="usgw1-az1" @@ -1620,6 +1655,17 @@ class RegionsAndZonesBackend(object): region_name="us-gov-west-1", name="us-gov-west-1c", zone_id="usgw1-az3" ), ], + "us-gov-east-1": [ + Zone( + region_name="us-gov-east-1", name="us-gov-east-1a", zone_id="usge1-az1" + ), + Zone( + region_name="us-gov-east-1", name="us-gov-east-1b", zone_id="usge1-az2" + ), + Zone( + region_name="us-gov-east-1", name="us-gov-east-1c", zone_id="usge1-az3" + ), + ], } def describe_regions(self, region_names=[]): diff --git a/moto/ecs/models.py b/moto/ecs/models.py index c9dc998ee..845bdf650 100644 --- a/moto/ecs/models.py +++ b/moto/ecs/models.py @@ -3,9 +3,10 @@ import re import uuid from datetime import datetime from random import random, randint -import boto3 import pytz +from boto3 import Session + from moto.core.exceptions import JsonRESTError from moto.core import BaseBackend, BaseModel from moto.core.utils import unix_time @@ -1302,7 +1303,10 @@ class EC2ContainerServiceBackend(BaseBackend): raise NotImplementedError() -available_regions = boto3.session.Session().get_available_regions("ecs") -ecs_backends = { - region: EC2ContainerServiceBackend(region) for region in available_regions -} +ecs_backends = {} +for region in Session().get_available_regions("ecs"): + ecs_backends[region] = EC2ContainerServiceBackend(region) +for region in Session().get_available_regions("ecs", partition_name="aws-us-gov"): + ecs_backends[region] = EC2ContainerServiceBackend(region) +for region in Session().get_available_regions("ecs", partition_name="aws-cn"): + ecs_backends[region] = EC2ContainerServiceBackend(region) diff --git a/moto/emr/models.py b/moto/emr/models.py index b62ce7932..3e10eff1a 100644 --- a/moto/emr/models.py +++ b/moto/emr/models.py @@ -4,6 +4,7 @@ from datetime import timedelta import boto.emr import pytz +from boto3 import Session from dateutil.parser import parse as dtparse from moto.core import BaseBackend, BaseModel from moto.emr.exceptions import EmrError @@ -460,5 +461,9 @@ class ElasticMapReduceBackend(BaseBackend): emr_backends = {} -for region in boto.emr.regions(): - emr_backends[region.name] = ElasticMapReduceBackend(region.name) +for region in Session().get_available_regions("emr"): + emr_backends[region] = ElasticMapReduceBackend(region) +for region in Session().get_available_regions("emr", partition_name="aws-us-gov"): + emr_backends[region] = ElasticMapReduceBackend(region) +for region in Session().get_available_regions("emr", partition_name="aws-cn"): + emr_backends[region] = ElasticMapReduceBackend(region) diff --git a/moto/events/models.py b/moto/events/models.py index 0298c7c69..548d41393 100644 --- a/moto/events/models.py +++ b/moto/events/models.py @@ -1,7 +1,7 @@ import os import re import json -import boto3 +from boto3 import Session from moto.core.exceptions import JsonRESTError from moto.core import BaseBackend, BaseModel @@ -362,5 +362,10 @@ class EventsBackend(BaseBackend): self.event_buses.pop(name, None) -available_regions = boto3.session.Session().get_available_regions("events") -events_backends = {region: EventsBackend(region) for region in available_regions} +events_backends = {} +for region in Session().get_available_regions("events"): + events_backends[region] = EventsBackend(region) +for region in Session().get_available_regions("events", partition_name="aws-us-gov"): + events_backends[region] = EventsBackend(region) +for region in Session().get_available_regions("events", partition_name="aws-cn"): + events_backends[region] = EventsBackend(region) diff --git a/moto/glacier/models.py b/moto/glacier/models.py index 6a3fc074d..ff87a34a6 100644 --- a/moto/glacier/models.py +++ b/moto/glacier/models.py @@ -6,6 +6,8 @@ import datetime import boto.glacier +from boto3 import Session + from moto.core import BaseBackend, BaseModel from .utils import get_job_id @@ -221,5 +223,9 @@ class GlacierBackend(BaseBackend): glacier_backends = {} -for region in boto.glacier.regions(): - glacier_backends[region.name] = GlacierBackend(region) +for region in Session().get_available_regions("glacier"): + glacier_backends[region] = GlacierBackend(region) +for region in Session().get_available_regions("glacier", partition_name="aws-us-gov"): + glacier_backends[region] = GlacierBackend(region) +for region in Session().get_available_regions("glacier", partition_name="aws-cn"): + glacier_backends[region] = GlacierBackend(region) diff --git a/moto/iot/models.py b/moto/iot/models.py index 74a3e992c..d59d7533c 100644 --- a/moto/iot/models.py +++ b/moto/iot/models.py @@ -9,7 +9,7 @@ import uuid from collections import OrderedDict from datetime import datetime -import boto3 +from boto3 import Session from moto.core import BaseBackend, BaseModel from .exceptions import ( @@ -825,5 +825,10 @@ class IoTBackend(BaseBackend): return self.jobs[job_id] -available_regions = boto3.session.Session().get_available_regions("iot") -iot_backends = {region: IoTBackend(region) for region in available_regions} +iot_backends = {} +for region in Session().get_available_regions("iot"): + iot_backends[region] = IoTBackend(region) +for region in Session().get_available_regions("iot", partition_name="aws-us-gov"): + iot_backends[region] = IoTBackend(region) +for region in Session().get_available_regions("iot", partition_name="aws-cn"): + iot_backends[region] = IoTBackend(region) diff --git a/moto/iotdata/models.py b/moto/iotdata/models.py index e534e1d1f..41b69bc7f 100644 --- a/moto/iotdata/models.py +++ b/moto/iotdata/models.py @@ -1,8 +1,9 @@ from __future__ import unicode_literals import json import time -import boto3 import jsondiff +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.iot import iot_backends from .exceptions import ( @@ -205,5 +206,10 @@ class IoTDataPlaneBackend(BaseBackend): return None -available_regions = boto3.session.Session().get_available_regions("iot-data") -iotdata_backends = {region: IoTDataPlaneBackend(region) for region in available_regions} +iotdata_backends = {} +for region in Session().get_available_regions("iot-data"): + iotdata_backends[region] = IoTDataPlaneBackend(region) +for region in Session().get_available_regions("iot-data", partition_name="aws-us-gov"): + iotdata_backends[region] = IoTDataPlaneBackend(region) +for region in Session().get_available_regions("iot-data", partition_name="aws-cn"): + iotdata_backends[region] = IoTDataPlaneBackend(region) diff --git a/moto/kinesis/models.py b/moto/kinesis/models.py index 48642f197..cdb81a565 100644 --- a/moto/kinesis/models.py +++ b/moto/kinesis/models.py @@ -10,6 +10,8 @@ import itertools from operator import attrgetter from hashlib import md5 +from boto3 import Session + from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel from moto.core.utils import unix_time @@ -530,5 +532,9 @@ class KinesisBackend(BaseBackend): kinesis_backends = {} -for region in boto.kinesis.regions(): - kinesis_backends[region.name] = KinesisBackend() +for region in Session().get_available_regions("kinesis"): + kinesis_backends[region] = KinesisBackend() +for region in Session().get_available_regions("kinesis", partition_name="aws-us-gov"): + kinesis_backends[region] = KinesisBackend() +for region in Session().get_available_regions("kinesis", partition_name="aws-cn"): + kinesis_backends[region] = KinesisBackend() diff --git a/moto/kms/models.py b/moto/kms/models.py index 9d7739779..8fa18346a 100644 --- a/moto/kms/models.py +++ b/moto/kms/models.py @@ -5,6 +5,7 @@ from collections import defaultdict from datetime import datetime, timedelta import boto.kms +from boto3 import Session from moto.core import BaseBackend, BaseModel from moto.core.utils import iso_8601_datetime_without_milliseconds @@ -284,5 +285,9 @@ class KmsBackend(BaseBackend): kms_backends = {} -for region in boto.kms.regions(): - kms_backends[region.name] = KmsBackend() +for region in Session().get_available_regions("kms"): + kms_backends[region] = KmsBackend() +for region in Session().get_available_regions("kms", partition_name="aws-us-gov"): + kms_backends[region] = KmsBackend() +for region in Session().get_available_regions("kms", partition_name="aws-cn"): + kms_backends[region] = KmsBackend() diff --git a/moto/logs/models.py b/moto/logs/models.py index d0639524e..a3f87fefe 100644 --- a/moto/logs/models.py +++ b/moto/logs/models.py @@ -1,3 +1,5 @@ +from boto3 import Session + from moto.core import BaseBackend import boto.logs from moto.core.utils import unix_time_millis @@ -558,6 +560,10 @@ class LogsBackend(BaseBackend): log_group.untag(tags) -logs_backends = { - region.name: LogsBackend(region.name) for region in boto.logs.regions() -} +logs_backends = {} +for region in Session().get_available_regions("logs"): + logs_backends[region] = LogsBackend(region) +for region in Session().get_available_regions("logs", partition_name="aws-us-gov"): + logs_backends[region] = LogsBackend(region) +for region in Session().get_available_regions("logs", partition_name="aws-cn"): + logs_backends[region] = LogsBackend(region) diff --git a/moto/polly/models.py b/moto/polly/models.py index f91c80c64..f76bf4a88 100644 --- a/moto/polly/models.py +++ b/moto/polly/models.py @@ -3,6 +3,8 @@ from xml.etree import ElementTree as ET import datetime import boto3 +from boto3 import Session + from moto.core import BaseBackend, BaseModel from .resources import VOICE_DATA @@ -113,7 +115,10 @@ class PollyBackend(BaseBackend): self._lexicons[name] = lexicon -available_regions = boto3.session.Session().get_available_regions("polly") -polly_backends = { - region: PollyBackend(region_name=region) for region in available_regions -} +polly_backends = {} +for region in Session().get_available_regions("polly"): + polly_backends[region] = PollyBackend(region) +for region in Session().get_available_regions("polly", partition_name="aws-us-gov"): + polly_backends[region] = PollyBackend(region) +for region in Session().get_available_regions("polly", partition_name="aws-cn"): + polly_backends[region] = PollyBackend(region) diff --git a/moto/rds2/models.py b/moto/rds2/models.py index 686d22ccf..df7b9f8c3 100644 --- a/moto/rds2/models.py +++ b/moto/rds2/models.py @@ -6,6 +6,7 @@ import os from collections import defaultdict import boto.rds2 +from boto3 import Session from jinja2 import Template from re import compile as re_compile from moto.cloudformation.exceptions import UnformattedGetAttTemplateException @@ -1501,6 +1502,10 @@ class DBParameterGroup(object): return db_parameter_group -rds2_backends = dict( - (region.name, RDS2Backend(region.name)) for region in boto.rds2.regions() -) +rds2_backends = {} +for region in Session().get_available_regions("rds"): + rds2_backends[region] = RDS2Backend(region) +for region in Session().get_available_regions("rds", partition_name="aws-us-gov"): + rds2_backends[region] = RDS2Backend(region) +for region in Session().get_available_regions("rds", partition_name="aws-cn"): + rds2_backends[region] = RDS2Backend(region) diff --git a/moto/redshift/models.py b/moto/redshift/models.py index 2c57c0f06..faaa03652 100644 --- a/moto/redshift/models.py +++ b/moto/redshift/models.py @@ -4,6 +4,7 @@ import copy import datetime import boto.redshift +from boto3 import Session from botocore.exceptions import ClientError from moto.compat import OrderedDict from moto.core import BaseBackend, BaseModel @@ -897,7 +898,9 @@ class RedshiftBackend(BaseBackend): redshift_backends = {} -for region in boto.redshift.regions(): - redshift_backends[region.name] = RedshiftBackend( - ec2_backends[region.name], region.name - ) +for region in Session().get_available_regions("redshift"): + redshift_backends[region] = RedshiftBackend(ec2_backends[region], region) +for region in Session().get_available_regions("redshift", partition_name="aws-us-gov"): + redshift_backends[region] = RedshiftBackend(ec2_backends[region], region) +for region in Session().get_available_regions("redshift", partition_name="aws-cn"): + redshift_backends[region] = RedshiftBackend(ec2_backends[region], region) diff --git a/moto/resourcegroups/models.py b/moto/resourcegroups/models.py index 7d4d88230..4dd96408a 100644 --- a/moto/resourcegroups/models.py +++ b/moto/resourcegroups/models.py @@ -1,10 +1,11 @@ from __future__ import unicode_literals from builtins import str -import boto3 import json import re +from boto3 import Session + from moto.core import BaseBackend, BaseModel from moto.core import ACCOUNT_ID from .exceptions import BadRequestException @@ -350,7 +351,14 @@ class ResourceGroupsBackend(BaseBackend): return self.groups.by_name[group_name] -available_regions = boto3.session.Session().get_available_regions("resource-groups") -resourcegroups_backends = { - region: ResourceGroupsBackend(region_name=region) for region in available_regions -} +resourcegroups_backends = {} +for region in Session().get_available_regions("resource-groups"): + resourcegroups_backends[region] = ResourceGroupsBackend(region) +for region in Session().get_available_regions( + "resource-groups", partition_name="aws-us-gov" +): + resourcegroups_backends[region] = ResourceGroupsBackend(region) +for region in Session().get_available_regions( + "resource-groups", partition_name="aws-cn" +): + resourcegroups_backends[region] = ResourceGroupsBackend(region) diff --git a/moto/resourcegroupstaggingapi/models.py b/moto/resourcegroupstaggingapi/models.py index 7b0c03a88..850ab5c04 100644 --- a/moto/resourcegroupstaggingapi/models.py +++ b/moto/resourcegroupstaggingapi/models.py @@ -1,7 +1,8 @@ from __future__ import unicode_literals import uuid -import boto3 import six +from boto3 import Session + from moto.core import BaseBackend from moto.core.exceptions import RESTError @@ -636,9 +637,14 @@ class ResourceGroupsTaggingAPIBackend(BaseBackend): # return failed_resources_map -available_regions = boto3.session.Session().get_available_regions( - "resourcegroupstaggingapi" -) -resourcegroupstaggingapi_backends = { - region: ResourceGroupsTaggingAPIBackend(region) for region in available_regions -} +resourcegroupstaggingapi_backends = {} +for region in Session().get_available_regions("resourcegroupstaggingapi"): + resourcegroupstaggingapi_backends[region] = ResourceGroupsTaggingAPIBackend(region) +for region in Session().get_available_regions( + "resourcegroupstaggingapi", partition_name="aws-us-gov" +): + resourcegroupstaggingapi_backends[region] = ResourceGroupsTaggingAPIBackend(region) +for region in Session().get_available_regions( + "resourcegroupstaggingapi", partition_name="aws-cn" +): + resourcegroupstaggingapi_backends[region] = ResourceGroupsTaggingAPIBackend(region) diff --git a/moto/secretsmanager/models.py b/moto/secretsmanager/models.py index 2a1a336d9..2ed29057a 100644 --- a/moto/secretsmanager/models.py +++ b/moto/secretsmanager/models.py @@ -7,6 +7,7 @@ import uuid import datetime import boto3 +from boto3 import Session from moto.core import BaseBackend, BaseModel from .exceptions import ( @@ -491,7 +492,14 @@ class SecretsManagerBackend(BaseBackend): ) -available_regions = boto3.session.Session().get_available_regions("secretsmanager") -secretsmanager_backends = { - region: SecretsManagerBackend(region_name=region) for region in available_regions -} +secretsmanager_backends = {} +for region in Session().get_available_regions("secretsmanager"): + secretsmanager_backends[region] = SecretsManagerBackend(region_name=region) +for region in Session().get_available_regions( + "secretsmanager", partition_name="aws-us-gov" +): + secretsmanager_backends[region] = SecretsManagerBackend(region_name=region) +for region in Session().get_available_regions( + "secretsmanager", partition_name="aws-cn" +): + secretsmanager_backends[region] = SecretsManagerBackend(region_name=region) diff --git a/moto/sns/models.py b/moto/sns/models.py index cdc50f640..695639084 100644 --- a/moto/sns/models.py +++ b/moto/sns/models.py @@ -707,6 +707,10 @@ class SNSBackend(BaseBackend): sns_backends = {} for region in Session().get_available_regions("sns"): sns_backends[region] = SNSBackend(region) +for region in Session().get_available_regions("sns", partition_name="aws-us-gov"): + sns_backends[region] = SNSBackend(region) +for region in Session().get_available_regions("sns", partition_name="aws-cn"): + sns_backends[region] = SNSBackend(region) DEFAULT_EFFECTIVE_DELIVERY_POLICY = { diff --git a/moto/sqs/models.py b/moto/sqs/models.py index 4e6282f56..78ddc38b4 100644 --- a/moto/sqs/models.py +++ b/moto/sqs/models.py @@ -9,6 +9,7 @@ import struct from xml.sax.saxutils import escape import boto.sqs +from boto3 import Session from moto.core.exceptions import RESTError from moto.core import BaseBackend, BaseModel @@ -857,5 +858,9 @@ class SQSBackend(BaseBackend): sqs_backends = {} -for region in boto.sqs.regions(): - sqs_backends[region.name] = SQSBackend(region.name) +for region in Session().get_available_regions("sqs"): + sqs_backends[region] = SQSBackend(region) +for region in Session().get_available_regions("sqs", partition_name="aws-us-gov"): + sqs_backends[region] = SQSBackend(region) +for region in Session().get_available_regions("sqs", partition_name="aws-cn"): + sqs_backends[region] = SQSBackend(region) diff --git a/moto/stepfunctions/models.py b/moto/stepfunctions/models.py index 665f3b777..6bcd6c48b 100644 --- a/moto/stepfunctions/models.py +++ b/moto/stepfunctions/models.py @@ -1,6 +1,9 @@ import boto import re from datetime import datetime + +from boto3 import Session + from moto.core import BaseBackend from moto.core.utils import iso_8601_datetime_without_milliseconds from moto.sts.models import ACCOUNT_ID @@ -280,7 +283,12 @@ class StepFunctionBackend(BaseBackend): return ACCOUNT_ID -stepfunction_backends = { - _region.name: StepFunctionBackend(_region.name) - for _region in boto.awslambda.regions() -} +stepfunction_backends = {} +for region in Session().get_available_regions("stepfunctions"): + stepfunction_backends[region] = StepFunctionBackend(region) +for region in Session().get_available_regions( + "stepfunctions", partition_name="aws-us-gov" +): + stepfunction_backends[region] = StepFunctionBackend(region) +for region in Session().get_available_regions("stepfunctions", partition_name="aws-cn"): + stepfunction_backends[region] = StepFunctionBackend(region) diff --git a/moto/swf/models/__init__.py b/moto/swf/models/__init__.py index 50cc29bb3..5637b8410 100644 --- a/moto/swf/models/__init__.py +++ b/moto/swf/models/__init__.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals import boto.swf +from boto3 import Session from moto.core import BaseBackend @@ -418,5 +419,9 @@ class SWFBackend(BaseBackend): swf_backends = {} -for region in boto.swf.regions(): - swf_backends[region.name] = SWFBackend(region.name) +for region in Session().get_available_regions("swf"): + swf_backends[region] = SWFBackend(region) +for region in Session().get_available_regions("swf", partition_name="aws-us-gov"): + swf_backends[region] = SWFBackend(region) +for region in Session().get_available_regions("swf", partition_name="aws-cn"): + swf_backends[region] = SWFBackend(region) diff --git a/scripts/template/lib/models.py.j2 b/scripts/template/lib/models.py.j2 index 28fa4a4e1..84f8dad71 100644 --- a/scripts/template/lib/models.py.j2 +++ b/scripts/template/lib/models.py.j2 @@ -1,5 +1,5 @@ from __future__ import unicode_literals -import boto3 +from boto3 import Session from moto.core import BaseBackend, BaseModel @@ -16,5 +16,10 @@ class {{ service_class }}Backend(BaseBackend): # add methods from here -available_regions = boto3.session.Session().get_available_regions("{{ service }}") -{{ escaped_service }}_backends = {region: {{ service_class }}Backend(region) for region in available_regions} +{{ escaped_service }}_backends = {} +for region in Session().get_available_regions("{{ service }}"): + {{ escaped_service }}_backends[region] = {{ service_class }}Backend() +for region in Session().get_available_regions("{{ service }}", partition_name="aws-us-gov"): + {{ escaped_service }}_backends[region] = {{ service_class }}Backend() +for region in Session().get_available_regions("{{ service }}", partition_name="aws-cn"): + {{ escaped_service }}_backends[region] = {{ service_class }}Backend() diff --git a/tests/test_ec2/test_availability_zones_and_regions.py b/tests/test_ec2/test_availability_zones_and_regions.py index 349be7936..4adc87efe 100644 --- a/tests/test_ec2/test_availability_zones_and_regions.py +++ b/tests/test_ec2/test_availability_zones_and_regions.py @@ -11,7 +11,7 @@ from moto import mock_ec2, mock_ec2_deprecated def test_describe_regions(): conn = boto.connect_ec2("the_key", "the_secret") regions = conn.get_all_regions() - regions.should.have.length_of(16) + regions.should.have.length_of(22) for region in regions: region.endpoint.should.contain(region.name) @@ -32,7 +32,7 @@ def test_availability_zones(): def test_boto3_describe_regions(): ec2 = boto3.client("ec2", "us-east-1") resp = ec2.describe_regions() - resp["Regions"].should.have.length_of(16) + resp["Regions"].should.have.length_of(22) for rec in resp["Regions"]: rec["Endpoint"].should.contain(rec["RegionName"]) diff --git a/tests/test_ec2/test_regions.py b/tests/test_ec2/test_regions.py index 551b739f2..3504a2b5a 100644 --- a/tests/test_ec2/test_regions.py +++ b/tests/test_ec2/test_regions.py @@ -3,13 +3,21 @@ import boto.ec2 import boto.ec2.autoscale import boto.ec2.elb import sure +from boto3 import Session + from moto import mock_ec2_deprecated, mock_autoscaling_deprecated, mock_elb_deprecated from moto.ec2 import ec2_backends def test_use_boto_regions(): - boto_regions = {r.name for r in boto.ec2.regions()} + boto_regions = set() + for region in Session().get_available_regions("ec2"): + boto_regions.add(region) + for region in Session().get_available_regions("ec2", partition_name="aws-us-gov"): + boto_regions.add(region) + for region in Session().get_available_regions("ec2", partition_name="aws-cn"): + boto_regions.add(region) moto_regions = set(ec2_backends) moto_regions.should.equal(boto_regions) diff --git a/tests/test_glacier/test_glacier_jobs.py b/tests/test_glacier/test_glacier_jobs.py index 11077d7f2..cba2c1a27 100644 --- a/tests/test_glacier/test_glacier_jobs.py +++ b/tests/test_glacier/test_glacier_jobs.py @@ -44,7 +44,7 @@ def test_describe_job(): joboutput.should.have.key("Tier").which.should.equal("Standard") joboutput.should.have.key("StatusCode").which.should.equal("InProgress") joboutput.should.have.key("VaultARN").which.should.equal( - "arn:aws:glacier:RegionInfo:us-west-2:012345678901:vaults/my_vault" + "arn:aws:glacier:us-west-2:012345678901:vaults/my_vault" )