Name resources via CloudFormation naming convention and tag EC2 resources.

* Make sure taggable resources are tagged per convention: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack-parameters.html
  * Update CloudFormation parsing to use logical resource ids and name resources as CloudFomation would.
  * Fix tests for CloudFormation stack integration.
This commit is contained in:
Joseph Lawson 2014-10-20 15:16:39 -04:00
commit 832769b8a7
2 changed files with 39 additions and 24 deletions

View file

@ -94,7 +94,7 @@ def resource_name_property_from_type(resource_type):
return NAME_TYPE_MAP.get(resource_type)
def parse_resource(resource_name, resource_json, resources_map):
def parse_resource(logical_id, resource_json, resources_map):
resource_type = resource_json['Type']
resource_class = resource_class_from_type(resource_type)
if not resource_class:
@ -108,11 +108,17 @@ def parse_resource(resource_name, resource_json, resources_map):
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,
logical_id,
random_suffix())
resource_name = resource_json['Properties'][resource_name_property]
else:
resource_name = '{0}-{1}-{2}'.format(resources_map.get('AWS::StackName'),
logical_id,
random_suffix())
resource = resource_class.create_from_cloudformation_json(resource_name, resource_json)
resource.type = resource_type
resource.logical_resource_id = resource_name
resource.logical_resource_id = logical_id
return resource
@ -136,24 +142,24 @@ class ResourceMap(collections.Mapping):
}
def __getitem__(self, key):
resource_name = key
resource_logical_id = key
if resource_name in self._parsed_resources:
return self._parsed_resources[resource_name]
if resource_logical_id in self._parsed_resources:
return self._parsed_resources[resource_logical_id]
else:
resource_json = self._resource_json_map.get(resource_name)
new_resource = parse_resource(resource_name, resource_json, self)
self._parsed_resources[resource_name] = new_resource
resource_json = self._resource_json_map.get(resource_logical_id)
new_resource = parse_resource(resource_logical_id, resource_json, self)
self._parsed_resources[resource_logical_id] = new_resource
return new_resource
def __iter__(self):
return iter(self.resource_names)
return iter(self.resources)
def __len__(self):
return len(self._resource_json_map)
@property
def resource_names(self):
def resources(self):
return self._resource_json_map.keys()
def load_parameters(self):
@ -167,5 +173,10 @@ class ResourceMap(collections.Mapping):
# Since this is a lazy map, to create every object we just need to
# iterate through self.
for resource_name in self.resource_names:
self[resource_name]
tags = {'aws:cloudformation:stack-name': self.get('AWS::StackName'),
'aws:cloudformation:stack-id': self.get('AWS::StackId')}
for resource in self.resources:
self[resource]
if isinstance(self[resource], ec2_models.TaggedEC2Resource):
tags['aws:cloudformation:logical-id'] = resource
ec2_models.ec2_backend.create_tags([self[resource].physical_resource_id],tags)