diff --git a/terraform/test-fixtures/transform-provider-invalid/main.tf b/terraform/test-fixtures/transform-provider-invalid/main.tf new file mode 100644 index 000000000..17e6304e0 --- /dev/null +++ b/terraform/test-fixtures/transform-provider-invalid/main.tf @@ -0,0 +1,11 @@ +provider "aws" { +} + +module "mod" { + source = "./mod" + + # aws.foo doesn't exist, and should report an error + providers = { + "aws" = "aws.foo" + } +} diff --git a/terraform/test-fixtures/transform-provider-invalid/mod/main.tf b/terraform/test-fixtures/transform-provider-invalid/mod/main.tf new file mode 100644 index 000000000..03641197f --- /dev/null +++ b/terraform/test-fixtures/transform-provider-invalid/mod/main.tf @@ -0,0 +1,2 @@ +resource "aws_resource" "foo" { +} diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index da2ae3f31..19df21897 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -428,7 +428,7 @@ func (t *ProviderConfigTransformer) Transform(g *Graph) error { // Start the transformation process if err := t.transform(g, t.Module); err != nil { - return nil + return err } // finally attach the configs to the new nodes @@ -524,6 +524,7 @@ func (t *ProviderConfigTransformer) addProxyProviders(g *Graph, m *module.Tree) for name, parentName := range parentCfg.Providers { fullName := ResolveProviderName(name, path) fullParentName := ResolveProviderName(parentName, parentPath) + parentProvider := t.providers[fullParentName] if parentProvider == nil { diff --git a/terraform/transform_provider_test.go b/terraform/transform_provider_test.go index c6698b382..a418b5b67 100644 --- a/terraform/transform_provider_test.go +++ b/terraform/transform_provider_test.go @@ -545,6 +545,35 @@ provider.aws.foo`) } } +// error out when a non-existent provider is named in a module providers map +func TestProviderConfigTransformer_invalidProvider(t *testing.T) { + mod := testModule(t, "transform-provider-invalid") + concrete := func(a *NodeAbstractProvider) dag.Vertex { return a } + + g := Graph{Path: RootModulePath} + { + tf := &ConfigTransformer{Module: mod} + if err := tf.Transform(&g); err != nil { + t.Fatalf("err: %s", err) + } + } + { + tf := &AttachResourceConfigTransformer{Module: mod} + if err := tf.Transform(&g); err != nil { + t.Fatalf("err: %s", err) + } + } + + tf := TransformProviders([]string{"aws"}, concrete, mod) + err := tf.Transform(&g) + if err == nil { + t.Fatal("expected missing provider error") + } + if !strings.Contains(err.Error(), "provider.aws.foo") { + t.Fatalf("error should reference missing provider, got: %s", err) + } +} + const testTransformProviderBasicStr = ` aws_instance.web provider.aws