Skip to content

Commit c445a02

Browse files
authored
walk FindInMap to pass mapping in resolution failure (#3131)
1 parent 8d1343b commit c445a02

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

src/cfnlint/template/transforms/_language_extensions.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def _walk(self, item: Any, params: MutableMapping[str, Any], cfn: Any):
156156
elif k == "Fn::FindInMap":
157157
try:
158158
mapping = _ForEachValueFnFindInMap(get_hash(v), v)
159-
map_value = mapping.value(cfn, params, True)
159+
map_value = mapping.value(cfn, params, True, False)
160160
# if we get None this means its all strings but couldn't be resolved
161161
# we will pass this forward
162162
if map_value is None:
@@ -298,6 +298,7 @@ def value(
298298
cfn: Any,
299299
params: Optional[Mapping[str, Any]] = None,
300300
only_params: bool = False,
301+
default_on_resolver_failure: bool = True,
301302
) -> Any:
302303
if params is None:
303304
params = {}
@@ -361,11 +362,11 @@ def value(
361362
t_map[2].value(cfn, params, only_params)
362363
)
363364
except _ResolveError as e:
364-
if len(self._map) == 4:
365+
if len(self._map) == 4 and default_on_resolver_failure:
365366
return self._map[3].value(cfn, params, only_params)
366367
raise _ResolveError("Can't resolve Fn::FindInMap", self._obj) from e
367368

368-
if len(self._map) == 4:
369+
if len(self._map) == 4 and default_on_resolver_failure:
369370
return self._map[3].value(cfn, params, only_params)
370371
raise _ResolveError("Can't resolve Fn::FindInMap", self._obj)
371372

test/unit/module/template/transforms/test_language_extensions.py

+26
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,32 @@ def test_bad_mappings(self):
182182
with self.assertRaises(_ValueError):
183183
_ForEachValueFnFindInMap("", ["foo"])
184184

185+
def test_find_in_map_values_with_default(self):
186+
map = _ForEachValueFnFindInMap(
187+
"a", ["Bucket", {"Ref": "Foo"}, "Key", {"DefaultValue": "bar"}]
188+
)
189+
190+
self.assertEqual(map.value(self.cfn, None, False, True), "bar")
191+
with self.assertRaises(_ResolveError):
192+
map.value(self.cfn, None, False, False)
193+
194+
def test_find_in_map_values_without_default(self):
195+
map = _ForEachValueFnFindInMap("a", ["Bucket", {"Ref": "Foo"}, "Key"])
196+
197+
with self.assertRaises(_ResolveError):
198+
self.assertEqual(map.value(self.cfn, None, False, True), "bar")
199+
with self.assertRaises(_ResolveError):
200+
map.value(self.cfn, None, False, False)
201+
202+
def test_mapping_not_found(self):
203+
map = _ForEachValueFnFindInMap(
204+
"a", ["Foo", {"Ref": "Foo"}, "Key", {"DefaultValue": "bar"}]
205+
)
206+
207+
self.assertEqual(map.value(self.cfn, None, False, True), "bar")
208+
with self.assertRaises(_ResolveError):
209+
map.value(self.cfn, None, False, False)
210+
185211
def test_two_mappings(self):
186212
template_obj = deepcopy(self.template_obj)
187213
template_obj["Mappings"]["Foo"] = {"Bar": {"Key": ["a", "b"]}}

0 commit comments

Comments
 (0)