• Stars
    star
    134
  • Rank 270,967 (Top 6 %)
  • Language
    Go
  • License
    Mozilla Public Li...
  • Created over 5 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Terraform Provider Lint Tool

tfproviderlint

Static analysis libraries and tooling for Terraform Provider code.

PkgGoDev

Install

Local Install

Release binaries are available in the Releases section.

To instead use Go to install into your $GOBIN directory (e.g. $GOPATH/bin):

go install github.com/bflad/tfproviderlint/cmd/tfproviderlint@latest

If you wish to install the command which includes all linting checks, including Extra Lint Checks:

go install github.com/bflad/tfproviderlint/cmd/tfproviderlintx@latest

Docker Install

docker pull bflad/tfproviderlint

Homebrew Install

brew install bflad/tap/tfproviderlint

Usage

The tfproviderlint and tfproviderlintx tools operate similarly except for which checks are available. Additional information about usage and configuration options can be found by passing the help argument:

tfproviderlint help

To enable only specific checks, they can be passed in as flags:

tfproviderlint -AT001

To enable all checks, but disable specific checks, they can be passed in as flags set to false:

tfproviderlint -AT001=false

Local Usage

To report issues, change into the directory of the Terraform Provider code and run:

tfproviderlint ./...

To apply automated fixes for checks that support them, change into the directory of the Terraform Provider code and run:

tfproviderlint -fix ./...

It is also possible to run via go vet:

go vet -vettool $(which tfproviderlint) ./...

Docker Usage

Change into the directory of the Terraform Provider code and run:

docker run -v $(pwd):/src bflad/tfproviderlint ./...

GitHub Action Usage

A GitHub Action is available: tfproviderlint-github-action

Standard Lint Checks

Standard lint checks are enabled by default in the tfproviderlint tool. Opt-in checks can be found in the Extra Lint Checks section. For additional information about each check, you can run tfproviderlint help NAME.

Standard Acceptance Test Checks

Check Description Type
AT001 check for TestCase missing CheckDestroy AST
AT002 check for acceptance test function names including the word import AST
AT003 check for acceptance test function names missing an underscore AST
AT004 check for TestStep Config containing provider configuration AST
AT005 check for acceptance test function names missing TestAcc prefix AST
AT006 check for acceptance test functions containing multiple resource.Test() invocations AST
AT007 check for acceptance test functions containing multiple resource.ParallelTest() invocations AST
AT008 check for acceptance test function declaration *testing.T parameter naming AST
AT009 check for acctest.RandStringFromCharSet() calls that can be simplified to acctest.RandString() AST
AT010 check for TestCase including IDRefreshName implementation AST
AT011 check for TestCase including IDRefreshIgnore implementation without IDRefreshName AST
AT012 check for files containing multiple acceptance test function name prefixes AST

Standard Resource Checks

Check Description Type
R001 check for ResourceData.Set() calls using complex key argument AST
R002 check for ResourceData.Set() calls using * dereferences AST
R003 check for Resource having Exists functions AST
R004 check for ResourceData.Set() calls using incompatible value types AST
R005 check for ResourceData.HasChange() calls that can be combined into one HasChanges() call AST
R006 check for RetryFunc that omit retryable errors AST
R007 check for deprecated (schema.ResourceData).Partial usage AST
R008 check for deprecated (schema.ResourceData).SetPartial usage AST
R009 check for Go panic usage AST
R010 check for (schema.ResourceData).GetChange assignment which should use (schema.ResourceData).Get AST
R011 check for Resource that configure MigrateState AST
R012 check for data source Resource that configure CustomizeDiff AST
R013 check for map[string]*Resource that resource names contain at least one underscore AST
R014 check for CreateFunc, CreateContextFunc, DeleteFunc, DeleteContextFunc, ReadFunc, ReadContextFunc, UpdateFunc, and UpdateContextFunc parameter naming AST
R015 check for (*schema.ResourceData).SetId() receiver method usage with unstable resource.UniqueId() value AST
R016 check for (*schema.ResourceData).SetId() receiver method usage with unstable resource.PrefixedUniqueId() value AST
R017 check for (*schema.ResourceData).SetId() receiver method usage with unstable time.Now() value AST
R018 check for time.Sleep() function usage AST
R019 check for (*schema.ResourceData).HasChanges() receiver method usage with many arguments AST

Standard Schema Checks

Check Description Type
S001 check for Schema of TypeList or TypeSet missing Elem AST
S002 check for Schema with both Required and Optional enabled AST
S003 check for Schema with both Required and Computed enabled AST
S004 check for Schema with both Required and Default configured AST
S005 check for Schema with both Computed and Default configured AST
S006 check for Schema of TypeMap missing Elem AST
S007 check for Schema with both Required and ConflictsWith configured AST
S008 check for Schema of TypeList or TypeSet with Default configured AST
S009 check for Schema of TypeList or TypeSet with ValidateFunc configured AST
S010 check for Schema of Computed only with ValidateFunc configured AST
S011 check for Schema of Computed only with DiffSuppressFunc configured AST
S012 check for Schema that Type is configured AST
S013 check for map[string]*Schema that one of Computed, Optional, or Required is configured AST
S014 check for Schema within Elem that Computed, Optional, and Required are not configured AST
S015 check for map[string]*Schema that attribute names are valid AST
S016 check for Schema that Set is only configured for TypeSet AST
S017 check for Schema that MaxItems and MinItems are only configured for TypeList, TypeMap, or TypeSet AST
S018 check for Schema that should use TypeList with MaxItems: 1 AST
S019 check for Schema that should omit Computed, Optional, or Required set to false AST
S020 check for Schema of Computed only with ForceNew enabled AST
S021 check for Schema that should omit ComputedWhen AST
S022 check for Schema of TypeMap with invalid Elem of *schema.Resource AST
S023 check for Schema that should omit Elem with incompatible Type AST
S024 check for Schema that should omit ForceNew in data source schema attributes AST
S025 check for Schema of Computed only with AtLeastOneOf configured AST
S026 check for Schema of Computed only with ConflictsWith configured AST
S027 check for Schema of Computed only with Default configured AST
S028 check for Schema of Computed only with DefaultFunc configured AST
S029 check for Schema of Computed only with ExactlyOneOf configured AST
S030 check for Schema of Computed only with InputDefault configured AST
S031 check for Schema of Computed only with MaxItems configured AST
S032 check for Schema of Computed only with MinItems configured AST
S033 check for Schema of Computed only with StateFunc configured AST
S034 check for Schema that configure PromoteSingle AST
S035 check for Schema with invalid AtLeastOneOf attribute references AST
S036 check for Schema with invalid ConflictsWith attribute references AST
S037 check for Schema with invalid ExactlyOneOf attribute references AST

Standard Validation Checks

Check Description Type
V001 check for custom SchemaValidateFunc that implement validation.StringMatch() or validation.StringDoesNotMatch() AST
V002 check for deprecated CIDRNetwork validation function usage AST
V003 check for deprecated IPRange validation function usage AST
V004 check for deprecated SingleIP validation function usage AST
V005 check for deprecated ValidateJsonString validation function usage AST
V006 check for deprecated ValidateListUniqueStrings validation function usage AST
V007 check for deprecated ValidateRegexp validation function usage AST
V008 check for deprecated ValidateRFC3339TimeString validation function usage AST
V009 check for validation.StringMatch() call with empty message argument AST
V010 check for validation.StringDoesNotMatch() call with empty message argument AST
V011 check for custom SchemaValidateFunc that implement validation.StringLenBetween() AST
V012 check for custom SchemaValidateFunc that implement validation.IntAtLeast(), validation.IntAtMost(), or validation.IntBetween() AST
V013 check for custom SchemaValidateFunc that implement validation.StringInSlice() or validation.StringNotInSlice() AST
V014 check for custom SchemaValidateFunc that implement validation.IntInSlice() or validation.IntNotInSlice() AST

Extra Lint Checks

Extra lint checks are not included in the tfproviderlint tool and must be accessed via the tfproviderlintx tool or added to a custom lint tool. Generally these represent advanced Terraform Plugin SDK functionality that is not appropriate for all Terraform Providers.

Extra Acceptance Test Checks

Check Description Type
XAT001 check for TestCase missing ErrorCheck AST

Extra Resource Checks

Check Description Type
XR001 check for usage of ResourceData.GetOkExists() calls AST
XR002 check for Resource that should implement Importer AST
XR003 check for Resource that should implement Timeouts AST
XR004 check for ResourceData.Set() calls that should implement error checking with complex values AST
XR005 check for Resource that Description is configured AST
XR006 check for Resource that implements Timeouts for missing Create, Delete, Read, or Update implementation AST
XR007 check for os/exec.Command usage AST
XR008 check for os/exec.CommandContext usage AST

Extra Schema Checks

Check Description Type
XS001 check for map[string]*Schema that Description is configured AST
XS002 check for map[string]*Schema that keys are in alphabetical order AST

Development and Testing

This project is built on the go/analysis framework and uses Go Modules for dependency management.

Helpful tooling for development:

  • astdump: a tool for displaying the AST form of Go file
  • ssadump: a tool for displaying and interpreting the SSA form of Go programs

Go Compatibility

This project follows the Go support policy for versions. The two latest major releases of Go are supported by the project.

Currently, that means Go 1.19 or later must be used when including this project as a dependency.

Adding an Analyzer

  • Create new analyzer in passes/ (or xpasses/ for extra checks)
  • If the Analyzer reports issues, add to AllChecks variable in passes/checks.go (or xpasses/checks.go for extra checks)
  • Since the analysistest package does not support Go Modules currently, each analyzer that implements testing must add a symlink to the top level vendor directory in the testdata/src/a directory. e.g. ln -s ../../../../../vendor passes/NAME/testdata/src/a/vendor

Implementing SuggestedFixes Testing

The upstream analysistest package now contains functionality to verify SuggestedFixes via RunWithSuggestedFixes.

import (
  "testing"

  "golang.org/x/tools/go/analysis/analysistest"
)

func TestAnalyzerFixes(t *testing.T) {
  testdata := analysistest.TestData()
  analysistest.RunWithSuggestedFixes(t, testdata, Analyzer, "a")
}

To setup the expected file content verification, the testing expects a file suffixed with .golden (e.g. testdata/src/a/main.go.golden).

Implementing a Custom Lint Tool

The go/analysis framework and this codebase are designed for flexibility. You may wish to permanently disable certain default checks or even implement your own provider-specific checks. An example of how to incorporate all default and extra checks in a CLI command can be found in cmd/tfproviderlintx. To permanently exclude checks, each desired Analyzer must be individually included, similar to how AllChecks() is built in passes/checks.go.

The passes directory also includes the underlying Analyzer which iteratively gather AST-based information about the Terraform Provider code being analyzed. For example, passes/helper/resource/retryfuncinfo returns information from all named and anonymous declarations of helper/resource.RetryFunc().

Primatives for working with Terraform Plugin SDK primatives can be found in helper/terraformtype. Primatives for working with the Go AST can be found in helper/astutils.

Updating Dependencies

Dependency updates are managed by Dependabot.

Unit Testing

go test ./...

Local Install Testing

go install ./cmd/tfproviderlint

More Repositories

1

chef-stash

Chef Cookbook for Atlassian Stash
HTML
37
star
2

chef-jira

Chef Cookbook for Atlassian Jira
HTML
33
star
3

chef-auto-patch

Chef Cookbook for Automatically Patching Nodes
Ruby
21
star
4

tfproviderdocs

Terraform Provider Documentation Tool
Go
21
star
5

giraffe-collectd

Giraffe Configuration Generator for collectd Metrics
Python
13
star
6

knife-cisco_asa

Knife Plugin for Cisco ASA Devices
Ruby
9
star
7

chef-skyline

Chef Cookbook for Skyline
Ruby
8
star
8

chef-java-management

Chef Cookbook for Java Management
HTML
7
star
9

chef-mysql_connector

Chef Cookbook for MySQL Connectors
Ruby
6
star
10

chef-cacti

Chef Cookbook for Cacti
Ruby
6
star
11

chef-scipy

Chef Cookbook for SciPy
Ruby
6
star
12

chef-wkhtmltopdf

Chef Cookbook for wkhtmltopdf
Ruby
4
star
13

chef-device-mapper

Chef Cookbook for device-mapper
Ruby
4
star
14

tfproviderlint-github-action

Terraform Provider Lint GitHub Action
Dockerfile
4
star
15

terraform-plugin-framework-type-time

RFC 3339 timestamp string type and value implementations for terraform-plugin-framework
Go
4
star
16

chef-protobuf

Chef Cookbook for Protocol Buffers
Ruby
3
star
17

action-milestone-comment

GitHub Action to Comment on Milestone Issues and Pull Requests
JavaScript
3
star
18

knife-stash

Knife Plugin for Atlassian Stash
Ruby
3
star
19

chef-gcc

Chef Cookbook for GCC
Ruby
3
star
20

chef-irc_handler

Chef Cookbook for IRC chef_handler
Ruby
2
star
21

chef-rhn

Chef Cookbook for RHN
Ruby
2
star
22

chef-boot2docker

Chef Cookbook for boot2docker
Ruby
2
star
23

github-action-testing

Go
1
star
24

gopaniccheck

Go Analyzers and Tooling for Panic Checking
Go
1
star
25

knife-rhn

Knife Plugin for RHN
Ruby
1
star
26

docker-testcontainerd

Docker Quick Test Container Daemon
Shell
1
star
27

vagrant-puppet-cloudera

Vagrant Example for puppet-cloudera
Puppet
1
star
28

tfpluginsdkupgrade

A proof of concept Terraform Plugin SDK upgrade tool for Terraform Provider code.
Go
1
star
29

chef-lsyncd-old

Chef Cookbook for lsyncd
Ruby
1
star
30

action-migrate-issue

GitHub Action to Migrate an Issue
JavaScript
1
star
31

chef-bahamut

Chef Cookbook for Bahamut IRC Daemon
Ruby
1
star
32

giraffe-jmxtrans

Giraffe Configuration Generator for jmxtrans Metrics
Python
1
star
33

chef-lmctfy

Chef Cookbook for Google's Let Me Contain That For You
Ruby
1
star
34

puppet-sevenzip

Puppet Module for 7-zip
Ruby
1
star
35

terraform-provider-framework

Terraform Provider for Terraform Plugin Framework Testing
Go
1
star