Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions integrationtest/inspection/override/.tflint.hcl
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
plugin "testing" {
enabled = true
}

rule "terraform_required_providers" {
enabled = true
}
20 changes: 20 additions & 0 deletions integrationtest/inspection/override/result.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
{
"issues": [
{
"rule": {
"name": "terraform_required_providers",
"severity": "error",
"link": ""
},
"message": "required_providers: aws=2,azurerm=1,google=3,oracle=2",
"range": {
"filename": "template.tf",
"start": {
"line": 11,
"column": 3
},
"end": {
"line": 11,
"column": 21
}
},
"callers": []
},
{
"rule": {
"name": "aws_instance_example_type",
Expand Down
12 changes: 12 additions & 0 deletions integrationtest/inspection/override/template.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,15 @@ resource "aws_instance" "web" {
ami = "ami-12345678"
instance_type = "t2.micro" // Override by `template_override.tf`
}

terraform {
backend "s3" {}
}

terraform {
required_providers {
aws = "1" // Override by `template_override.tf`
google = "1" // Override by `version_override.tf`
azurerm = "1"
}
}
8 changes: 8 additions & 0 deletions integrationtest/inspection/override/template_override.tf
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,11 @@ resource "aws_instance" "web" {
instance_type = "m5.2xlarge" // aws_instance_example_type
iam_instance_profile = "web-server"
}

terraform {
required_providers {
aws = "2"
google = "2"
oracle = "2"
}
}
5 changes: 5 additions & 0 deletions integrationtest/inspection/override/version_override.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
terraform {
required_providers {
google = "3"
}
}
1 change: 1 addition & 0 deletions plugin/stub-generator/sources/testing/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func main() {
rules.NewTerraformAutofixRemoveLocalRule(), // should be former than terraform_autofix_comment because this rule changes the line number
rules.NewTerraformAutofixCommentRule(),
rules.NewAwsInstanceAutofixConflictRule(), // should be later than terraform_autofix_comment because this rule adds an issue for terraform_autofix_comment
rules.NewTerraformRequiredProvidersRule(),
},
},
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package rules

import (
"fmt"
"sort"
"strings"

"github.com/terraform-linters/tflint-plugin-sdk/hclext"
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
)

// TerraformRequiredProviders checks whether ...
type TerraformRequiredProviders struct {
tflint.DefaultRule
}

// NewTerraformRequiredProvidersRule returns a new rule
func NewTerraformRequiredProvidersRule() *TerraformRequiredProviders {
return &TerraformRequiredProviders{}
}

// Name returns the rule name
func (r *TerraformRequiredProviders) Name() string {
return "terraform_required_providers"
}

// Enabled returns whether the rule is enabled by default
func (r *TerraformRequiredProviders) Enabled() bool {
return false
}

// Severity returns the rule severity
func (r *TerraformRequiredProviders) Severity() tflint.Severity {
return tflint.ERROR
}

// Link returns the rule reference link
func (r *TerraformRequiredProviders) Link() string {
return ""
}

// Check checks whether ...
func (r *TerraformRequiredProviders) Check(runner tflint.Runner) error {
module, err := runner.GetModuleContent(&hclext.BodySchema{
Blocks: []hclext.BlockSchema{
{
Type: "terraform",
Body: &hclext.BodySchema{
Blocks: []hclext.BlockSchema{
{
Type: "required_providers",
Body: &hclext.BodySchema{Mode: hclext.SchemaJustAttributesMode},
},
},
},
},
},
}, nil)
if err != nil {
return err
}

for _, terraform := range module.Blocks {
for _, requiredProvider := range terraform.Body.Blocks {
ret := []string{}
for name, attr := range requiredProvider.Body.Attributes {
v, diags := attr.Expr.Value(nil)
if diags.HasErrors() {
return diags
}
ret = append(ret, fmt.Sprintf("%s=%s", name, v.AsString()))
}
sort.Strings(ret)

err := runner.EmitIssue(
r,
fmt.Sprintf("required_providers: %s", strings.Join(ret, ",")),
requiredProvider.DefRange,
)
if err != nil {
return err
}
}
}

return nil
}
Loading