Handle Name Type resources for CloudFormation
This commit is contained in:
parent
68d2db55d4
commit
91a74424e5
3 changed files with 67 additions and 0 deletions
|
|
@ -7,6 +7,7 @@ from moto.ec2 import models as ec2_models
|
|||
from moto.elb import models as elb_models
|
||||
from moto.iam import models as iam_models
|
||||
from moto.sqs import models as sqs_models
|
||||
from .utils import random_suffix
|
||||
|
||||
MODEL_MAP = {
|
||||
"AWS::AutoScaling::AutoScalingGroup": autoscaling_models.FakeAutoScalingGroup,
|
||||
|
|
@ -29,6 +30,20 @@ MODEL_MAP = {
|
|||
"AWS::SQS::Queue": sqs_models.Queue,
|
||||
}
|
||||
|
||||
# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html
|
||||
NAME_TYPE_MAP = {
|
||||
"AWS::CloudWatch::Alarm": "Alarm",
|
||||
"AWS::DynamoDB::Table": "TableName",
|
||||
"AWS::ElastiCache::CacheCluster": "ClusterName",
|
||||
"AWS::ElasticBeanstalk::Application": "ApplicationName",
|
||||
"AWS::ElasticBeanstalk::Environment": "EnvironmentName",
|
||||
"AWS::ElasticLoadBalancing::LoadBalancer": "LoadBalancerName",
|
||||
"AWS::RDS::DBInstance": "DBInstanceIdentifier",
|
||||
"AWS::S3::Bucket": "BucketName",
|
||||
"AWS::SNS::Topic": "TopicName",
|
||||
"AWS::SQS::Queue": "QueueName"
|
||||
}
|
||||
|
||||
# Just ignore these models types for now
|
||||
NULL_MODELS = [
|
||||
"AWS::CloudFormation::WaitCondition",
|
||||
|
|
@ -73,6 +88,12 @@ def resource_class_from_type(resource_type):
|
|||
return MODEL_MAP.get(resource_type)
|
||||
|
||||
|
||||
def resource_name_property_from_type(resource_type):
|
||||
if resource_type not in NAME_TYPE_MAP:
|
||||
return None
|
||||
return NAME_TYPE_MAP.get(resource_type)
|
||||
|
||||
|
||||
def parse_resource(resource_name, resource_json, resources_map):
|
||||
resource_type = resource_json['Type']
|
||||
resource_class = resource_class_from_type(resource_type)
|
||||
|
|
@ -80,6 +101,15 @@ def parse_resource(resource_name, resource_json, resources_map):
|
|||
return None
|
||||
|
||||
resource_json = clean_json(resource_json, resources_map)
|
||||
resource_name_property = resource_name_property_from_type(resource_type)
|
||||
if resource_name_property:
|
||||
if not 'Properties' in resource_json:
|
||||
resource_json['Properties'] = dict()
|
||||
if not resource_name_property in resource_json['Properties']:
|
||||
resource_json['Properties'][resource_name_property] = '{0}-{1}-{2}'.format(
|
||||
resources_map.get('AWS::StackName'),
|
||||
resource_name,
|
||||
random_suffix())
|
||||
resource = resource_class.create_from_cloudformation_json(resource_name, resource_json)
|
||||
resource.type = resource_type
|
||||
resource.logical_resource_id = resource_name
|
||||
|
|
|
|||
|
|
@ -1,7 +1,15 @@
|
|||
from __future__ import unicode_literals
|
||||
import uuid
|
||||
import six
|
||||
import random
|
||||
|
||||
|
||||
def generate_stack_id(stack_name):
|
||||
random_id = uuid.uuid4()
|
||||
return "arn:aws:cloudformation:us-east-1:123456789:stack/{0}/{1}".format(stack_name, random_id)
|
||||
|
||||
|
||||
def random_suffix():
|
||||
size = 12
|
||||
chars = list(range(10)) + ['A-Z']
|
||||
return ''.join(six.text_type(random.choice(chars)) for x in range(size))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue