Skip to content

Commit bd99931

Browse files
committed
Fix issues caused by multiple terraform blocks
See also #205 Some rules that reference terraform blocks do not assume that blocks can be defined multiple times and can lead to inconsistent results in that case.
1 parent ac15058 commit bd99931

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

rules/terraform_required_providers.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@ func (r *TerraformRequiredProvidersRule) Check(rr tflint.Runner) error {
151151
requiredProviders := hclext.Attributes{}
152152
for _, terraform := range body.Blocks {
153153
for _, requiredProvidersBlock := range terraform.Body.Blocks {
154-
requiredProviders = requiredProvidersBlock.Body.Attributes
154+
for name, attr := range requiredProvidersBlock.Body.Attributes {
155+
requiredProviders[name] = attr
156+
}
155157
}
156158
}
157159

rules/terraform_required_providers_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,108 @@ output "foo" {
570570
},
571571
},
572572
},
573+
{
574+
Name: "multiple required providers",
575+
Content: `
576+
terraform {
577+
required_providers {
578+
template = "~> 2"
579+
}
580+
581+
required_providers {
582+
aws = "~> 5.0"
583+
}
584+
}
585+
586+
provider "template" {}
587+
provider "aws" {}
588+
provider "google" {}
589+
590+
terraform {
591+
required_providers {
592+
google = "~> 6.0"
593+
}
594+
}
595+
`,
596+
Expected: helper.Issues{
597+
// FIXME: ignore order of issues
598+
{
599+
Rule: NewTerraformRequiredProvidersRule(),
600+
Message: "Legacy version constraint for provider \"template\" in `required_providers`",
601+
Range: hcl.Range{
602+
Filename: "module.tf",
603+
Start: hcl.Pos{
604+
Line: 4,
605+
Column: 16,
606+
},
607+
End: hcl.Pos{
608+
Line: 4,
609+
Column: 22,
610+
},
611+
},
612+
},
613+
{
614+
Rule: NewTerraformRequiredProvidersRule(),
615+
Message: "Legacy version constraint for provider \"aws\" in `required_providers`",
616+
Range: hcl.Range{
617+
Filename: "module.tf",
618+
Start: hcl.Pos{
619+
Line: 8,
620+
Column: 11,
621+
},
622+
End: hcl.Pos{
623+
Line: 8,
624+
Column: 19,
625+
},
626+
},
627+
},
628+
{
629+
Rule: NewTerraformRequiredProvidersRule(),
630+
Message: "Legacy version constraint for provider \"google\" in `required_providers`",
631+
Range: hcl.Range{
632+
Filename: "module.tf",
633+
Start: hcl.Pos{
634+
Line: 18,
635+
Column: 14,
636+
},
637+
End: hcl.Pos{
638+
Line: 18,
639+
Column: 22,
640+
},
641+
},
642+
},
643+
},
644+
Fixed: `
645+
terraform {
646+
required_providers {
647+
template = {
648+
source = "hashicorp/template"
649+
version = "~> 2"
650+
}
651+
}
652+
653+
required_providers {
654+
aws = {
655+
source = "hashicorp/aws"
656+
version = "~> 5.0"
657+
}
658+
}
659+
}
660+
661+
provider "template" {}
662+
provider "aws" {}
663+
provider "google" {}
664+
665+
terraform {
666+
required_providers {
667+
google = {
668+
source = "hashicorp/google"
669+
version = "~> 6.0"
670+
}
671+
}
672+
}
673+
`,
674+
},
573675
}
574676

575677
rule := NewTerraformRequiredProvidersRule()

rules/terraform_unused_required_providers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func (r *TerraformUnusedRequiredProvidersRule) Check(rr tflint.Runner) error {
8383

8484
for _, block := range content.Blocks {
8585
var attrDiags hcl.Diagnostics
86+
// FIXME: required providers should be merged
8687
requiredProviders, attrDiags = block.Body.JustAttributes()
8788
diags = diags.Extend(attrDiags)
8889
if diags.HasErrors() {

rules/terraform_workspace_remote.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (r *TerraformWorkspaceRemoteRule) Check(runner tflint.Runner) error {
9898
for _, terraform := range body.Blocks {
9999
for _, requiredVersion := range terraform.Body.Attributes {
100100
err := runner.EvaluateExpr(requiredVersion.Expr, func(v string) error {
101+
// FIXME: Should constraints defined in multiple blocks be merged?
101102
constraints, err := version.NewConstraint(v)
102103
if err != nil {
103104
return err

0 commit comments

Comments
 (0)