rules/no_double_quotes_in_ignore_changes.go (93 lines of code) (raw):
package rules
import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl/v2/hclsyntax"
"github.com/terraform-linters/tflint-plugin-sdk/hclext"
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
)
var noDoubleQuotesInIgnoreChangesBodySchema = &hclext.BodySchema{
Blocks: []hclext.BlockSchema{
{
Type: "resource",
LabelNames: []string{"type", "name"},
Body: &hclext.BodySchema{
Blocks: []hclext.BlockSchema{
{
Type: "lifecycle",
Body: &hclext.BodySchema{
Attributes: []hclext.AttributeSchema{
{Name: "ignore_changes"},
},
},
},
},
},
},
},
}
var _ tflint.Rule = new(NoDoubleQuotesInIgnoreChangesRule)
type NoDoubleQuotesInIgnoreChangesRule struct {
tflint.DefaultRule
}
func NewNoDoubleQuotesInIgnoreChangesRule() *NoDoubleQuotesInIgnoreChangesRule {
return &NoDoubleQuotesInIgnoreChangesRule{}
}
func (t *NoDoubleQuotesInIgnoreChangesRule) Name() string {
return "required_module_source_tfnfr10"
}
func (t *NoDoubleQuotesInIgnoreChangesRule) Link() string {
return "https://azure.github.io/Azure-Verified-Modules/specs/terraform/#id-tfnfr10---category-code-style---no-double-quotes-in-ignore_changes"
}
func (t *NoDoubleQuotesInIgnoreChangesRule) Enabled() bool {
return true
}
func (t *NoDoubleQuotesInIgnoreChangesRule) Severity() tflint.Severity {
return tflint.ERROR
}
func (t *NoDoubleQuotesInIgnoreChangesRule) Check(r tflint.Runner) error {
path, err := r.GetModulePath()
if err != nil {
return err
}
if !path.IsRoot() {
return nil
}
body, err := r.GetModuleContent(
noDoubleQuotesInIgnoreChangesBodySchema,
&tflint.GetModuleContentOption{ExpandMode: tflint.ExpandModeNone})
if err != nil {
return err
}
var errList error
for _, block := range body.Blocks {
if block.Type != "resource" {
continue
}
if subErr := t.checkBlock(r, block); subErr != nil {
errList = multierror.Append(errList, subErr)
}
}
return errList
}
func (t *NoDoubleQuotesInIgnoreChangesRule) checkBlock(r tflint.Runner, block *hclext.Block) error {
for _, subBlock := range block.Body.Blocks {
ignoreChanges, exists := subBlock.Body.Attributes["ignore_changes"]
if !exists {
return nil
}
ignoreChangesExpr, ok := ignoreChanges.Expr.(*hclsyntax.TupleConsExpr)
if !ok {
return nil
}
for _, itemExpr := range ignoreChangesExpr.Exprs {
if _, ok := itemExpr.(*hclsyntax.ScopeTraversalExpr); !ok {
return r.EmitIssue(
t,
"ignore_changes shouldn't include double quotes",
ignoreChanges.Range,
)
}
}
}
return nil
}