Skip to content

Commit c967ef8

Browse files
committed
Add google_disabled_api rule
1 parent 858144f commit c967ef8

File tree

3 files changed

+111
-4
lines changed

3 files changed

+111
-4
lines changed

main.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@ package main
33
import (
44
"github.com/terraform-linters/tflint-plugin-sdk/plugin"
55
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
6+
"github.com/terraform-linters/tflint-ruleset-google/google"
67
"github.com/terraform-linters/tflint-ruleset-google/project"
78
"github.com/terraform-linters/tflint-ruleset-google/rules"
9+
"github.com/terraform-linters/tflint-ruleset-google/rules/api"
810
)
911

1012
func main() {
1113
plugin.Serve(&plugin.ServeOpts{
12-
RuleSet: &tflint.BuiltinRuleSet{
13-
Name: "google",
14-
Version: project.Version,
15-
Rules: rules.Rules,
14+
RuleSet: &google.RuleSet{
15+
BuiltinRuleSet: tflint.BuiltinRuleSet{
16+
Name: "google",
17+
Version: project.Version,
18+
Rules: rules.Rules,
19+
},
20+
APIRules: api.Rules,
1621
},
1722
})
1823
}

rules/api/google_disabled_api.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package api
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/terraform-linters/tflint-plugin-sdk/terraform/configs"
8+
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
9+
"github.com/terraform-linters/tflint-ruleset-google/google"
10+
"github.com/terraform-linters/tflint-ruleset-google/rules/magicmodules"
11+
"google.golang.org/api/serviceusage/v1"
12+
)
13+
14+
// GoogleDisabledAPIRule checks whether the API required by resources is disabled
15+
type GoogleDisabledAPIRule struct{}
16+
17+
// NewGoogleDisabledAPIRule returns a new rule
18+
func NewGoogleDisabledAPIRule() *GoogleDisabledAPIRule {
19+
return &GoogleDisabledAPIRule{}
20+
}
21+
22+
// Name returns the rule name
23+
func (r *GoogleDisabledAPIRule) Name() string {
24+
return "google_disabled_api_rule"
25+
}
26+
27+
// Enabled returns whether the rule is enabled by default
28+
func (r *GoogleDisabledAPIRule) Enabled() bool {
29+
return true
30+
}
31+
32+
// Severity returns the rule severity
33+
func (r *GoogleDisabledAPIRule) Severity() string {
34+
return tflint.ERROR
35+
}
36+
37+
// Link returns the rule reference link
38+
func (r *GoogleDisabledAPIRule) Link() string {
39+
return ""
40+
}
41+
42+
// Check checks whether the API required by resources is disabled
43+
func (r *GoogleDisabledAPIRule) Check(rr tflint.Runner) error {
44+
runner := rr.(*google.Runner)
45+
46+
if runner.Project == "" {
47+
return nil
48+
}
49+
50+
enabledAPIs := map[string]*serviceusage.GoogleApiServiceusageV1Service{}
51+
ctx := context.TODO()
52+
err := runner.Client.ServiceUsage.Services.List(runner.ParentProject()).Filter("state:ENABLED").Pages(ctx, func(resp *serviceusage.ListServicesResponse) error {
53+
for _, service := range resp.Services {
54+
enabledAPIs[service.Config.Title] = service
55+
}
56+
return nil
57+
})
58+
if err != nil {
59+
err := &tflint.Error{
60+
Code: tflint.ExternalAPIError,
61+
Level: tflint.ErrorLevel,
62+
Message: "An error occurred while invoking ServiceUsage.List",
63+
Cause: err,
64+
}
65+
return err
66+
}
67+
68+
for resource, product := range magicmodules.Products {
69+
if len(product.APIsRequired) == 0 {
70+
continue
71+
}
72+
73+
err := runner.WalkResources(resource, func(resource *configs.Resource) error {
74+
for _, ref := range product.APIsRequired {
75+
if _, ok := enabledAPIs[ref.Name]; !ok {
76+
err := runner.EmitIssue(
77+
r,
78+
fmt.Sprintf("%s has not been used in %s before or it is disabled.", ref.Name, runner.Project),
79+
resource.DeclRange,
80+
)
81+
if err != nil {
82+
return err
83+
}
84+
}
85+
}
86+
return nil
87+
})
88+
if err != nil {
89+
return err
90+
}
91+
}
92+
93+
return nil
94+
}

rules/api/provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package api
2+
3+
import "github.com/terraform-linters/tflint-plugin-sdk/tflint"
4+
5+
// Rules is a list of rules with invoking APIs
6+
var Rules = []tflint.Rule{
7+
NewGoogleDisabledAPIRule(),
8+
}

0 commit comments

Comments
 (0)