diff --git a/config/config.go b/config/config.go index ebf30e0cd..3fb53cbd8 100644 --- a/config/config.go +++ b/config/config.go @@ -390,7 +390,7 @@ func (c *Config) Validate() error { // Check that providers aren't declared multiple times and that their // version constraints, where present, are syntactically valid. - providerSet := make(map[string]struct{}) + providerSet := make(map[string]bool) for _, p := range c.ProviderConfigs { name := p.FullName() if _, ok := providerSet[name]; ok { @@ -410,7 +410,7 @@ func (c *Config) Validate() error { } } - providerSet[name] = struct{}{} + providerSet[name] = true } // Check that all references to modules are valid @@ -500,6 +500,15 @@ func (c *Config) Validate() error { "%s: can't initialize configuration: %s", m.Id(), err)) } + + // check that all named providers actually exist + for _, p := range m.Providers { + if !providerSet[p] { + errs = append(errs, fmt.Errorf( + "provider %q named in module %q does not exist", p, m.Name)) + } + } + } dupped = nil diff --git a/config/config_test.go b/config/config_test.go index ace096397..ab5dda75b 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -219,6 +219,12 @@ func TestConfigValidate_table(t *testing.T) { true, "invalid version constraint", }, + { + "invalid provider name in module block", + "validate-missing-provider", + true, + "does not exist", + }, } for i, tc := range cases { diff --git a/config/test-fixtures/validate-missing-provider/main.tf b/config/test-fixtures/validate-missing-provider/main.tf new file mode 100644 index 000000000..abe72c95d --- /dev/null +++ b/config/test-fixtures/validate-missing-provider/main.tf @@ -0,0 +1,10 @@ +provider "test" { + alias = "bar" +} + +module "mod" { + source = "./mod" + providers = { + "test" = "test.foo" + } +}