From a1549b04b43be71c07b3b391ac5b391b40163d8c Mon Sep 17 00:00:00 2001 From: Jessie Nadler Date: Thu, 8 Jun 2017 11:38:29 -0400 Subject: [PATCH] Add Fn::Split and Fn::Select support --- moto/cloudformation/parsing.py | 9 ++++++ .../test_cloudformation/test_stack_parsing.py | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/moto/cloudformation/parsing.py b/moto/cloudformation/parsing.py index eee6aa8e7..09b4530af 100644 --- a/moto/cloudformation/parsing.py +++ b/moto/cloudformation/parsing.py @@ -162,6 +162,15 @@ def clean_json(resource_json, resources_map): if cleaned_val else '{0}'.format(val)) return resource_json['Fn::Join'][0].join(join_list) + if 'Fn::Split' in resource_json: + to_split = clean_json(resource_json['Fn::Split'][1], resources_map) + return to_split.split(resource_json['Fn::Split'][0]) + + if 'Fn::Select' in resource_json: + select_index = int(resource_json['Fn::Select'][0]) + select_list = clean_json(resource_json['Fn::Select'][1], resources_map) + return select_list[select_index] + cleaned_json = {} for key, value in resource_json.items(): cleaned_val = clean_json(value, resources_map) diff --git a/tests/test_cloudformation/test_stack_parsing.py b/tests/test_cloudformation/test_stack_parsing.py index 610b02325..7b582b9b5 100644 --- a/tests/test_cloudformation/test_stack_parsing.py +++ b/tests/test_cloudformation/test_stack_parsing.py @@ -72,6 +72,19 @@ get_attribute_output = { } } +split_select_template = { + "AWSTemplateFormatVersion": "2010-09-09", + "Resources": { + "Queue": { + "Type": "AWS::SQS::Queue", + "Properties": { + "QueueName": {"Fn::Select": [ "1", {"Fn::Split": [ "-", "123-myqueue" ] } ] }, + "VisibilityTimeout": 60, + } + } + } +} + outputs_template = dict(list(dummy_template.items()) + list(output_dict.items())) bad_outputs_template = dict( @@ -85,6 +98,7 @@ output_type_template_json = json.dumps(outputs_template) bad_output_template_json = json.dumps(bad_outputs_template) get_attribute_outputs_template_json = json.dumps( get_attribute_outputs_template) +split_select_template_json = json.dumps(split_select_template) def test_parse_stack_resources(): @@ -266,3 +280,17 @@ def test_reference_other_conditions(): resources_map={}, condition_map={"OtherCondition": True}, ).should.equal(False) + + +def test_parse_split_and_select(): + stack = FakeStack( + stack_id="test_id", + name="test_stack", + template=split_select_template_json, + parameters={}, + region_name='us-west-1') + + stack.resource_map.should.have.length_of(1) + queue = stack.resource_map['Queue'] + queue.name.should.equal("myqueue") +