Skip to content

Commit

Permalink
Merge pull request #27 from wata727/aws_elasticache_cluster_invalid_p…
Browse files Browse the repository at this point in the history
…arameter_group

add invalid parameter group detector for ElastiCache
  • Loading branch information
wata727 committed Dec 24, 2016
2 parents 66575a9 + b496c8d commit 2a86e87
Show file tree
Hide file tree
Showing 7 changed files with 1,208 additions and 20 deletions.
1,027 changes: 1,027 additions & 0 deletions awsmock/elasticachemock.go

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions config/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/iam/iamiface"
"github.com/aws/aws-sdk-go/service/rds"
Expand All @@ -14,9 +16,10 @@ import (
)

type AwsClient struct {
Iam iamiface.IAMAPI
Ec2 ec2iface.EC2API
Rds rdsiface.RDSAPI
Iam iamiface.IAMAPI
Ec2 ec2iface.EC2API
Rds rdsiface.RDSAPI
Elasticache elasticacheiface.ElastiCacheAPI
}

func (c *Config) NewAwsClient() *AwsClient {
Expand All @@ -26,6 +29,7 @@ func (c *Config) NewAwsClient() *AwsClient {
client.Iam = iam.New(s)
client.Ec2 = ec2.New(s)
client.Rds = rds.New(s)
client.Elasticache = elasticache.New(s)

return client
}
Expand Down
60 changes: 60 additions & 0 deletions detector/aws_elasticache_cluster_invalid_parameter_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package detector

import (
"fmt"

"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/wata727/tflint/issue"
)

type AwsElastiCacheClusterInvalidParameterGroupDetector struct {
*Detector
}

func (d *Detector) CreateAwsElastiCacheClusterInvalidParameterGroupDetector() *AwsElastiCacheClusterInvalidParameterGroupDetector {
return &AwsElastiCacheClusterInvalidParameterGroupDetector{d}
}

func (d *AwsElastiCacheClusterInvalidParameterGroupDetector) Detect(issues *[]*issue.Issue) {
if !d.isDeepCheck("resource", "aws_elasticache_cluster") {
return
}

validCacheParameterGroups := map[string]bool{}
if d.ResponseCache.DescribeCacheParameterGroupsOutput == nil {
resp, err := d.AwsClient.Elasticache.DescribeCacheParameterGroups(&elasticache.DescribeCacheParameterGroupsInput{})
if err != nil {
d.Logger.Error(err)
d.Error = true
}
d.ResponseCache.DescribeCacheParameterGroupsOutput = resp
}
for _, parameterGroup := range d.ResponseCache.DescribeCacheParameterGroupsOutput.CacheParameterGroups {
validCacheParameterGroups[*parameterGroup.CacheParameterGroupName] = true
}

for filename, list := range d.ListMap {
for _, item := range list.Filter("resource", "aws_elasticache_cluster").Items {
parameterGroupToken, err := hclLiteralToken(item, "parameter_group_name")
if err != nil {
d.Logger.Error(err)
continue
}
parameterGroup, err := d.evalToString(parameterGroupToken.Text)
if err != nil {
d.Logger.Error(err)
continue
}

if !validCacheParameterGroups[parameterGroup] {
issue := &issue.Issue{
Type: "ERROR",
Message: fmt.Sprintf("\"%s\" is invalid parameter group name.", parameterGroup),
Line: parameterGroupToken.Pos.Line,
File: filename,
}
*issues = append(*issues, issue)
}
}
}
}
92 changes: 92 additions & 0 deletions detector/aws_elasticache_cluster_invalid_parameter_group_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package detector

import (
"reflect"
"testing"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/golang/mock/gomock"
"github.com/wata727/tflint/awsmock"
"github.com/wata727/tflint/config"
"github.com/wata727/tflint/issue"
)

func TestDetectAwsElastiCacheInvalidParameterGroup(t *testing.T) {
cases := []struct {
Name string
Src string
Response []*elasticache.CacheParameterGroup
Issues []*issue.Issue
}{
{
Name: "parameter_group_name is invalid",
Src: `
resource "aws_elasticache_cluster" "redis" {
parameter_group_name = "app-server"
}`,
Response: []*elasticache.CacheParameterGroup{
&elasticache.CacheParameterGroup{
CacheParameterGroupName: aws.String("app-server1"),
},
&elasticache.CacheParameterGroup{
CacheParameterGroupName: aws.String("app-server2"),
},
},
Issues: []*issue.Issue{
&issue.Issue{
Type: "ERROR",
Message: "\"app-server\" is invalid parameter group name.",
Line: 3,
File: "test.tf",
},
},
},
{
Name: "parameter_group_name is valid",
Src: `
resource "aws_elasticache_cluster" "redis" {
parameter_group_name = "app-server"
}`,
Response: []*elasticache.CacheParameterGroup{
&elasticache.CacheParameterGroup{
CacheParameterGroupName: aws.String("app-server1"),
},
&elasticache.CacheParameterGroup{
CacheParameterGroupName: aws.String("app-server2"),
},
&elasticache.CacheParameterGroup{
CacheParameterGroupName: aws.String("app-server"),
},
},
Issues: []*issue.Issue{},
},
}

for _, tc := range cases {
c := config.Init()
c.DeepCheck = true

awsClient := c.NewAwsClient()
ctrl := gomock.NewController(t)
defer ctrl.Finish()
elasticachemock := awsmock.NewMockElastiCacheAPI(ctrl)
elasticachemock.EXPECT().DescribeCacheParameterGroups(&elasticache.DescribeCacheParameterGroupsInput{}).Return(&elasticache.DescribeCacheParameterGroupsOutput{
CacheParameterGroups: tc.Response,
}, nil)
awsClient.Elasticache = elasticachemock

var issues = []*issue.Issue{}
TestDetectByCreatorName(
"CreateAwsElastiCacheClusterInvalidParameterGroupDetector",
tc.Src,
c,
awsClient,
&issues,
)

if !reflect.DeepEqual(issues, tc.Issues) {
t.Fatalf("Bad: %s\nExpected: %s\n\ntestcase: %s", issues, tc.Issues, tc.Name)
}
}
}
17 changes: 9 additions & 8 deletions detector/detector.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,23 @@ var detectors = map[string]string{
"aws_instance_previous_type": "CreateAwsInstancePreviousTypeDetector",
"aws_instance_not_specified_iam_profile": "CreateAwsInstanceNotSpecifiedIAMProfileDetector",
"aws_instance_default_standard_volume": "CreateAwsInstanceDefaultStandardVolumeDetector",
"aws_db_instance_default_parameter_group": "CreateAwsDBInstanceDefaultParameterGroupDetector",
"aws_db_instance_invalid_vpc_security_group": "CreateAwsDBInstanceInvalidVPCSecurityGroupDetector",
"aws_db_instance_invalid_db_subnet_group": "CreateAwsDBInstanceInvalidDBSubnetGroupDetector",
"aws_db_instance_invalid_parameter_group": "CreateAwsDBInstanceInvalidParameterGroupDetector",
"aws_db_instance_invalid_option_group": "CreateAwsDBInstanceInvalidOptionGroupDetector",
"aws_elasticache_cluster_default_parameter_group": "CreateAwsElastiCacheClusterDefaultParameterGroupDetector",
"aws_instance_invalid_iam_profile": "CreateAwsInstanceInvalidIAMProfileDetector",
"aws_instance_invalid_ami": "CreateAwsInstanceInvalidAMIDetector",
"aws_instance_invalid_key_name": "CreateAwsInstanceInvalidKeyNameDetector",
"aws_instance_invalid_subnet": "CreateAwsInstanceInvalidSubnetDetector",
"aws_instance_invalid_vpc_security_group": "CreateAwsInstanceInvalidVPCSecurityGroupDetector",
"aws_alb_invalid_security_group": "CreateAwsALBInvalidSecurityGroupDetector",
"aws_alb_invalid_subnet": "CreateAwsALBInvalidSubnetDetector",
"aws_elb_invalid_security_group": "CreateAwsELBInvalidSecurityGroupDetector",
"aws_elb_invalid_subnet": "CreateAwsELBInvalidSubnetDetector",
"aws_elb_invalid_instance": "CreateAwsELBInvalidInstanceDetector",
"aws_alb_invalid_security_group": "CreateAwsALBInvalidSecurityGroupDetector",
"aws_alb_invalid_subnet": "CreateAwsALBInvalidSubnetDetector",
"aws_db_instance_default_parameter_group": "CreateAwsDBInstanceDefaultParameterGroupDetector",
"aws_db_instance_invalid_vpc_security_group": "CreateAwsDBInstanceInvalidVPCSecurityGroupDetector",
"aws_db_instance_invalid_db_subnet_group": "CreateAwsDBInstanceInvalidDBSubnetGroupDetector",
"aws_db_instance_invalid_parameter_group": "CreateAwsDBInstanceInvalidParameterGroupDetector",
"aws_db_instance_invalid_option_group": "CreateAwsDBInstanceInvalidOptionGroupDetector",
"aws_elasticache_cluster_default_parameter_group": "CreateAwsElastiCacheClusterDefaultParameterGroupDetector",
"aws_elasticache_cluster_invalid_parameter_group": "CreateAwsElastiCacheClusterInvalidParameterGroupDetector",
}

func NewDetector(listMap map[string]*ast.ObjectList, c *config.Config) (*Detector, error) {
Expand Down
20 changes: 11 additions & 9 deletions detector/response_cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,20 @@ package detector

import (
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/rds"
)

type ResponseCache struct {
DescribeImagesOutput *ec2.DescribeImagesOutput
DescribeKeyPairsOutput *ec2.DescribeKeyPairsOutput
DescribeSubnetsOutput *ec2.DescribeSubnetsOutput
DescribeSecurityGroupsOutput *ec2.DescribeSecurityGroupsOutput
ListInstanceProfilesOutput *iam.ListInstanceProfilesOutput
DescribeInstancesOutput *ec2.DescribeInstancesOutput
DescribeDBSubnetGroupsOutput *rds.DescribeDBSubnetGroupsOutput
DescribeDBParameterGroupsOutput *rds.DescribeDBParameterGroupsOutput
DescribeOptionGroupsOutput *rds.DescribeOptionGroupsOutput
DescribeImagesOutput *ec2.DescribeImagesOutput
DescribeKeyPairsOutput *ec2.DescribeKeyPairsOutput
DescribeSubnetsOutput *ec2.DescribeSubnetsOutput
DescribeSecurityGroupsOutput *ec2.DescribeSecurityGroupsOutput
ListInstanceProfilesOutput *iam.ListInstanceProfilesOutput
DescribeInstancesOutput *ec2.DescribeInstancesOutput
DescribeDBSubnetGroupsOutput *rds.DescribeDBSubnetGroupsOutput
DescribeDBParameterGroupsOutput *rds.DescribeDBParameterGroupsOutput
DescribeOptionGroupsOutput *rds.DescribeOptionGroupsOutput
DescribeCacheParameterGroupsOutput *elasticache.DescribeCacheParameterGroupsOutput
}
2 changes: 2 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,5 @@ If you have enabled deep check, you can check if nonexistent values ​​are no
- aws_db_instance_invalid_db_subnet_group
- aws_db_instance_invalid_parameter_group
- aws_db_instance_invalid_option_group
- AWS ElastiCache Cluster
- aws_elasticache_cluster_invalid_parameter_group

0 comments on commit 2a86e87

Please sign in to comment.