mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
config/module: validate outputs line up with ModuleVariables
This commit is contained in:
parent
b60da29d48
commit
292f57ea0a
@ -127,7 +127,7 @@ func (c *Config) Validate() error {
|
|||||||
"Unknown root level key: %s", k))
|
"Unknown root level key: %s", k))
|
||||||
}
|
}
|
||||||
|
|
||||||
vars := c.allVariables()
|
vars := c.InterpolatedVariables()
|
||||||
varMap := make(map[string]*Variable)
|
varMap := make(map[string]*Variable)
|
||||||
for _, v := range c.Variables {
|
for _, v := range c.Variables {
|
||||||
varMap[v.Name] = v
|
varMap[v.Name] = v
|
||||||
@ -302,10 +302,10 @@ func (c *Config) Validate() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// allVariables is a helper that returns a mapping of all the interpolated
|
// InterpolatedVariables is a helper that returns a mapping of all the interpolated
|
||||||
// variables within the configuration. This is used to verify references
|
// variables within the configuration. This is used to verify references
|
||||||
// are valid in the Validate step.
|
// are valid in the Validate step.
|
||||||
func (c *Config) allVariables() map[string][]InterpolatedVariable {
|
func (c *Config) InterpolatedVariables() map[string][]InterpolatedVariable {
|
||||||
result := make(map[string][]InterpolatedVariable)
|
result := make(map[string][]InterpolatedVariable)
|
||||||
for _, pc := range c.ProviderConfigs {
|
for _, pc := range c.ProviderConfigs {
|
||||||
source := fmt.Sprintf("provider config '%s'", pc.Name)
|
source := fmt.Sprintf("provider config '%s'", pc.Name)
|
||||||
|
7
config/module/test-fixtures/validate-bad-output/main.tf
Normal file
7
config/module/test-fixtures/validate-bad-output/main.tf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module "child" {
|
||||||
|
source = "./child"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_instance" "foo" {
|
||||||
|
memory = "${module.child.memory}"
|
||||||
|
}
|
@ -1 +1,3 @@
|
|||||||
variable "memory" {}
|
variable "memory" {}
|
||||||
|
|
||||||
|
output "result" {}
|
||||||
|
@ -2,3 +2,7 @@ module "child" {
|
|||||||
source = "./child"
|
source = "./child"
|
||||||
memory = "1G"
|
memory = "1G"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource "aws_instance" "foo" {
|
||||||
|
memory = "${module.child.result}"
|
||||||
|
}
|
||||||
|
@ -267,6 +267,37 @@ func (t *Tree) Validate() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Go over all the variables used and make sure that any module
|
||||||
|
// variables represent outputs properly.
|
||||||
|
for source, vs := range t.config.InterpolatedVariables() {
|
||||||
|
for _, v := range vs {
|
||||||
|
mv, ok := v.(*config.ModuleVariable)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
tree, ok := children[mv.Name]
|
||||||
|
if !ok {
|
||||||
|
// This should never happen because Load watches us
|
||||||
|
panic("module not found in children: " + mv.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
found := false
|
||||||
|
for _, o := range tree.config.Outputs {
|
||||||
|
if o.Name == mv.Field {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
newErr.Err = fmt.Errorf(
|
||||||
|
"%s: %s is not a valid output for module %s",
|
||||||
|
source, mv.Field, mv.Name)
|
||||||
|
return newErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +92,18 @@ func TestTreeValidate_badChild(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTreeValidate_badChildOutput(t *testing.T) {
|
||||||
|
tree := NewTree(testConfig(t, "validate-bad-output"))
|
||||||
|
|
||||||
|
if err := tree.Load(testStorage(t), GetModeGet); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tree.Validate(); err == nil {
|
||||||
|
t.Fatal("should error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestTreeValidate_badChildVar(t *testing.T) {
|
func TestTreeValidate_badChildVar(t *testing.T) {
|
||||||
tree := NewTree(testConfig(t, "validate-bad-var"))
|
tree := NewTree(testConfig(t, "validate-bad-var"))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user