Skip to content

Commit

Permalink
Re-factoring aws ec2 source
Browse files Browse the repository at this point in the history
  • Loading branch information
shahariaazam committed Aug 16, 2023
1 parent 57d1af4 commit 17069c1
Showing 1 changed file with 23 additions and 54 deletions.
77 changes: 23 additions & 54 deletions pkg/source/scanner/aws_ec2.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@ package scanner

import (
"context"
"fmt"
"strings"

"github.com/shaharia-lab/teredix/pkg"
"github.com/shaharia-lab/teredix/pkg/resource"
"github.com/shaharia-lab/teredix/pkg/util"

"github.com/aws/aws-sdk-go-v2/service/ec2/types"

Expand Down Expand Up @@ -69,7 +66,13 @@ func (a *AWSEC2) Scan(resourceChannel chan resource.Resource) error {
// Loop through instances and their tags
for _, reservation := range resp.Reservations {
for _, instance := range reservation.Instances {
resourceChannel <- a.mapToResource(instance)
resourceChannel <- resource.Resource{
Name: *instance.InstanceId,
Kind: pkg.ResourceKindAWSEC2,
UUID: *instance.InstanceId,
ExternalID: *instance.InstanceId,
MetaData: a.getMetaData(instance),
}
}
}

Expand All @@ -83,6 +86,22 @@ func (a *AWSEC2) Scan(resourceChannel chan resource.Resource) error {
return nil
}

func (a *AWSEC2) getMetaData(instance types.Instance) []resource.MetaData {
mappings := map[string]func() string{
fieldInstanceID: func() string { return safeDereference(instance.InstanceId) },
fieldImageID: func() string { return safeDereference(instance.ImageId) },
fieldPrivateDNSName: func() string { return safeDereference(instance.PrivateDnsName) },
fieldInstanceType: func() string { return stringValueOrDefault(string(instance.InstanceType)) },
fieldArchitecture: func() string { return stringValueOrDefault(string(instance.Architecture)) },
fieldInstanceLifecycle: func() string { return stringValueOrDefault(string(instance.InstanceLifecycle)) },
fieldInstanceState: func() string { return stringValueOrDefault(string(instance.State.Name)) },
fieldVpcID: func() string { return safeDereference(instance.VpcId) },
}
return NewFieldMapper(mappings, func() []types.Tag {
return instance.Tags
}, a.Fields).getResourceMetaData()
}

func (a *AWSEC2) makeAPICallToAWS(nextToken string) (*ec2.DescribeInstancesOutput, error) {
// Describe instances for current page
params := &ec2.DescribeInstancesInput{
Expand Down Expand Up @@ -112,53 +131,3 @@ func (a *AWSEC2) makeAPICallToAWS(nextToken string) (*ec2.DescribeInstancesOutpu
}
return resp, nil
}

func (a *AWSEC2) mapToResource(instance types.Instance) resource.Resource {
var repoMeta []resource.MetaData
for _, mapper := range a.fieldMapper(instance) {
if util.IsFieldExistsInConfig(mapper.field, a.Fields) || strings.Contains(mapper.field, "tag_") {
val := mapper.value()
if val != "" {
repoMeta = append(repoMeta, resource.MetaData{Key: mapper.field, Value: val})
}
}
}

return resource.Resource{
Name: *instance.InstanceId,
Kind: pkg.ResourceKindAWSEC2,
UUID: *instance.InstanceId,
ExternalID: *instance.InstanceId,
MetaData: repoMeta,
}
}

func (a *AWSEC2) fieldMapper(instance types.Instance) []MetaDataMapper {
var fieldMapper []MetaDataMapper

mappings := map[string]func() string{
fieldInstanceID: func() string { return safeDereference(instance.InstanceId) },
fieldImageID: func() string { return safeDereference(instance.ImageId) },
fieldPrivateDNSName: func() string { return safeDereference(instance.PrivateDnsName) },
fieldInstanceType: func() string { return stringValueOrDefault(string(instance.InstanceType)) },
fieldArchitecture: func() string { return stringValueOrDefault(string(instance.Architecture)) },
fieldInstanceLifecycle: func() string { return stringValueOrDefault(string(instance.InstanceLifecycle)) },
fieldInstanceState: func() string { return stringValueOrDefault(string(instance.State.Name)) },
fieldVpcID: func() string { return safeDereference(instance.VpcId) },
}

for field, fn := range mappings {
fieldMapper = append(fieldMapper, MetaDataMapper{field: field, value: fn})
}

if util.IsFieldExistsInConfig(fieldTags, a.Fields) {
for _, tag := range instance.Tags {
fieldMapper = append(fieldMapper, MetaDataMapper{
field: fmt.Sprintf("tag_%s", safeDereference(tag.Key)),
value: func() string { return safeDereference(tag.Value) },
})
}
}

return fieldMapper
}

0 comments on commit 17069c1

Please sign in to comment.