Skip to content

Commit

Permalink
Update Magic Modules (#332)
Browse files Browse the repository at this point in the history
  • Loading branch information
wata727 authored Feb 13, 2024
1 parent 62ecee1 commit 47389ce
Show file tree
Hide file tree
Showing 33 changed files with 2,001 additions and 1,781 deletions.
44 changes: 21 additions & 23 deletions rules/api/google_disabled_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func (r *GoogleDisabledAPIRule) Check(rr tflint.Runner) error {
ctx := context.TODO()
err := runner.Client.ServiceUsage.Services.List(runner.ParentProject()).Filter("state:ENABLED").Pages(ctx, func(resp *serviceusage.ListServicesResponse) error {
for _, service := range resp.Services {
r.enabledAPIs[service.Config.Title] = service
r.enabledAPIs[service.Config.Name] = service
}
return nil
})
Expand All @@ -74,33 +74,31 @@ func (r *GoogleDisabledAPIRule) Check(rr tflint.Runner) error {
}
}

for resource, product := range magicmodules.Products {
if len(product.APIsRequired) == 0 {
continue
}
resources, err := runner.GetModuleContent(&hclext.BodySchema{
Blocks: []hclext.BlockSchema{
{Type: "resource", LabelNames: []string{"type", "name"}},
},
}, nil)
if err != nil {
return err
}

resources, err := runner.GetResourceContent(resource, &hclext.BodySchema{}, nil)
if err != nil {
return err
for _, resource := range resources.Blocks {
url, exists := magicmodules.APIDefinition[resource.Labels[0]]
if !exists {
continue
}

for _, resource := range resources.Blocks {
for _, ref := range product.APIsRequired {
if _, ok := r.enabledAPIs[ref.Name]; !ok {
err := runner.EmitIssue(
r,
fmt.Sprintf("%s has not been used in %s before or it is disabled.", ref.Name, runner.Project),
resource.DefRange,
)
if err != nil {
return err
}
}
if _, ok := r.enabledAPIs[url]; !ok {
err := runner.EmitIssue(
r,
fmt.Sprintf("%s has not been used in %s before or it is disabled.", url, runner.Project),
resource.DefRange,
)
if err != nil {
return err
}
}
if err != nil {
return err
}
}

return nil
Expand Down
32 changes: 21 additions & 11 deletions rules/api/google_disabled_api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ terraform {}`,
Expected: helper.Issues{},
},
{
Name: "Compute Engine API is not enabled",
Name: "compute.googleapis.com is not enabled",
Content: `
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
Expand All @@ -33,7 +33,7 @@ resource "google_compute_network" "vpc_network" {
Expected: helper.Issues{
{
Rule: NewGoogleDisabledAPIRule(),
Message: "Compute Engine API has not been used in foo-bar-baz before or it is disabled.",
Message: "compute.googleapis.com has not been used in foo-bar-baz before or it is disabled.",
Range: hcl.Range{
Filename: "resource.tf",
Start: hcl.Pos{Line: 2, Column: 1},
Expand All @@ -43,14 +43,22 @@ resource "google_compute_network" "vpc_network" {
},
},
{
Name: "Compute Engine API is enabled",
Name: "compute.googleapis.com is enabled",
Content: `
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
auto_create_subnetworks = "true"
}`,
Response: map[string]*serviceusage.GoogleApiServiceusageV1Service{
"Compute Engine API": {},
"compute.googleapis.com": {
Config: &serviceusage.GoogleApiServiceusageV1ServiceConfig{
Title: "Compute Engine API",
Name: "compute.googleapis.com",
},
Name: "projects/123456789/services/compute.googleapis.com",
Parent: "projects/123456789",
State: "ENABLED",
},
},
Expected: helper.Issues{},
},
Expand All @@ -59,14 +67,16 @@ resource "google_compute_network" "vpc_network" {
rule := NewGoogleDisabledAPIRule()

for _, tc := range cases {
runner := NewTestRunner(t, map[string]string{"resource.tf": tc.Content})
t.Run(tc.Name, func(t *testing.T) {
runner := NewTestRunner(t, map[string]string{"resource.tf": tc.Content})

rule.prepared = true
rule.enabledAPIs = tc.Response
rule.prepared = true
rule.enabledAPIs = tc.Response

if err := rule.Check(runner); err != nil {
t.Fatalf("Unexpected error occurred: %s", err)
}
helper.AssertIssues(t, tc.Expected, runner.Runner.(*helper.Runner).Issues)
if err := rule.Check(runner); err != nil {
t.Fatalf("Unexpected error occurred: %s", err)
}
helper.AssertIssues(t, tc.Expected, runner.Runner.(*helper.Runner).Issues)
})
}
}
364 changes: 364 additions & 0 deletions rules/magicmodules/api_definition.go

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,44 @@ import (
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
)

// GoogleBigQueryRoutineInvalidDeterminismLevelRule checks the pattern is valid
type GoogleBigQueryRoutineInvalidDeterminismLevelRule struct {
// GoogleBigqueryRoutineInvalidDeterminismLevelRule checks the pattern is valid
type GoogleBigqueryRoutineInvalidDeterminismLevelRule struct {
tflint.DefaultRule

resourceType string
attributeName string
}

// NewGoogleBigQueryRoutineInvalidDeterminismLevelRule returns new rule with default attributes
func NewGoogleBigQueryRoutineInvalidDeterminismLevelRule() *GoogleBigQueryRoutineInvalidDeterminismLevelRule {
return &GoogleBigQueryRoutineInvalidDeterminismLevelRule{
resourceType: "google_big_query_routine",
// NewGoogleBigqueryRoutineInvalidDeterminismLevelRule returns new rule with default attributes
func NewGoogleBigqueryRoutineInvalidDeterminismLevelRule() *GoogleBigqueryRoutineInvalidDeterminismLevelRule {
return &GoogleBigqueryRoutineInvalidDeterminismLevelRule{
resourceType: "google_bigquery_routine",
attributeName: "determinism_level",
}
}

// Name returns the rule name
func (r *GoogleBigQueryRoutineInvalidDeterminismLevelRule) Name() string {
return "google_big_query_routine_invalid_determinism_level"
func (r *GoogleBigqueryRoutineInvalidDeterminismLevelRule) Name() string {
return "google_bigquery_routine_invalid_determinism_level"
}

// Enabled returns whether the rule is enabled by default
func (r *GoogleBigQueryRoutineInvalidDeterminismLevelRule) Enabled() bool {
func (r *GoogleBigqueryRoutineInvalidDeterminismLevelRule) Enabled() bool {
return true
}

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

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

// Check checks the pattern is valid
func (r *GoogleBigQueryRoutineInvalidDeterminismLevelRule) Check(runner tflint.Runner) error {
func (r *GoogleBigqueryRoutineInvalidDeterminismLevelRule) Check(runner tflint.Runner) error {
resources, err := runner.GetResourceContent(r.resourceType, &hclext.BodySchema{
Attributes: []hclext.AttributeSchema{{Name: r.attributeName}},
}, nil)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,44 @@ import (
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
)

// GoogleBigQueryRoutineInvalidLanguageRule checks the pattern is valid
type GoogleBigQueryRoutineInvalidLanguageRule struct {
// GoogleBigqueryRoutineInvalidLanguageRule checks the pattern is valid
type GoogleBigqueryRoutineInvalidLanguageRule struct {
tflint.DefaultRule

resourceType string
attributeName string
}

// NewGoogleBigQueryRoutineInvalidLanguageRule returns new rule with default attributes
func NewGoogleBigQueryRoutineInvalidLanguageRule() *GoogleBigQueryRoutineInvalidLanguageRule {
return &GoogleBigQueryRoutineInvalidLanguageRule{
resourceType: "google_big_query_routine",
// NewGoogleBigqueryRoutineInvalidLanguageRule returns new rule with default attributes
func NewGoogleBigqueryRoutineInvalidLanguageRule() *GoogleBigqueryRoutineInvalidLanguageRule {
return &GoogleBigqueryRoutineInvalidLanguageRule{
resourceType: "google_bigquery_routine",
attributeName: "language",
}
}

// Name returns the rule name
func (r *GoogleBigQueryRoutineInvalidLanguageRule) Name() string {
return "google_big_query_routine_invalid_language"
func (r *GoogleBigqueryRoutineInvalidLanguageRule) Name() string {
return "google_bigquery_routine_invalid_language"
}

// Enabled returns whether the rule is enabled by default
func (r *GoogleBigQueryRoutineInvalidLanguageRule) Enabled() bool {
func (r *GoogleBigqueryRoutineInvalidLanguageRule) Enabled() bool {
return true
}

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

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

// Check checks the pattern is valid
func (r *GoogleBigQueryRoutineInvalidLanguageRule) Check(runner tflint.Runner) error {
func (r *GoogleBigqueryRoutineInvalidLanguageRule) Check(runner tflint.Runner) error {
resources, err := runner.GetResourceContent(r.resourceType, &hclext.BodySchema{
Attributes: []hclext.AttributeSchema{{Name: r.attributeName}},
}, nil)
Expand All @@ -72,7 +72,7 @@ func (r *GoogleBigQueryRoutineInvalidLanguageRule) Check(runner tflint.Runner) e
}

err := runner.EvaluateExpr(attribute.Expr, func(val string) error {
validateFunc := validation.StringInSlice([]string{"SQL", "JAVASCRIPT", ""}, false)
validateFunc := validation.StringInSlice([]string{"SQL", "JAVASCRIPT", "PYTHON", "JAVA", "SCALA", ""}, false)

_, errors := validateFunc(val, r.attributeName)
for _, err := range errors {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,44 @@ import (
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
)

// GoogleBigQueryRoutineInvalidRoutineTypeRule checks the pattern is valid
type GoogleBigQueryRoutineInvalidRoutineTypeRule struct {
// GoogleBigqueryRoutineInvalidRoutineTypeRule checks the pattern is valid
type GoogleBigqueryRoutineInvalidRoutineTypeRule struct {
tflint.DefaultRule

resourceType string
attributeName string
}

// NewGoogleBigQueryRoutineInvalidRoutineTypeRule returns new rule with default attributes
func NewGoogleBigQueryRoutineInvalidRoutineTypeRule() *GoogleBigQueryRoutineInvalidRoutineTypeRule {
return &GoogleBigQueryRoutineInvalidRoutineTypeRule{
resourceType: "google_big_query_routine",
// NewGoogleBigqueryRoutineInvalidRoutineTypeRule returns new rule with default attributes
func NewGoogleBigqueryRoutineInvalidRoutineTypeRule() *GoogleBigqueryRoutineInvalidRoutineTypeRule {
return &GoogleBigqueryRoutineInvalidRoutineTypeRule{
resourceType: "google_bigquery_routine",
attributeName: "routine_type",
}
}

// Name returns the rule name
func (r *GoogleBigQueryRoutineInvalidRoutineTypeRule) Name() string {
return "google_big_query_routine_invalid_routine_type"
func (r *GoogleBigqueryRoutineInvalidRoutineTypeRule) Name() string {
return "google_bigquery_routine_invalid_routine_type"
}

// Enabled returns whether the rule is enabled by default
func (r *GoogleBigQueryRoutineInvalidRoutineTypeRule) Enabled() bool {
func (r *GoogleBigqueryRoutineInvalidRoutineTypeRule) Enabled() bool {
return true
}

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

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

// Check checks the pattern is valid
func (r *GoogleBigQueryRoutineInvalidRoutineTypeRule) Check(runner tflint.Runner) error {
func (r *GoogleBigqueryRoutineInvalidRoutineTypeRule) Check(runner tflint.Runner) error {
resources, err := runner.GetResourceContent(r.resourceType, &hclext.BodySchema{
Attributes: []hclext.AttributeSchema{{Name: r.attributeName}},
}, nil)
Expand Down
Loading

0 comments on commit 47389ce

Please sign in to comment.