Skip to content

Commit ae543ac

Browse files
authored
rule: Add google_compute_resource_policy_invalid_name rule (#84)
1 parent 3afbf08 commit ae543ac

File tree

4 files changed

+126
-1
lines changed

4 files changed

+126
-1
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package rules
2+
3+
import (
4+
hcl "github.com/hashicorp/hcl/v2"
5+
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
6+
)
7+
8+
// GoogleComputeResourcePolicyInvalidNameRule checks whether the name is invalid
9+
type GoogleComputeResourcePolicyInvalidNameRule struct {
10+
resourceType string
11+
attributeName string
12+
}
13+
14+
// NewGoogleComputeResourcePolicyInvalidNameRule returns new rule with default attributes
15+
func NewGoogleComputeResourcePolicyInvalidNameRule() *GoogleComputeResourcePolicyInvalidNameRule {
16+
return &GoogleComputeResourcePolicyInvalidNameRule{
17+
resourceType: "google_compute_resource_policy",
18+
attributeName: "name",
19+
}
20+
}
21+
22+
// Name returns the rule name
23+
func (r *GoogleComputeResourcePolicyInvalidNameRule) Name() string {
24+
return "google_compute_resource_policy_invalid_name"
25+
}
26+
27+
// Enabled returns whether the rule is enabled by default
28+
func (r *GoogleComputeResourcePolicyInvalidNameRule) Enabled() bool {
29+
return true
30+
}
31+
32+
// Severity returns the rule severity
33+
func (r *GoogleComputeResourcePolicyInvalidNameRule) Severity() string {
34+
return tflint.ERROR
35+
}
36+
37+
// Link returns the rule reference link
38+
func (r *GoogleComputeResourcePolicyInvalidNameRule) Link() string {
39+
return ""
40+
}
41+
42+
// Check checks whether the name is invalid
43+
func (r *GoogleComputeResourcePolicyInvalidNameRule) Check(runner tflint.Runner) error {
44+
return runner.WalkResourceAttributes(r.resourceType, r.attributeName, func(attribute *hcl.Attribute) error {
45+
var val string
46+
err := runner.EvaluateExpr(attribute.Expr, &val, nil)
47+
48+
validateFunc := validateRegexp(`^[a-z]([-a-z0-9]*[a-z0-9])$`)
49+
50+
return runner.EnsureNoError(err, func() error {
51+
_, errors := validateFunc(val, r.attributeName)
52+
for _, err := range errors {
53+
runner.EmitIssueOnExpr(r, err.Error(), attribute.Expr)
54+
}
55+
return nil
56+
})
57+
})
58+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package rules
2+
3+
import (
4+
"testing"
5+
6+
hcl "github.com/hashicorp/hcl/v2"
7+
"github.com/terraform-linters/tflint-plugin-sdk/helper"
8+
)
9+
10+
func Test_GoogleComputeResourcePolicyInvalidName(t *testing.T) {
11+
cases := []struct {
12+
Name string
13+
Content string
14+
Expected helper.Issues
15+
}{
16+
{
17+
Name: "basic",
18+
Content: `
19+
resource "google_compute_resource_policy" "snapshot_policy" {
20+
name = "snapshot_policy"
21+
}
22+
`,
23+
Expected: helper.Issues{
24+
{
25+
Rule: NewGoogleComputeResourcePolicyInvalidNameRule(),
26+
Message: `"name" ("snapshot_policy") doesn't match regexp "^[a-z]([-a-z0-9]*[a-z0-9])$"`,
27+
Range: hcl.Range{
28+
Filename: "resource.tf",
29+
Start: hcl.Pos{Line: 3, Column: 10},
30+
End: hcl.Pos{Line: 3, Column: 27},
31+
},
32+
},
33+
},
34+
},
35+
}
36+
37+
rule := NewGoogleComputeResourcePolicyInvalidNameRule()
38+
39+
for _, tc := range cases {
40+
runner := helper.TestRunner(t, map[string]string{"resource.tf": tc.Content})
41+
42+
if err := rule.Check(runner); err != nil {
43+
t.Fatalf("Unexpected error occurred: %s", err)
44+
}
45+
46+
helper.AssertIssues(t, tc.Expected, runner.Issues)
47+
}
48+
}

rules/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ var Rules = append([]tflint.Rule{
1414
NewGoogleContainerClusterInvalidMachineTypeRule(),
1515
NewGoogleContainerNodePoolInvalidMachineTypeRule(),
1616
NewGoogleDataflowJobInvalidMachineTypeRule(),
17+
NewGoogleComputeResourcePolicyInvalidNameRule(),
1718
}, magicmodules.Rules...)

rules/utils.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package rules
22

3-
import "strings"
3+
import (
4+
"fmt"
5+
"regexp"
6+
"strings"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
410

511
var validMachineTypes = map[string]bool{
612
"e2-standard-2": true,
@@ -124,3 +130,15 @@ func isCustomType(machineType string) bool {
124130
strings.HasPrefix(machineType, "n1-custom-") ||
125131
strings.HasPrefix(machineType, "custom-")
126132
}
133+
134+
func validateRegexp(re string) schema.SchemaValidateFunc {
135+
return func(v interface{}, k string) (ws []string, errors []error) {
136+
value := v.(string)
137+
if !regexp.MustCompile(re).MatchString(value) {
138+
errors = append(errors, fmt.Errorf(
139+
"%q (%q) doesn't match regexp %q", k, value, re))
140+
}
141+
142+
return
143+
}
144+
}

0 commit comments

Comments
 (0)