Skip to content

Commit 8d5dbc9

Browse files
nikpivkinsimar7
andauthored
fix(misconf): properly expand dynamic blocks (#7612)
Signed-off-by: nikpivkin <nikita.pivkin@smartforce.io> Co-authored-by: Simar <simar@linux.com>
1 parent c225883 commit 8d5dbc9

File tree

5 files changed

+409
-214
lines changed

5 files changed

+409
-214
lines changed

pkg/iac/scanners/terraform/module_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ resource "something" "else" {
567567
for_each = toset(["true"])
568568
569569
content {
570-
ok = each.value
570+
ok = blah.value
571571
}
572572
}
573573
}

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

+7-42
Original file line numberDiff line numberDiff line change
@@ -260,48 +260,28 @@ func (e *evaluator) evaluateSteps() {
260260
}
261261

262262
func (e *evaluator) expandBlocks(blocks terraform.Blocks) terraform.Blocks {
263-
return e.expandDynamicBlocks(e.expandBlockForEaches(e.expandBlockCounts(blocks), false)...)
263+
return e.expandDynamicBlocks(e.expandBlockForEaches(e.expandBlockCounts(blocks))...)
264264
}
265265

266266
func (e *evaluator) expandDynamicBlocks(blocks ...*terraform.Block) terraform.Blocks {
267267
for _, b := range blocks {
268-
e.expandDynamicBlock(b)
269-
}
270-
return blocks
271-
}
272-
273-
func (e *evaluator) expandDynamicBlock(b *terraform.Block) {
274-
for _, sub := range b.AllBlocks() {
275-
e.expandDynamicBlock(sub)
276-
}
277-
for _, sub := range b.AllBlocks().OfType("dynamic") {
278-
if sub.IsExpanded() {
279-
continue
280-
}
281-
blockName := sub.TypeLabel()
282-
expanded := e.expandBlockForEaches(terraform.Blocks{sub}, true)
283-
for _, ex := range expanded {
284-
if content := ex.GetBlock("content"); content.IsNotNil() {
285-
_ = e.expandDynamicBlocks(content)
286-
b.InjectBlock(content, blockName)
287-
}
288-
}
289-
if len(expanded) > 0 {
290-
sub.MarkExpanded()
268+
if err := b.ExpandBlock(); err != nil {
269+
e.logger.Error(`Failed to expand dynamic block.`,
270+
log.String("block", b.FullName()), log.Err(err))
291271
}
292272
}
273+
return blocks
293274
}
294275

295276
func isBlockSupportsForEachMetaArgument(block *terraform.Block) bool {
296277
return slices.Contains([]string{
297278
"module",
298279
"resource",
299280
"data",
300-
"dynamic",
301281
}, block.Type())
302282
}
303283

304-
func (e *evaluator) expandBlockForEaches(blocks terraform.Blocks, isDynamic bool) terraform.Blocks {
284+
func (e *evaluator) expandBlockForEaches(blocks terraform.Blocks) terraform.Blocks {
305285

306286
var forEachFiltered terraform.Blocks
307287

@@ -348,7 +328,7 @@ func (e *evaluator) expandBlockForEaches(blocks terraform.Blocks, isDynamic bool
348328
// is the value of the collection. The exception is the use of for-each inside a dynamic block,
349329
// because in this case the collection element may not be a primitive value.
350330
if (forEachVal.Type().IsCollectionType() || forEachVal.Type().IsTupleType()) &&
351-
!forEachVal.Type().IsMapType() && !isDynamic {
331+
!forEachVal.Type().IsMapType() {
352332
stringVal, err := convert.Convert(val, cty.String)
353333
if err != nil {
354334
e.logger.Error(
@@ -374,22 +354,7 @@ func (e *evaluator) expandBlockForEaches(blocks terraform.Blocks, isDynamic bool
374354

375355
ctx.Set(eachObj, "each")
376356
ctx.Set(eachObj, block.TypeLabel())
377-
378-
if isDynamic {
379-
if iterAttr := block.GetAttribute("iterator"); iterAttr.IsNotNil() {
380-
refs := iterAttr.AllReferences()
381-
if len(refs) == 1 {
382-
ctx.Set(idx, refs[0].TypeLabel(), "key")
383-
ctx.Set(val, refs[0].TypeLabel(), "value")
384-
} else {
385-
e.logger.Debug("Ignoring iterator attribute in dynamic block, expected one reference",
386-
log.Int("refs", len(refs)))
387-
}
388-
}
389-
}
390-
391357
forEachFiltered = append(forEachFiltered, clone)
392-
393358
clones[idx.AsString()] = clone.Values()
394359
})
395360

0 commit comments

Comments
 (0)