diff --git a/config/module/test-fixtures/validate-module-root-grandchild/child/child/main.tf b/config/module/test-fixtures/validate-module-root-grandchild/child/child/main.tf new file mode 100644 index 0000000000..b7db25411d --- /dev/null +++ b/config/module/test-fixtures/validate-module-root-grandchild/child/child/main.tf @@ -0,0 +1 @@ +# Empty diff --git a/config/module/test-fixtures/validate-module-root-grandchild/child/main.tf b/config/module/test-fixtures/validate-module-root-grandchild/child/main.tf new file mode 100644 index 0000000000..4f3d723854 --- /dev/null +++ b/config/module/test-fixtures/validate-module-root-grandchild/child/main.tf @@ -0,0 +1 @@ +module "root" { source = "./child" } diff --git a/config/module/test-fixtures/validate-module-root-grandchild/main.tf b/config/module/test-fixtures/validate-module-root-grandchild/main.tf new file mode 100644 index 0000000000..0f6991c536 --- /dev/null +++ b/config/module/test-fixtures/validate-module-root-grandchild/main.tf @@ -0,0 +1,3 @@ +module "child" { + source = "./child" +} diff --git a/config/module/test-fixtures/validate-module-root/child/main.tf b/config/module/test-fixtures/validate-module-root/child/main.tf new file mode 100644 index 0000000000..b7db25411d --- /dev/null +++ b/config/module/test-fixtures/validate-module-root/child/main.tf @@ -0,0 +1 @@ +# Empty diff --git a/config/module/test-fixtures/validate-module-root/main.tf b/config/module/test-fixtures/validate-module-root/main.tf new file mode 100644 index 0000000000..fd5d8aff45 --- /dev/null +++ b/config/module/test-fixtures/validate-module-root/main.tf @@ -0,0 +1,3 @@ +module "root" { + source = "./child" +} diff --git a/config/module/tree.go b/config/module/tree.go index 777389bdc8..d20f163a49 100644 --- a/config/module/tree.go +++ b/config/module/tree.go @@ -261,6 +261,14 @@ func (t *Tree) Validate() error { // If something goes wrong, here is our error template newErr := &TreeError{Name: []string{t.Name()}} + // Terraform core does not handle root module children named "root". + // We plan to fix this in the future but this bug was brought up in + // the middle of a release and we don't want to introduce wide-sweeping + // changes at that time. + if len(t.path) == 1 && t.name == "root" { + return fmt.Errorf("root module cannot contain module named 'root'") + } + // Validate our configuration first. if err := t.config.Validate(); err != nil { newErr.Err = err diff --git a/config/module/tree_test.go b/config/module/tree_test.go index 4df3f8cff1..6ca5f2a72e 100644 --- a/config/module/tree_test.go +++ b/config/module/tree_test.go @@ -288,6 +288,18 @@ func TestTreeValidate_table(t *testing.T) { "validate-alias-bad", "alias must be defined", }, + + { + "root module named root", + "validate-module-root", + "cannot contain module", + }, + + { + "grandchild module named root", + "validate-module-root-grandchild", + "", + }, } for i, tc := range cases {