Skip to content

Commit 11c44ac

Browse files
authored
Add terraform.Runner (#7)
1 parent 88cbcf6 commit 11c44ac

19 files changed

+749
-403
lines changed

rules/rules_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package rules
2+
3+
import (
4+
"testing"
5+
6+
"github.com/terraform-linters/tflint-plugin-sdk/helper"
7+
"github.com/terraform-linters/tflint-ruleset-terraform/terraform"
8+
)
9+
10+
func testRunner(t *testing.T, files map[string]string) *terraform.Runner {
11+
return terraform.NewRunner(helper.TestRunner(t, files))
12+
}

rules/terraform_module_pinned_source.go

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/hashicorp/go-getter"
1111
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
1212
"github.com/terraform-linters/tflint-ruleset-terraform/project"
13+
"github.com/terraform-linters/tflint-ruleset-terraform/terraform"
1314
)
1415

1516
// TerraformModulePinnedSourceRule checks unpinned or default version module source
@@ -53,7 +54,9 @@ func (r *TerraformModulePinnedSourceRule) Link() string {
5354

5455
// Check checks if module source version is pinned
5556
// Note that this rule is valid only for Git or Mercurial source
56-
func (r *TerraformModulePinnedSourceRule) Check(runner tflint.Runner) error {
57+
func (r *TerraformModulePinnedSourceRule) Check(rr tflint.Runner) error {
58+
runner := rr.(*terraform.Runner)
59+
5760
path, err := runner.GetModulePath()
5861
if err != nil {
5962
return err
@@ -69,27 +72,22 @@ func (r *TerraformModulePinnedSourceRule) Check(runner tflint.Runner) error {
6972
return err
7073
}
7174

72-
body, err := runner.GetModuleContent(moduleCallSchema, &tflint.GetModuleContentOption{IncludeNotCreated: true})
73-
if err != nil {
74-
return err
75+
calls, diags := runner.GetModuleCalls()
76+
if diags.HasErrors() {
77+
return diags
7578
}
7679

77-
for _, block := range body.Blocks {
78-
module, diags := decodeModuleCall(block)
79-
if diags.HasErrors() {
80-
return diags
81-
}
82-
83-
if err := r.checkModule(runner, module, config); err != nil {
80+
for _, call := range calls {
81+
if err := r.checkModule(runner, call, config); err != nil {
8482
return err
8583
}
8684
}
8785

8886
return nil
8987
}
9088

91-
func (r *TerraformModulePinnedSourceRule) checkModule(runner tflint.Runner, module *moduleCall, config terraformModulePinnedSourceRuleConfig) error {
92-
source, err := getter.Detect(module.source, filepath.Dir(module.defRange.Filename), []getter.Detector{
89+
func (r *TerraformModulePinnedSourceRule) checkModule(runner tflint.Runner, module *terraform.ModuleCall, config terraformModulePinnedSourceRuleConfig) error {
90+
source, err := getter.Detect(module.Source, filepath.Dir(module.DefRange.Filename), []getter.Detector{
9391
// https://github.com/hashicorp/terraform/blob/51b0aee36cc2145f45f5b04051a01eb6eb7be8bf/internal/getmodules/getter.go#L30-L52
9492
new(getter.GitHubDetector),
9593
new(getter.GitDetector),
@@ -127,8 +125,8 @@ func (r *TerraformModulePinnedSourceRule) checkModule(runner tflint.Runner, modu
127125
if u.Hostname() == "" {
128126
return runner.EmitIssue(
129127
r,
130-
fmt.Sprintf("Module source %q is not a valid URL", module.source),
131-
module.sourceAttr.Expr.Range(),
128+
fmt.Sprintf("Module source %q is not a valid URL", module.Source),
129+
module.SourceAttr.Expr.Range(),
132130
)
133131
}
134132

@@ -144,21 +142,21 @@ func (r *TerraformModulePinnedSourceRule) checkModule(runner tflint.Runner, modu
144142

145143
return runner.EmitIssue(
146144
r,
147-
fmt.Sprintf(`Module source "%s" is not pinned`, module.source),
148-
module.sourceAttr.Expr.Range(),
145+
fmt.Sprintf(`Module source "%s" is not pinned`, module.Source),
146+
module.SourceAttr.Expr.Range(),
149147
)
150148
}
151149

152-
func (r *TerraformModulePinnedSourceRule) checkRevision(runner tflint.Runner, module *moduleCall, config terraformModulePinnedSourceRuleConfig, key string, value string) error {
150+
func (r *TerraformModulePinnedSourceRule) checkRevision(runner tflint.Runner, module *terraform.ModuleCall, config terraformModulePinnedSourceRuleConfig, key string, value string) error {
153151
switch config.Style {
154152
// The "flexible" style requires a revision that is not a default branch
155153
case "flexible":
156154
for _, branch := range config.DefaultBranches {
157155
if value == branch {
158156
return runner.EmitIssue(
159157
r,
160-
fmt.Sprintf("Module source \"%s\" uses a default branch as %s (%s)", module.source, key, branch),
161-
module.sourceAttr.Expr.Range(),
158+
fmt.Sprintf("Module source \"%s\" uses a default branch as %s (%s)", module.Source, key, branch),
159+
module.SourceAttr.Expr.Range(),
162160
)
163161
}
164162
}
@@ -168,8 +166,8 @@ func (r *TerraformModulePinnedSourceRule) checkRevision(runner tflint.Runner, mo
168166
if err != nil {
169167
return runner.EmitIssue(
170168
r,
171-
fmt.Sprintf("Module source \"%s\" uses a %s which is not a semantic version string", module.source, key),
172-
module.sourceAttr.Expr.Range(),
169+
fmt.Sprintf("Module source \"%s\" uses a %s which is not a semantic version string", module.Source, key),
170+
module.SourceAttr.Expr.Range(),
173171
)
174172
}
175173
default:

rules/terraform_module_pinned_source_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,13 +509,13 @@ rule "terraform_module_pinned_source" {
509509

510510
for _, tc := range cases {
511511
t.Run(tc.Name, func(t *testing.T) {
512-
runner := helper.TestRunner(t, map[string]string{"module.tf": tc.Content, ".tflint.hcl": tc.Config})
512+
runner := testRunner(t, map[string]string{"module.tf": tc.Content, ".tflint.hcl": tc.Config})
513513

514514
if err := rule.Check(runner); err != nil {
515515
t.Fatalf("Unexpected error occurred: %s", err)
516516
}
517517

518-
helper.AssertIssues(t, tc.Expected, runner.Issues)
518+
helper.AssertIssues(t, tc.Expected, runner.Runner.(*helper.Runner).Issues)
519519
})
520520
}
521521
}

rules/terraform_module_version.go

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
tfaddr "github.com/hashicorp/terraform-registry-address"
88
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
99
"github.com/terraform-linters/tflint-ruleset-terraform/project"
10+
"github.com/terraform-linters/tflint-ruleset-terraform/terraform"
1011
)
1112

1213
// SemVer regexp with optional leading =
@@ -50,7 +51,9 @@ func (r *TerraformModuleVersionRule) Link() string {
5051

5152
// Check checks whether module source attributes resolve to a Terraform registry
5253
// If they do, it checks a version (or range) is set
53-
func (r *TerraformModuleVersionRule) Check(runner tflint.Runner) error {
54+
func (r *TerraformModuleVersionRule) Check(rr tflint.Runner) error {
55+
runner := rr.(*terraform.Runner)
56+
5457
path, err := runner.GetModulePath()
5558
if err != nil {
5659
return err
@@ -65,27 +68,22 @@ func (r *TerraformModuleVersionRule) Check(runner tflint.Runner) error {
6568
return err
6669
}
6770

68-
body, err := runner.GetModuleContent(moduleCallSchema, &tflint.GetModuleContentOption{IncludeNotCreated: true})
69-
if err != nil {
70-
return err
71+
calls, diags := runner.GetModuleCalls()
72+
if diags.HasErrors() {
73+
return diags
7174
}
7275

73-
for _, block := range body.Blocks {
74-
module, diags := decodeModuleCall(block)
75-
if diags.HasErrors() {
76-
return diags
77-
}
78-
79-
if err := r.checkModule(runner, module, config); err != nil {
76+
for _, call := range calls {
77+
if err := r.checkModule(runner, call, config); err != nil {
8078
return err
8179
}
8280
}
8381

8482
return nil
8583
}
8684

87-
func (r *TerraformModuleVersionRule) checkModule(runner tflint.Runner, module *moduleCall, config TerraformModuleVersionRuleConfig) error {
88-
_, err := tfaddr.ParseModuleSource(module.source)
85+
func (r *TerraformModuleVersionRule) checkModule(runner tflint.Runner, module *terraform.ModuleCall, config TerraformModuleVersionRuleConfig) error {
86+
_, err := tfaddr.ParseModuleSource(module.Source)
8987
if err != nil {
9088
// If parsing fails, the source does not expect to specify a version,
9189
// such as local or remote. So instead of returning an error,
@@ -96,32 +94,32 @@ func (r *TerraformModuleVersionRule) checkModule(runner tflint.Runner, module *m
9694
return r.checkVersion(runner, module, config)
9795
}
9896

99-
func (r *TerraformModuleVersionRule) checkVersion(runner tflint.Runner, module *moduleCall, config TerraformModuleVersionRuleConfig) error {
100-
if module.version == nil {
97+
func (r *TerraformModuleVersionRule) checkVersion(runner tflint.Runner, module *terraform.ModuleCall, config TerraformModuleVersionRuleConfig) error {
98+
if module.Version == nil {
10199
return runner.EmitIssue(
102100
r,
103-
fmt.Sprintf("module %q should specify a version", module.name),
104-
module.defRange,
101+
fmt.Sprintf("module %q should specify a version", module.Name),
102+
module.DefRange,
105103
)
106104
}
107105

108106
if !config.Exact {
109107
return nil
110108
}
111109

112-
if len(module.version) > 1 {
110+
if len(module.Version) > 1 {
113111
return runner.EmitIssue(
114112
r,
115-
fmt.Sprintf("module %q should specify an exact version, but multiple constraints were found", module.name),
116-
module.versionAttr.Range,
113+
fmt.Sprintf("module %q should specify an exact version, but multiple constraints were found", module.Name),
114+
module.VersionAttr.Range,
117115
)
118116
}
119117

120-
if !exactVersionRegexp.MatchString(module.version[0].String()) {
118+
if !exactVersionRegexp.MatchString(module.Version[0].String()) {
121119
return runner.EmitIssue(
122120
r,
123-
fmt.Sprintf("module %q should specify an exact version, but a range was found", module.name),
124-
module.versionAttr.Range,
121+
fmt.Sprintf("module %q should specify an exact version, but a range was found", module.Name),
122+
module.VersionAttr.Range,
125123
)
126124
}
127125

rules/terraform_module_version_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,13 @@ module "m" {
181181

182182
for _, tc := range cases {
183183
t.Run(tc.Name, func(t *testing.T) {
184-
runner := helper.TestRunner(t, map[string]string{"module.tf": tc.Content, ".tflint.hcl": tc.Config})
184+
runner := testRunner(t, map[string]string{"module.tf": tc.Content, ".tflint.hcl": tc.Config})
185185

186186
if err := rule.Check(runner); err != nil {
187187
t.Fatalf("Unexpected error occurred: %s", err)
188188
}
189189

190-
helper.AssertIssues(t, tc.Expected, runner.Issues)
190+
helper.AssertIssues(t, tc.Expected, runner.Runner.(*helper.Runner).Issues)
191191
})
192192
}
193193
}
@@ -220,13 +220,13 @@ func TestTerraformModuleVersion_NonRegistry(t *testing.T) {
220220
for _, tc := range cases {
221221
t.Run(tc.Name, func(t *testing.T) {
222222
content := fmt.Sprintf(testTerraformModuleVersionNonRegistrySource, tc.Source)
223-
runner := helper.TestRunner(t, map[string]string{"module.tf": content})
223+
runner := testRunner(t, map[string]string{"module.tf": content})
224224

225225
if err := rule.Check(runner); err != nil {
226226
t.Fatalf("Unexpected error occurred: %s", err)
227227
}
228228

229-
helper.AssertIssues(t, helper.Issues{}, runner.Issues)
229+
helper.AssertIssues(t, helper.Issues{}, runner.Runner.(*helper.Runner).Issues)
230230
})
231231
}
232232
}

rules/terraform_naming_convention.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/terraform-linters/tflint-plugin-sdk/hclext"
1010
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
1111
"github.com/terraform-linters/tflint-ruleset-terraform/project"
12+
"github.com/terraform-linters/tflint-ruleset-terraform/terraform"
1213
)
1314

1415
// TerraformNamingConventionRule checks whether blocks follow naming convention
@@ -75,7 +76,9 @@ func (r *TerraformNamingConventionRule) Link() string {
7576
}
7677

7778
// Check checks whether blocks follow naming convention
78-
func (r *TerraformNamingConventionRule) Check(runner tflint.Runner) error {
79+
func (r *TerraformNamingConventionRule) Check(rr tflint.Runner) error {
80+
runner := rr.(*terraform.Runner)
81+
7982
path, err := runner.GetModulePath()
8083
if err != nil {
8184
return err
@@ -198,12 +201,12 @@ func (r *TerraformNamingConventionRule) Check(runner tflint.Runner) error {
198201
if err != nil {
199202
return err
200203
}
201-
locals, diags := getLocals(runner)
204+
locals, diags := runner.GetLocals()
202205
if diags.HasErrors() {
203206
return diags
204207
}
205208
for name, local := range locals {
206-
if err := nameValidator.checkBlock(runner, r, localBlockName, name, &local.defRange); err != nil {
209+
if err := nameValidator.checkBlock(runner, r, localBlockName, name, &local.DefRange); err != nil {
207210
return err
208211
}
209212
}

0 commit comments

Comments
 (0)