Add UpdateStack functionality for Cloudformation.

This commit is contained in:
Steve Pulec 2015-07-13 13:56:46 -04:00
commit 53fff2eb84
6 changed files with 210 additions and 29 deletions

View file

@ -156,7 +156,7 @@ def resource_name_property_from_type(resource_type):
return NAME_TYPE_MAP.get(resource_type)
def parse_resource(logical_id, resource_json, resources_map, region_name):
def parse_resource(logical_id, resource_json, resources_map, region_name, action='create'):
resource_type = resource_json['Type']
resource_class = resource_class_from_type(resource_type)
if not resource_class:
@ -183,7 +183,14 @@ def parse_resource(logical_id, resource_json, resources_map, region_name):
logical_id,
random_suffix())
resource = resource_class.create_from_cloudformation_json(resource_name, resource_json, region_name)
if action == 'create':
resource = resource_class.create_from_cloudformation_json(resource_name, resource_json, region_name)
elif action == 'update':
resource = resource_class.update_from_cloudformation_json(resource_name, resource_json, region_name)
elif action == 'delete':
resource_class.delete_from_cloudformation_json(resource_name, resource_json, region_name)
return None
resource.type = resource_type
resource.logical_resource_id = logical_id
return resource
@ -318,6 +325,39 @@ class ResourceMap(collections.Mapping):
tags['aws:cloudformation:logical-id'] = resource
ec2_models.ec2_backends[self._region_name].create_tags([self[resource].physical_resource_id], tags)
def update(self, template):
self.load_mapping()
self.load_parameters()
self.load_conditions()
old_template = self._resource_json_map
new_template = template['Resources']
self._resource_json_map = new_template
new_resource_names = set(new_template) - set(old_template)
for resource_name in new_resource_names:
resource_json = new_template[resource_name]
new_resource = parse_resource(resource_name, resource_json, self, self._region_name, action='create')
self._parsed_resources[resource_name] = new_resource
removed_resource_nams = set(old_template) - set(new_template)
for resource_name in removed_resource_nams:
resource_json = old_template[resource_name]
parse_resource(resource_name, resource_json, self, self._region_name, action='delete')
self._parsed_resources.pop(resource_name)
changed_resource_names = []
for resource_name in new_template:
if resource_name in old_template:
if new_template[resource_name] != old_template[resource_name]:
changed_resource_names.append(resource_name)
for resource_name in changed_resource_names:
resource_json = new_template[resource_name]
changed_resource = parse_resource(resource_name, resource_json, self, self._region_name, action='update')
self._parsed_resources[resource_name] = changed_resource
class OutputMap(collections.Mapping):
def __init__(self, resources, template):