diff --git a/cmd/generate_test.go b/cmd/generate_test.go index fe6cf91..8ce0d0c 100644 --- a/cmd/generate_test.go +++ b/cmd/generate_test.go @@ -168,6 +168,28 @@ func TestExtraDeclaredDependencies(t *testing.T) { }) } +func TestNonStringErrorOnExtraDeclaredDependencies(t *testing.T) { + err := resetForRun() + if err != nil { + t.Error("Failed to reset default flags") + return + } + + rootCmd.SetArgs([]string{ + "generate", + "--root", + filepath.Join("..", "test_examples_errors", "extra_dependency_error"), + }) + err = rootCmd.Execute() + + expectedError := "extra_atlantis_dependencies contains non-string value at position 4" + if err == nil || err.Error() != expectedError { + t.Errorf("Expected error '%s', got '%v'", expectedError, err) + return + } + return +} + func TestLocalTerraformModuleSource(t *testing.T) { runTest(t, filepath.Join("golden", "local_terraform_module.yaml"), []string{ "--root", diff --git a/cmd/parse_locals.go b/cmd/parse_locals.go index 7145f9f..04680c3 100644 --- a/cmd/parse_locals.go +++ b/cmd/parse_locals.go @@ -12,7 +12,8 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclparse" "github.com/zclconf/go-cty/cty" - + + "fmt" "path/filepath" ) @@ -126,17 +127,19 @@ func parseLocals(path string, terragruntOptions *options.TerragruntOptions, incl mergedParentLocals = mergeResolvedLocals(mergedParentLocals, parentLocals) } } - childLocals := resolveLocals(*localsAsCty) - + childLocals, err := resolveLocals(*localsAsCty) + if err != nil { + return ResolvedLocals{}, err + } return mergeResolvedLocals(mergedParentLocals, childLocals), nil } -func resolveLocals(localsAsCty cty.Value) ResolvedLocals { +func resolveLocals(localsAsCty cty.Value) (ResolvedLocals,error) { resolved := ResolvedLocals{} // Return an empty set of locals if no `locals` block was present if localsAsCty == cty.NilVal { - return resolved + return resolved, nil } rawLocals := localsAsCty.AsValueMap() @@ -182,7 +185,12 @@ func resolveLocals(localsAsCty cty.Value) ResolvedLocals { if ok { it := extraDependenciesAsCty.ElementIterator() for it.Next() { - _, val := it.Element() + pos, val := it.Element() + if !val.Type().Equals(cty.String) { + posInt, _ := pos.AsBigFloat().Int64() + return resolved, fmt.Errorf("extra_atlantis_dependencies contains non-string value at position %d", posInt) + } + resolved.ExtraAtlantisDependencies = append( resolved.ExtraAtlantisDependencies, filepath.ToSlash(val.AsString()), @@ -190,5 +198,5 @@ func resolveLocals(localsAsCty cty.Value) ResolvedLocals { } } - return resolved + return resolved, nil } diff --git a/test_examples_errors/extra_dependency_error/child/terragrunt.hcl b/test_examples_errors/extra_dependency_error/child/terragrunt.hcl new file mode 100644 index 0000000..e00010f --- /dev/null +++ b/test_examples_errors/extra_dependency_error/child/terragrunt.hcl @@ -0,0 +1,15 @@ +terraform { + source = "git::git@github.com:transcend-io/terraform-aws-fargate-container?ref=v0.0.4" +} + +locals { + tg_config = read_terragrunt_config(find_in_parent_folders("config.hcl")) + + extra_atlantis_dependencies = [ + "some_extra_dep0", + "some_extra_dep1", + "some_extra_dep2", + "some_extra_dep3", + local.tg_config + ] +} \ No newline at end of file diff --git a/test_examples_errors/extra_dependency_error/config.hcl b/test_examples_errors/extra_dependency_error/config.hcl new file mode 100644 index 0000000..84f88be --- /dev/null +++ b/test_examples_errors/extra_dependency_error/config.hcl @@ -0,0 +1,3 @@ +locals { + aws_account_id = "111131111219" +} \ No newline at end of file