Skip to content

Commit db0097e

Browse files
authored
Don't issue dynamicref issues in other fns (#3404)
1 parent 80c5b8f commit db0097e

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

Diff for: src/cfnlint/rules/parameters/DynamicReferenceSecret.py

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from typing import Any
77

8+
from cfnlint.helpers import FUNCTIONS
89
from cfnlint.jsonschema import ValidationError, Validator
910
from cfnlint.rules.jsonschema import CfnLintKeyword
1011

@@ -44,6 +45,9 @@ def __init__(self) -> None:
4445
self.parent_rules = ["E1020"]
4546

4647
def validate(self, validator: Validator, _, instance: Any, schema: Any):
48+
functions = set(FUNCTIONS) - set(["Fn::If"])
49+
if any(p in functions for p in validator.context.path.path):
50+
return
4751
value = instance.get("Ref")
4852

4953
if not validator.is_type(value, "string"):

Diff for: test/unit/rules/parameters/test_dynamic_reference_secret.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
SPDX-License-Identifier: MIT-0
44
"""
55

6+
from collections import deque
7+
68
import pytest
79

8-
from cfnlint.context import create_context_for_template
10+
from cfnlint.context import Path, create_context_for_template
911
from cfnlint.jsonschema import CfnTemplateValidator, ValidationError
1012
from cfnlint.rules.parameters.DynamicReferenceSecret import DynamicReferenceSecret
1113
from cfnlint.template import Template
@@ -39,31 +41,40 @@ def context(cfn):
3941

4042

4143
@pytest.mark.parametrize(
42-
"name,instance,expected",
44+
"name,instance,path,expected",
4345
[
4446
(
4547
"REFing a parameter without a string",
4648
{"Ref": []},
49+
deque([]),
4750
[],
4851
),
4952
(
5053
"REFing a resource=",
5154
{"Ref": "MyResource"},
55+
deque([]),
5256
[],
5357
),
5458
(
5559
"REFing a parameter",
5660
{"Ref": "MyParameter"},
61+
deque([]),
5762
[
5863
ValidationError(
5964
"Use dynamic references over parameters for secrets",
6065
rule=DynamicReferenceSecret(),
6166
)
6267
],
6368
),
69+
(
70+
"REFing a parameter in a sub",
71+
{"Ref": "MyParameter"},
72+
deque(["Fn::Sub"]),
73+
[],
74+
),
6475
],
6576
)
66-
def test_validate(name, instance, expected, rule, context, cfn):
67-
validator = CfnTemplateValidator(context=context, cfn=cfn)
77+
def test_validate(name, instance, path, expected, rule, context, cfn):
78+
validator = CfnTemplateValidator(context=context.evolve(path=Path(path)), cfn=cfn)
6879
errs = list(rule.validate(validator, {}, instance, {}))
6980
assert errs == expected, f"Test {name!r} got {errs!r}"

0 commit comments

Comments
 (0)