SSM parameters in cloudformation (AWS::SSM::Parameter::) are not recognized and resolved (#3929)
				
					
				
			* Add ssm parsing support for cloudformation stacks * Start adding unit tests for ssm parameter parsing * Add tests for code update * Add tests to parse ssm parameters code * Fix black lint errors * Fix bug. * Need to specify region_name * region needs to be same * Use ssm_backends[region] instead of ssm_backend * StringList -> string * Linting * check if servermode tests are on * Typo Co-authored-by: Bert Blommers <bblommers@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									4ad6c3932e
								
							
						
					
					
						commit
						24fa8f25a1
					
				@ -41,6 +41,7 @@ from moto.sagemaker import models as sagemaker_models  # noqa
 | 
			
		||||
from moto.sns import models as sns_models  # noqa
 | 
			
		||||
from moto.sqs import models as sqs_models  # noqa
 | 
			
		||||
from moto.stepfunctions import models as stepfunctions_models  # noqa
 | 
			
		||||
from moto.ssm import models as ssm_models, ssm_backends  # noqa
 | 
			
		||||
 | 
			
		||||
# End ugly list of imports
 | 
			
		||||
 | 
			
		||||
@ -516,6 +517,23 @@ class ResourceMap(collections_abc.Mapping):
 | 
			
		||||
                parameter_slot = parameter_slots[key]
 | 
			
		||||
 | 
			
		||||
                value_type = parameter_slot.get("Type", "String")
 | 
			
		||||
 | 
			
		||||
                def _parse_ssm_parameter(value, value_type):
 | 
			
		||||
                    # The Value in SSM parameters is the SSM parameter path
 | 
			
		||||
                    # we need to use ssm_backend to retreive the
 | 
			
		||||
                    # actual value from parameter store
 | 
			
		||||
                    parameter = ssm_backends[self._region_name].get_parameter(
 | 
			
		||||
                        value, False
 | 
			
		||||
                    )
 | 
			
		||||
                    actual_value = parameter.value
 | 
			
		||||
 | 
			
		||||
                    if value_type.find("List") > 0:
 | 
			
		||||
                        return actual_value.split(",")
 | 
			
		||||
 | 
			
		||||
                    return actual_value
 | 
			
		||||
 | 
			
		||||
                if value_type.startswith("AWS::SSM::Parameter::"):
 | 
			
		||||
                    value = _parse_ssm_parameter(value, value_type)
 | 
			
		||||
                if value_type == "CommaDelimitedList" or value_type.startswith("List"):
 | 
			
		||||
                    value = value.split(",")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
from __future__ import unicode_literals
 | 
			
		||||
import boto3
 | 
			
		||||
import json
 | 
			
		||||
import yaml
 | 
			
		||||
 | 
			
		||||
@ -12,6 +13,7 @@ from moto.cloudformation.parsing import (
 | 
			
		||||
    parse_condition,
 | 
			
		||||
    Export,
 | 
			
		||||
)
 | 
			
		||||
from moto import mock_ssm, settings
 | 
			
		||||
from moto.sqs.models import Queue
 | 
			
		||||
from moto.s3.models import FakeBucket
 | 
			
		||||
from moto.cloudformation.utils import yaml_tag_constructor
 | 
			
		||||
@ -73,6 +75,13 @@ parameters = {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ssm_parameter = {
 | 
			
		||||
    "Parameters": {
 | 
			
		||||
        "SingleParamCfn": {"Type": "AWS::SSM::Parameter::Value<String>"},
 | 
			
		||||
        "ListParamCfn": {"Type": "AWS::SSM::Parameter::Value<List<String>>"},
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
split_select_template = {
 | 
			
		||||
    "AWSTemplateFormatVersion": "2010-09-09",
 | 
			
		||||
    "Resources": {
 | 
			
		||||
@ -143,6 +152,9 @@ get_availability_zones_template = dict(
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parameters_template = dict(list(dummy_template.items()) + list(parameters.items()))
 | 
			
		||||
ssm_parameter_template = dict(
 | 
			
		||||
    list(dummy_template.items()) + list(ssm_parameter.items())
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
dummy_template_json = json.dumps(dummy_template)
 | 
			
		||||
name_type_template_json = json.dumps(name_type_template)
 | 
			
		||||
@ -151,6 +163,7 @@ bad_output_template_json = json.dumps(bad_outputs_template)
 | 
			
		||||
get_attribute_outputs_template_json = json.dumps(get_attribute_outputs_template)
 | 
			
		||||
get_availability_zones_template_json = json.dumps(get_availability_zones_template)
 | 
			
		||||
parameters_template_json = json.dumps(parameters_template)
 | 
			
		||||
ssm_parameter_template_json = json.dumps(ssm_parameter_template)
 | 
			
		||||
split_select_template_json = json.dumps(split_select_template)
 | 
			
		||||
sub_template_json = json.dumps(sub_template)
 | 
			
		||||
export_value_template_json = json.dumps(export_value_template)
 | 
			
		||||
@ -498,3 +511,29 @@ def test_short_form_func_in_yaml_teamplate():
 | 
			
		||||
    ]
 | 
			
		||||
    for k, v in key_and_expects:
 | 
			
		||||
        template_dict.should.have.key(k).which.should.be.equal(v)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_ssm
 | 
			
		||||
def test_ssm_parameter_parsing():
 | 
			
		||||
    client = boto3.client("ssm", region_name="us-west-1")
 | 
			
		||||
    client.put_parameter(Name="/path/to/single/param", Value="string", Type="String")
 | 
			
		||||
    client.put_parameter(
 | 
			
		||||
        Name="/path/to/list/param", Value="comma,separated,string", Type="StringList"
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if not settings.TEST_SERVER_MODE:
 | 
			
		||||
        stack = FakeStack(
 | 
			
		||||
            stack_id="test_id",
 | 
			
		||||
            name="test_stack",
 | 
			
		||||
            template=ssm_parameter_template_json,
 | 
			
		||||
            parameters={
 | 
			
		||||
                "SingleParamCfn": "/path/to/single/param",
 | 
			
		||||
                "ListParamCfn": "/path/to/list/param",
 | 
			
		||||
            },
 | 
			
		||||
            region_name="us-west-1",
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        stack.resource_map.resolved_parameters["SingleParamCfn"].should.equal("string")
 | 
			
		||||
        stack.resource_map.resolved_parameters["ListParamCfn"].should.equal(
 | 
			
		||||
            ["comma", "separated", "string"]
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user