Skip to content

Commit

Permalink
Delete global scope detector name
Browse files Browse the repository at this point in the history
  • Loading branch information
wata727 committed Jul 8, 2017
1 parent 64941dd commit 434d333
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 68 deletions.
109 changes: 56 additions & 53 deletions detector/detector.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,51 +37,51 @@ type Detector struct {
Link string
}

var detectors = map[string]string{
"aws_instance_invalid_type": "CreateAwsInstanceInvalidTypeDetector",
"aws_instance_previous_type": "CreateAwsInstancePreviousTypeDetector",
"aws_instance_not_specified_iam_profile": "CreateAwsInstanceNotSpecifiedIAMProfileDetector",
"aws_instance_default_standard_volume": "CreateAwsInstanceDefaultStandardVolumeDetector",
"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_alb_duplicate_name": "CreateAwsALBDuplicateNameDetector",
"aws_elb_invalid_security_group": "CreateAwsELBInvalidSecurityGroupDetector",
"aws_elb_invalid_subnet": "CreateAwsELBInvalidSubnetDetector",
"aws_elb_invalid_instance": "CreateAwsELBInvalidInstanceDetector",
"aws_elb_duplicate_name": "CreateAwsELBDuplicateNameDetector",
"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_db_instance_invalid_type": "CreateAwsDBInstanceInvalidTypeDetector",
"aws_db_instance_previous_type": "CreateAwsDBInstancePreviousTypeDetector",
"aws_db_instance_readable_password": "CreateAwsDBInstanceReadablePasswordDetector",
"aws_db_instance_duplicate_identifier": "CreateAwsDBInstanceDuplicateIdentifierDetector",
"aws_elasticache_cluster_default_parameter_group": "CreateAwsElastiCacheClusterDefaultParameterGroupDetector",
"aws_elasticache_cluster_invalid_parameter_group": "CreateAwsElastiCacheClusterInvalidParameterGroupDetector",
"aws_elasticache_cluster_invalid_subnet_group": "CreateAwsElastiCacheClusterInvalidSubnetGroupDetector",
"aws_elasticache_cluster_invalid_security_group": "CreateAwsElastiCacheClusterInvalidSecurityGroupDetector",
"aws_elasticache_cluster_invalid_type": "CreateAwsElastiCacheClusterInvalidTypeDetector",
"aws_elasticache_cluster_previous_type": "CreateAwsElastiCacheClusterPreviousTypeDetector",
"aws_elasticache_cluster_duplicate_id": "CreateAwsElastiCacheClusterDuplicateIDDetector",
"aws_security_group_duplicate_name": "CreateAwsSecurityGroupDuplicateDetector",
"aws_route_invalid_route_table": "CreateAwsRouteInvalidRouteTableDetector",
"aws_route_not_specified_target": "CreateAwsRouteNotSpecifiedTargetDetector",
"aws_route_specified_multiple_targets": "CreateAwsRouteSpecifiedMultipleTargetsDetector",
"aws_route_invalid_gateway": "CreateAwsRouteInvalidGatewayDetector",
"aws_route_invalid_egress_only_gateway": "CreateAwsRouteInvalidEgressOnlyGatewayDetector",
"aws_route_invalid_nat_gateway": "CreateAwsRouteInvalidNatGatewayDetector",
"aws_route_invalid_vpc_peering_connection": "CreateAwsRouteInvalidVpcPeeringConnectionDetector",
"aws_route_invalid_instance": "CreateAwsRouteInvalidInstanceDetector",
"aws_route_invalid_network_interface": "CreateAwsRouteInvalidNetworkInterfaceDetector",
"aws_cloudwatch_metric_alarm_invalid_unit": "CreateAwsCloudWatchMetricAlarmInvalidUnitDetector",
"terraform_module_pinned_source": "CreateTerraformModulePinnedSourceDetector",
var detectorFactories = []string{
"CreateAwsInstanceInvalidTypeDetector",
"CreateAwsInstancePreviousTypeDetector",
"CreateAwsInstanceNotSpecifiedIAMProfileDetector",
"CreateAwsInstanceDefaultStandardVolumeDetector",
"CreateAwsInstanceInvalidIAMProfileDetector",
"CreateAwsInstanceInvalidAMIDetector",
"CreateAwsInstanceInvalidKeyNameDetector",
"CreateAwsInstanceInvalidSubnetDetector",
"CreateAwsInstanceInvalidVPCSecurityGroupDetector",
"CreateAwsALBInvalidSecurityGroupDetector",
"CreateAwsALBInvalidSubnetDetector",
"CreateAwsALBDuplicateNameDetector",
"CreateAwsELBInvalidSecurityGroupDetector",
"CreateAwsELBInvalidSubnetDetector",
"CreateAwsELBInvalidInstanceDetector",
"CreateAwsELBDuplicateNameDetector",
"CreateAwsDBInstanceDefaultParameterGroupDetector",
"CreateAwsDBInstanceInvalidVPCSecurityGroupDetector",
"CreateAwsDBInstanceInvalidDBSubnetGroupDetector",
"CreateAwsDBInstanceInvalidParameterGroupDetector",
"CreateAwsDBInstanceInvalidOptionGroupDetector",
"CreateAwsDBInstanceInvalidTypeDetector",
"CreateAwsDBInstancePreviousTypeDetector",
"CreateAwsDBInstanceReadablePasswordDetector",
"CreateAwsDBInstanceDuplicateIdentifierDetector",
"CreateAwsElastiCacheClusterDefaultParameterGroupDetector",
"CreateAwsElastiCacheClusterInvalidParameterGroupDetector",
"CreateAwsElastiCacheClusterInvalidSubnetGroupDetector",
"CreateAwsElastiCacheClusterInvalidSecurityGroupDetector",
"CreateAwsElastiCacheClusterInvalidTypeDetector",
"CreateAwsElastiCacheClusterPreviousTypeDetector",
"CreateAwsElastiCacheClusterDuplicateIDDetector",
"CreateAwsSecurityGroupDuplicateDetector",
"CreateAwsRouteInvalidRouteTableDetector",
"CreateAwsRouteNotSpecifiedTargetDetector",
"CreateAwsRouteSpecifiedMultipleTargetsDetector",
"CreateAwsRouteInvalidGatewayDetector",
"CreateAwsRouteInvalidEgressOnlyGatewayDetector",
"CreateAwsRouteInvalidNatGatewayDetector",
"CreateAwsRouteInvalidVpcPeeringConnectionDetector",
"CreateAwsRouteInvalidInstanceDetector",
"CreateAwsRouteInvalidNetworkInterfaceDetector",
"CreateAwsCloudWatchMetricAlarmInvalidUnitDetector",
"CreateTerraformModulePinnedSourceDetector",
}

func NewDetector(templates map[string]*ast.File, schema []*schema.Template, state *state.TFState, tfvars []*ast.File, c *config.Config) (*Detector, error) {
Expand All @@ -103,12 +103,7 @@ func NewDetector(templates map[string]*ast.File, schema []*schema.Template, stat

func (d *Detector) Detect() []*issue.Issue {
var issues = []*issue.Issue{}
for ruleName, creatorMethod := range detectors {
if d.Config.IgnoreRule[ruleName] {
d.Logger.Info(fmt.Sprintf("ignore rule `%s`", ruleName))
continue
}
d.Logger.Info(fmt.Sprintf("detect by `%s`", ruleName))
for _, creatorMethod := range detectorFactories {
d.detect(creatorMethod, &issues)

for _, template := range d.Schema {
Expand Down Expand Up @@ -142,15 +137,19 @@ func (d *Detector) HasError() bool {
func (d *Detector) detect(creatorMethod string, issues *[]*issue.Issue) {
creator := reflect.ValueOf(d).MethodByName(creatorMethod)
detector := creator.Call([]reflect.Value{})[0]
ruleName := reflect.Indirect(detector).FieldByName("Name").String()

if d.isSkip(
ruleName,
reflect.Indirect(detector).FieldByName("DeepCheck").Bool(),
reflect.Indirect(detector).FieldByName("TargetType").String(),
reflect.Indirect(detector).FieldByName("Target").String(),
) {
d.Logger.Info("skip this rule.")
d.Logger.Info(fmt.Sprintf("skip `%s`", ruleName))
return
}

d.Logger.Info(fmt.Sprintf("detect by `%s`", ruleName))
if preProcess := detector.MethodByName("PreProcess"); preProcess.IsValid() {
preProcess.Call([]reflect.Value{})
}
Expand Down Expand Up @@ -224,7 +223,11 @@ func (d *Detector) evalToStringTokens(t token.Token) ([]token.Token, error) {
return tokens, nil
}

func (d *Detector) isSkip(deepCheck bool, targetType string, target string) bool {
func (d *Detector) isSkip(name string, deepCheck bool, targetType string, target string) bool {
if d.Config.IgnoreRule[name] {
return true
}

if deepCheck && !d.Config.DeepCheck {
return true
}
Expand Down
19 changes: 15 additions & 4 deletions detector/detector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,7 @@ func TestDetect(t *testing.T) {
},
}

detectors = map[string]string{
"test_rule": "CreateTestDetector",
}
detectorFactories = []string{"CreateTestDetector"}

for _, tc := range cases {
prev, _ := filepath.Abs(".")
Expand Down Expand Up @@ -271,6 +269,7 @@ variable "array" {

func TestIsSkip(t *testing.T) {
type Input struct {
RuleName string
File string
DeepCheckMode bool
DeepCheckDetector bool
Expand All @@ -286,6 +285,7 @@ func TestIsSkip(t *testing.T) {
{
Name: "return false when enabled deep checking",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -300,6 +300,7 @@ resource "aws_instance" "web" {
{
Name: "return true when disabled deep checking",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -314,6 +315,7 @@ resource "aws_instance" "web" {
{
Name: "return false when disabled deep checking but not deep check detector",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -328,6 +330,7 @@ resource "aws_instance" "web" {
{
Name: "return false when enabled deep checking and not deep check detector",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -342,6 +345,7 @@ resource "aws_instance" "web" {
{
Name: "return true when target resources are not found",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -356,6 +360,7 @@ resource "aws_instance" "web" {
{
Name: "return false when modules are found",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
module "ec2_instance" {
source = "./ec2_instance"
Expand All @@ -369,6 +374,7 @@ module "ec2_instance" {
{
Name: "return true when target modules are not found",
Input: Input{
RuleName: "aws_instance_invalid_type",
File: `
resource "aws_instance" "web" {
ami = "ami-12345"
Expand All @@ -394,7 +400,12 @@ resource "aws_instance" "web" {
}
d.Config.DeepCheck = tc.Input.DeepCheckMode

result := d.isSkip(tc.Input.DeepCheckDetector, tc.Input.TargetType, tc.Input.Target)
result := d.isSkip(
tc.Input.RuleName,
tc.Input.DeepCheckDetector,
tc.Input.TargetType,
tc.Input.Target,
)
if result != tc.Result {
t.Fatalf("\nBad: %t\nExpected: %t\n\ntestcase: %s", result, tc.Result, tc.Name)
}
Expand Down
18 changes: 7 additions & 11 deletions detector/test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,16 @@ import (

type TestDetector struct {
*Detector
IssueType string
TargetType string
Target string
DeepCheck bool
}

func (d *Detector) CreateTestDetector() *TestDetector {
return &TestDetector{
Detector: d,
IssueType: "TEST",
TargetType: "resource",
Target: "aws_instance",
DeepCheck: false,
}
nd := &TestDetector{Detector: d}
nd.Name = "test_rule"
nd.IssueType = "TEST"
nd.TargetType = "resource"
nd.Target = "aws_instance"
nd.DeepCheck = false
return nd
}

func (d *TestDetector) Detect(resource *schema.Resource, issues *[]*issue.Issue) {
Expand Down

0 comments on commit 434d333

Please sign in to comment.