From ce5758f32a50e4b5a5270b9028e7ebfade37451c Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 9 Jun 2022 16:11:23 -0400 Subject: [PATCH] skip already added provider nodes We can skip providers which already have a node in the graph for their type. --- internal/terraform/transform_provider.go | 12 +++++++ internal/terraform/transform_provider_test.go | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/internal/terraform/transform_provider.go b/internal/terraform/transform_provider.go index 3e459e7a7b11..133f3505bb2b 100644 --- a/internal/terraform/transform_provider.go +++ b/internal/terraform/transform_provider.go @@ -543,6 +543,11 @@ func (t *ProviderConfigTransformer) transformSingle(g *Graph, c *configs.Config) Module: path, } + if _, ok := t.providers[addr.String()]; ok { + log.Printf("[WARN] ProviderConfigTransformer: duplicate required_providers entry for %s", addr) + continue + } + abstract := &NodeAbstractProvider{ Addr: addr, } @@ -568,6 +573,13 @@ func (t *ProviderConfigTransformer) transformSingle(g *Graph, c *configs.Config) Module: path, } + if _, ok := t.providers[addr.String()]; ok { + // The abstract provider node may already have been added from the + // provider requirements. + log.Printf("[TRACE] ProviderConfigTransformer: provider node %s already added", addr) + continue + } + abstract := &NodeAbstractProvider{ Addr: addr, } diff --git a/internal/terraform/transform_provider_test.go b/internal/terraform/transform_provider_test.go index 0436fc03248f..7573553c2b0e 100644 --- a/internal/terraform/transform_provider_test.go +++ b/internal/terraform/transform_provider_test.go @@ -446,6 +446,39 @@ provider["registry.terraform.io/hashicorp/test"].z` } } +func TestProviderConfigTransformer_duplicateLocalName(t *testing.T) { + mod := testModuleInline(t, map[string]string{ + "main.tf": ` +terraform { + required_providers { + dupe = { + source = "registry.terraform.io/hashicorp/test" + } + } +} + +provider "test" { +} +`}) + concrete := func(a *NodeAbstractProvider) dag.Vertex { return a } + + g := testProviderTransformerGraph(t, mod) + tf := ProviderConfigTransformer{ + Config: mod, + Concrete: concrete, + } + if err := tf.Transform(g); err != nil { + t.Fatalf("err: %s", err) + } + + expected := `provider["registry.terraform.io/hashicorp/test"]` + + actual := strings.TrimSpace(g.String()) + if actual != expected { + t.Fatalf("expected:\n%s\n\ngot:\n%s", expected, actual) + } +} + const testTransformProviderBasicStr = ` aws_instance.web provider["registry.terraform.io/hashicorp/aws"]