Skip to content

Commit fe3a897

Browse files
nikpivkinsimar7
andauthored
fix(misconf): properly resolve local Terraform cache (#7983)
Signed-off-by: nikpivkin <[email protected]> Co-authored-by: simar7 <[email protected]>
1 parent 44c7fdd commit fe3a897

File tree

3 files changed

+62
-17
lines changed

3 files changed

+62
-17
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ func (e *evaluator) loadModuleFromTerraformCache(ctx context.Context, b *terrafo
9090
var modulePath string
9191
if e.moduleMetadata != nil {
9292
// if we have module metadata we can parse all the modules as they'll be cached locally!
93-
name := b.ModuleName()
93+
moduleKey := b.ModuleKey()
9494
for _, module := range e.moduleMetadata.Modules {
95-
if module.Key == name {
95+
if module.Key == moduleKey {
9696
modulePath = path.Clean(path.Join(e.projectRootPath, module.Dir))
9797
break
9898
}

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

+55
Original file line numberDiff line numberDiff line change
@@ -2010,6 +2010,61 @@ variable "baz" {}
20102010
assert.Contains(t, buf.String(), "variables=\"foo\"")
20112011
}
20122012

2013+
func TestLoadChildModulesFromLocalCache(t *testing.T) {
2014+
var buf bytes.Buffer
2015+
slog.SetDefault(slog.New(log.NewHandler(&buf, &log.Options{Level: log.LevelDebug})))
2016+
2017+
fsys := fstest.MapFS{
2018+
"main.tf": &fstest.MapFile{Data: []byte(`module "level_1" {
2019+
source = "./modules/level_1"
2020+
}`)},
2021+
"modules/level_1/main.tf": &fstest.MapFile{Data: []byte(`module "level_2" {
2022+
source = "../level_2"
2023+
}`)},
2024+
"modules/level_2/main.tf": &fstest.MapFile{Data: []byte(`module "level_3" {
2025+
count = 2
2026+
source = "../level_3"
2027+
}`)},
2028+
"modules/level_3/main.tf": &fstest.MapFile{Data: []byte(`resource "foo" "bar" {}`)},
2029+
".terraform/modules/modules.json": &fstest.MapFile{Data: []byte(`{
2030+
"Modules": [
2031+
{ "Key": "", "Source": "", "Dir": "." },
2032+
{
2033+
"Key": "level_1",
2034+
"Source": "./modules/level_1",
2035+
"Dir": "modules/level_1"
2036+
},
2037+
{
2038+
"Key": "level_1.level_2",
2039+
"Source": "../level_2",
2040+
"Dir": "modules/level_2"
2041+
},
2042+
{
2043+
"Key": "level_1.level_2.level_3",
2044+
"Source": "../level_3",
2045+
"Dir": "modules/level_3"
2046+
}
2047+
]
2048+
}`)},
2049+
}
2050+
2051+
parser := New(
2052+
fsys, "",
2053+
OptionStopOnHCLError(true),
2054+
)
2055+
require.NoError(t, parser.ParseFS(context.TODO(), "."))
2056+
2057+
modules, _, err := parser.EvaluateAll(context.TODO())
2058+
require.NoError(t, err)
2059+
2060+
assert.Len(t, modules, 5)
2061+
2062+
assert.Contains(t, buf.String(), "Using module from Terraform cache .terraform/modules\tsource=\"./modules/level_1\"")
2063+
assert.Contains(t, buf.String(), "Using module from Terraform cache .terraform/modules\tsource=\"../level_2\"")
2064+
assert.Contains(t, buf.String(), "Using module from Terraform cache .terraform/modules\tsource=\"../level_3\"")
2065+
assert.Contains(t, buf.String(), "Using module from Terraform cache .terraform/modules\tsource=\"../level_3\"")
2066+
}
2067+
20132068
func TestLogParseErrors(t *testing.T) {
20142069
var buf bytes.Buffer
20152070
slog.SetDefault(slog.New(log.NewHandler(&buf, nil)))

pkg/iac/terraform/block.go

+5-15
Original file line numberDiff line numberDiff line change
@@ -480,22 +480,12 @@ func (b *Block) FullName() string {
480480
return b.LocalName()
481481
}
482482

483-
func (b *Block) ModuleName() string {
484-
name := strings.TrimPrefix(b.LocalName(), "module.")
485-
if b.moduleBlock != nil {
486-
module := strings.TrimPrefix(b.moduleBlock.FullName(), "module.")
487-
name = fmt.Sprintf(
488-
"%s.%s",
489-
module,
490-
name,
491-
)
492-
}
493-
var parts []string
494-
for _, part := range strings.Split(name, ".") {
495-
part = strings.Split(part, "[")[0]
496-
parts = append(parts, part)
483+
func (b *Block) ModuleKey() string {
484+
name := b.Reference().NameLabel()
485+
if b.moduleBlock == nil {
486+
return name
497487
}
498-
return strings.Join(parts, ".")
488+
return fmt.Sprintf("%s.%s", b.moduleBlock.ModuleKey(), name)
499489
}
500490

501491
func (b *Block) UniqueName() string {

0 commit comments

Comments
 (0)