def __init__(self, metadata=None, template={}): self.metadata = metadata or {} self.template = template or {} self._template_raw = clone_safe(self.template) self.template_original = clone_safe(self.template) # initialize resources for resource_id, resource in self.template_resources.items(): resource['LogicalResourceId'] = self.template_original['Resources'][resource_id]['LogicalResourceId'] = ( resource.get('LogicalResourceId') or resource_id) # initialize stack template attributes self.template['StackId'] = self.metadata['StackId'] = (self.metadata.get('StackId') or aws_stack.cloudformation_stack_arn(self.stack_name, short_uid())) self.template['Parameters'] = self.template.get('Parameters') or {} self.template['Outputs'] = self.template.get('Outputs') or {} # initialize metadata self.metadata['Parameters'] = self.metadata.get('Parameters') or [] self.metadata['StackStatus'] = 'CREATE_IN_PROGRESS' self.metadata['CreationTime'] = self.metadata.get('CreationTime') or timestamp_millis() # maps resource id to resource state self.resource_states = {} # maps resource id to moto resource class instance (TODO: remove in the future) self.moto_resource_statuses = {} # list of stack events self.events = [] # list of stack change sets self.change_sets = [] # initialize parameters for i in range(1, 100): key = 'Parameters.member.%s.ParameterKey' % i value = 'Parameters.member.%s.ParameterValue' % i key = self.metadata.get(key) value = self.metadata.get(value) if not key: break self.metadata['Parameters'].append({'ParameterKey': key, 'ParameterValue': value})
def delete_stack(stack_name, stack_resources): resources = dict([(r['LogicalResourceId'], common.clone_safe(r)) for r in stack_resources]) for key, resource in resources.items(): resources[key]['Properties'] = common.clone_safe(resource) for resource_id, resource in resources.items(): delete_resource(resource_id, resources, stack_name)
def test_parse_yaml_nodes(self): obj = {'test': yaml.ScalarNode('tag:yaml.org,2002:int', '123')} result = common.clone_safe(obj) self.assertEqual(result, {'test': 123}) obj = {'foo': [ yaml.ScalarNode('tag:yaml.org,2002:str', 'value'), yaml.ScalarNode('tag:yaml.org,2002:int', '123'), yaml.ScalarNode('tag:yaml.org,2002:float', '1.23'), yaml.ScalarNode('tag:yaml.org,2002:bool', 'true') ]} result = common.clone_safe(obj) self.assertEqual(result, {'foo': ['value', 123, 1.23, True]})
def parse_template(template): try: return json.loads(template) except Exception: yaml.add_multi_constructor( '', moto.cloudformation.utils.yaml_tag_constructor, Loader=NoDatesSafeLoader) try: return clone_safe(yaml.safe_load(template)) except Exception: return clone_safe(yaml.load(template, Loader=NoDatesSafeLoader))
def test_parse_yaml_nodes(self): obj = {"test": yaml.ScalarNode("tag:yaml.org,2002:int", "123")} result = common.clone_safe(obj) assert result == {"test": 123} obj = { "foo": [ yaml.ScalarNode("tag:yaml.org,2002:str", "value"), yaml.ScalarNode("tag:yaml.org,2002:int", "123"), yaml.ScalarNode("tag:yaml.org,2002:float", "1.23"), yaml.ScalarNode("tag:yaml.org,2002:bool", "true"), ] } result = common.clone_safe(obj) assert result == {"foo": ["value", 123, 1.23, True]}
def parse_template(template): try: return json.loads(template) except Exception: yaml.add_multi_constructor( "", moto.cloudformation.utils.yaml_tag_constructor, Loader=NoDatesSafeLoader ) # TODO: remove moto dependency here try: return clone_safe(yaml.safe_load(template)) except Exception: try: return clone_safe(yaml.load(template, Loader=NoDatesSafeLoader)) except Exception as e: LOG.debug("Unable to parse CloudFormation template (%s): %s" % (e, template)) raise
def __init__(self, metadata=None, template=None): if template is None: template = {} self.metadata = metadata or {} self.template = template or {} self._template_raw = clone_safe(self.template) self.template_original = clone_safe(self.template) # initialize resources for resource_id, resource in self.template_resources.items(): resource["LogicalResourceId"] = self.template_original[ "Resources"][resource_id]["LogicalResourceId"] = ( resource.get("LogicalResourceId") or resource_id) # initialize stack template attributes self.template["StackId"] = self.metadata[ "StackId"] = self.metadata.get( "StackId") or aws_stack.cloudformation_stack_arn( self.stack_name, short_uid()) self.template["Parameters"] = self.template.get("Parameters") or {} self.template["Outputs"] = self.template.get("Outputs") or {} self.template["Conditions"] = self.template.get("Conditions") or {} # initialize metadata self.metadata["Parameters"] = self.metadata.get("Parameters") or [] self.metadata["StackStatus"] = "CREATE_IN_PROGRESS" self.metadata["CreationTime"] = self.metadata.get( "CreationTime") or timestamp_millis() # maps resource id to resource state self._resource_states = {} # list of stack events self.events = [] # list of stack change sets self.change_sets = [] # initialize parameters for i in range(1, 100): key = "Parameters.member.%s.ParameterKey" % i value = "Parameters.member.%s.ParameterValue" % i key = self.metadata.get(key) value = self.metadata.get(value) if not key: break self.metadata["Parameters"].append({ "ParameterKey": key, "ParameterValue": value })