Skip to content

Commit fe92072

Browse files
nikpivkinsimar7
andauthoredAug 7, 2024
feat(misconf): iterator argument support for dynamic blocks (#7236)
Signed-off-by: nikpivkin <[email protected]> Co-authored-by: simar7 <[email protected]>
1 parent f0ed5e4 commit fe92072

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed
 

‎pkg/iac/scanners/terraform/parser/evaluator.go

+12
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,18 @@ func (e *evaluator) expandBlockForEaches(blocks terraform.Blocks, isDynamic bool
340340
ctx.Set(idx, block.TypeLabel(), "key")
341341
ctx.Set(val, block.TypeLabel(), "value")
342342

343+
if isDynamic {
344+
if iterAttr := block.GetAttribute("iterator"); iterAttr.IsNotNil() {
345+
refs := iterAttr.AllReferences()
346+
if len(refs) == 1 {
347+
ctx.Set(idx, refs[0].TypeLabel(), "key")
348+
ctx.Set(val, refs[0].TypeLabel(), "value")
349+
} else {
350+
e.debug.Log("Ignoring iterator attribute in dynamic block, expected one reference but got %d", len(refs))
351+
}
352+
}
353+
}
354+
343355
forEachFiltered = append(forEachFiltered, clone)
344356

345357
values := clone.Values()

‎pkg/iac/scanners/terraform/parser/parser_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -1746,6 +1746,42 @@ func TestTFVarsFileDoesNotExist(t *testing.T) {
17461746
assert.ErrorContains(t, err, "file does not exist")
17471747
}
17481748

1749+
func TestDynamicWithIterator(t *testing.T) {
1750+
fsys := fstest.MapFS{
1751+
"main.tf": &fstest.MapFile{
1752+
Data: []byte(`resource "aws_s3_bucket" "this" {
1753+
dynamic versioning {
1754+
for_each = [true]
1755+
iterator = ver
1756+
1757+
content {
1758+
enabled = ver.value
1759+
}
1760+
}
1761+
}`),
1762+
},
1763+
}
1764+
1765+
parser := New(
1766+
fsys, "",
1767+
OptionStopOnHCLError(true),
1768+
OptionWithDownloads(false),
1769+
)
1770+
require.NoError(t, parser.ParseFS(context.TODO(), "."))
1771+
1772+
modules, _, err := parser.EvaluateAll(context.TODO())
1773+
require.NoError(t, err)
1774+
1775+
assert.Len(t, modules, 1)
1776+
1777+
buckets := modules.GetResourcesByType("aws_s3_bucket")
1778+
assert.Len(t, buckets, 1)
1779+
1780+
attr, _ := buckets[0].GetNestedAttribute("versioning.enabled")
1781+
1782+
assert.True(t, attr.Value().True())
1783+
}
1784+
17491785
func Test_AWSRegionNameDefined(t *testing.T) {
17501786

17511787
fs := testutil.CreateFS(t, map[string]string{

0 commit comments

Comments
 (0)