Skip to content

Commit

Permalink
Add params to findinmap value (#3629)
Browse files Browse the repository at this point in the history
* Add params to findinmap value
  • Loading branch information
kddejong authored Aug 27, 2024
1 parent 374d5f5 commit 754f132
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/cfnlint/template/transforms/_language_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ def value(
):
for k, v in cfn.template.get("Mappings", {}).items():
if isinstance(v, dict):
if t_map[1].value(cfn) in v:
if t_map[1].value(cfn, params) in v:
t_map[0] = _ForEachValue.create(k)
mapping = v
break
Expand Down Expand Up @@ -367,7 +367,7 @@ def value(
t_map[1].value(cfn, params, only_params)
except _ResolveError:
try:
t_map[2].value(cfn)
t_map[2].value(cfn, params)
for k, v in mapping.items():
if isinstance(v, dict):
if t_map[2].value(cfn, params, only_params) in v:
Expand Down Expand Up @@ -417,7 +417,7 @@ def value(
) -> Any:
if params is None:
params = {}
v = self._ref.value(cfn)
v = self._ref.value(cfn, params)

if not isinstance(v, str):
raise _ResolveError("Can't resolve Fn::Ref", self._obj)
Expand Down
162 changes: 162 additions & 0 deletions test/unit/module/template/transforms/test_language_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,168 @@ def test_bad_mapping(self):
)


class TestTransformValues(TestCase):
def setUp(self) -> None:
self.template_obj = convert_dict(
{
"Transform": ["AWS::LanguageExtensions"],
"Mappings": {
"111111111111": {
"A": {"AppName": "appa-dev"},
"B": {"AppName": "appb-dev"},
},
"222222222222": {
"A": {"AppName": "appa-qa"},
"B": {"AppName": "appb-qa"},
},
},
"Resources": {
"Fn::ForEach::Regions": [
"Region",
["A"],
{
"${Region}Role": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": {
"Fn::Sub": [
"${appname}",
{
"appname": {
"Fn::FindInMap": [
{"Ref": "AWS::AccountId"},
{"Ref": "Region"},
"AppName",
]
}
},
]
},
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["ec2.amazonaws.com"]
},
"Action": ["sts:AssumeRole"],
}
],
},
"Path": "/",
},
}
},
],
"Fn::ForEach::NewRegions": [
"Region",
["B"],
{
"${Region}Role": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": {
"Fn::Sub": [
"${appname}",
{
"appname": {
"Fn::FindInMap": [
{"Ref": "AWS::AccountId"},
{"Ref": "Region"},
"AppName",
]
}
},
]
},
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["ec2.amazonaws.com"]
},
"Action": ["sts:AssumeRole"],
}
],
},
"Path": "/",
},
}
},
],
},
}
)

self.result = {
"Mappings": {
"111111111111": {
"A": {"AppName": "appa-dev"},
"B": {"AppName": "appb-dev"},
},
"222222222222": {
"A": {"AppName": "appa-qa"},
"B": {"AppName": "appb-qa"},
},
},
"Resources": {
"ARole": {
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": ["sts:AssumeRole"],
"Effect": "Allow",
"Principal": {"Service": ["ec2.amazonaws.com"]},
}
],
"Version": "2012-10-17",
},
"Path": "/",
"RoleName": {
"Fn::Sub": ["${appname}", {"appname": "appa-dev"}]
},
},
"Type": "AWS::IAM::Role",
},
"BRole": {
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": ["sts:AssumeRole"],
"Effect": "Allow",
"Principal": {"Service": ["ec2.amazonaws.com"]},
}
],
"Version": "2012-10-17",
},
"Path": "/",
"RoleName": {
"Fn::Sub": ["${appname}", {"appname": "appb-dev"}]
},
},
"Type": "AWS::IAM::Role",
},
},
"Transform": ["AWS::LanguageExtensions"],
}

def test_transform(self):
self.maxDiff = None
cfn = Template(filename="", template=self.template_obj, regions=["us-east-1"])
matches, template = language_extension(cfn)
self.assertListEqual(matches, [])
self.assertDictEqual(
template,
self.result,
template,
)


def nested_set(dic, keys, value):
for key in keys[:-1]:
if isinstance(key, str):
Expand Down

0 comments on commit 754f132

Please sign in to comment.