github.com/jpreese/tflint@v0.19.2-0.20200908152133-b01686250fb6/rules/terraformrules/terraform_workspace_remote.go (about) 1 package terraformrules 2 3 import ( 4 "log" 5 6 "github.com/hashicorp/hcl/v2" 7 "github.com/hashicorp/terraform/addrs" 8 "github.com/hashicorp/terraform/lang" 9 "github.com/terraform-linters/tflint/tflint" 10 ) 11 12 // TerraformWorkspaceRemoteRule warns of the use of terraform.workspace with a remote backend 13 type TerraformWorkspaceRemoteRule struct{} 14 15 // NewTerraformWorkspaceRemoteRule return a new rule 16 func NewTerraformWorkspaceRemoteRule() *TerraformWorkspaceRemoteRule { 17 return &TerraformWorkspaceRemoteRule{} 18 } 19 20 // Name returns the rule name 21 func (r *TerraformWorkspaceRemoteRule) Name() string { 22 return "terraform_workspace_remote" 23 } 24 25 // Enabled returns whether the rule is enabled by default 26 func (r *TerraformWorkspaceRemoteRule) Enabled() bool { 27 return true 28 } 29 30 // Severity returns the rule severity 31 func (r *TerraformWorkspaceRemoteRule) Severity() string { 32 return tflint.WARNING 33 } 34 35 // Link returns the rule reference link 36 func (r *TerraformWorkspaceRemoteRule) Link() string { 37 return tflint.ReferenceLink(r.Name()) 38 } 39 40 // Check checks for a "remote" backend and if found emits issues for 41 // each use of terraform.workspace in an expression. 42 func (r *TerraformWorkspaceRemoteRule) Check(runner *tflint.Runner) error { 43 if !runner.TFConfig.Path.IsRoot() { 44 // This rule does not evaluate child modules. 45 return nil 46 } 47 48 log.Printf("[TRACE] Check `%s` rule for `%s` runner", r.Name(), runner.TFConfigPath()) 49 50 backend := runner.TFConfig.Root.Module.Backend 51 if backend == nil || backend.Type != "remote" { 52 return nil 53 } 54 55 return runner.WalkExpressions(func(expr hcl.Expression) error { 56 return r.checkForTerraformWorkspaceInExpr(runner, expr) 57 }) 58 } 59 60 func (r *TerraformWorkspaceRemoteRule) checkForTerraformWorkspaceInExpr(runner *tflint.Runner, expr hcl.Expression) error { 61 refs, diags := lang.ReferencesInExpr(expr) 62 if diags.HasErrors() { 63 log.Printf("[DEBUG] Cannot find references in expression, ignoring: %v", diags.Err()) 64 return nil 65 } 66 67 for _, ref := range refs { 68 switch sub := ref.Subject.(type) { 69 case addrs.TerraformAttr: 70 if sub.Name == "workspace" { 71 runner.EmitIssue( 72 r, 73 "terraform.workspace should not be used with a 'remote' backend", 74 expr.Range(), 75 ) 76 return nil 77 } 78 } 79 } 80 81 return nil 82 }