Skip to content

Commit

Permalink
Stop passing logger between functions
Browse files Browse the repository at this point in the history
  • Loading branch information
MeNsaaH committed Dec 4, 2020
1 parent aaff4e8 commit f41b76b
Show file tree
Hide file tree
Showing 12 changed files with 135 additions and 79 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 20,7 @@ This tool is **HIGHLY DESTRUCTIVE** and can deletes all resources! This should b
- [ ] Allow authentication username and password set in config file
- [ ] Create Kubernetes Manifests and Helm Charts
- [ ] Create CLI
- [ ] Save infra state and desired state in persistent storage

#### Supported Resources
- AWS: https://github.com/MeNsaaH/reka/issues/1
Expand Down
25 changes: 12 additions & 13 deletions provider/aws/ec2.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 7,15 @@ import (

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
log "github.com/sirupsen/logrus"

"github.com/mensaah/reka/provider/aws/utils"
"github.com/mensaah/reka/resource"
)

// returns only instance IDs of unprotected ec2 instances
func getInstanceDetails(svc *ec2.Client, output *ec2.DescribeInstancesOutput, region string, logger *log.Entry) ([]*resource.Resource, error) {
func getInstanceDetails(svc *ec2.Client, output *ec2.DescribeInstancesOutput, region string) ([]*resource.Resource, error) {
var ec2Instances []*resource.Resource
logger.Debug("Fetching EC2 Details")
ec2Logger.Debug("Fetching EC2 Details")
for _, reservation := range output.Reservations {
for _, instance := range reservation.Instances {
// https://stackoverflow.com/a/48554123/7167357
Expand All @@ -40,8 39,8 @@ func getInstanceDetails(svc *ec2.Client, output *ec2.DescribeInstancesOutput, re
}

// GetAllEC2Instances Get all instances
func GetAllEC2Instances(cfg aws.Config, logger *log.Entry) ([]*resource.Resource, error) {
logger.Debug("Fetching EC2 Instances")
func GetAllEC2Instances(cfg aws.Config) ([]*resource.Resource, error) {
ec2Logger.Debug("Fetching EC2 Instances")

svc := ec2.NewFromConfig(cfg)
params := &ec2.DescribeInstancesInput{}
Expand All @@ -52,16 51,16 @@ func GetAllEC2Instances(cfg aws.Config, logger *log.Entry) ([]*resource.Resource
if err != nil {
return nil, err
}
instances, err := getInstanceDetails(svc, resp, cfg.Region, logger)
instances, err := getInstanceDetails(svc, resp, cfg.Region)
if err != nil {
return nil, err
}
logger.Debugf("Found %d EC2 instances", len(instances))
ec2Logger.Debugf("Found %d EC2 instances", len(instances))
return instances, nil
}

// StopEC2Instances Stop Running Instances
func StopEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *log.Entry) error {
func StopEC2Instances(cfg aws.Config, instances []*resource.Resource) error {
svc := ec2.NewFromConfig(cfg)
var instanceIds []*string

Expand All @@ -75,7 74,7 @@ func StopEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *lo
return nil
}

logger.Debug("Stopping EC2 Instances ", instanceIds, " ...")
ec2Logger.Debug("Stopping EC2 Instances ", instanceIds, " ...")

params := &ec2.StopInstancesInput{
InstanceIds: instanceIds,
Expand All @@ -90,7 89,7 @@ func StopEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *lo
}

// ResumeEC2Instances Resume Stopped instances
func ResumeEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *log.Entry) error {
func ResumeEC2Instances(cfg aws.Config, instances []*resource.Resource) error {
svc := ec2.NewFromConfig(cfg)
var instanceIds []*string

Expand All @@ -107,7 106,7 @@ func ResumeEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *
params := &ec2.StartInstancesInput{
InstanceIds: instanceIds,
}
logger.Debug("Starting EC2 Instances ", instanceIds, " ...")
ec2Logger.Debug("Starting EC2 Instances ", instanceIds, " ...")

resp, err := svc.StartInstances(context.Background(), params)
// TODO Attach error to specific instance where the error occurred if possible
Expand All @@ -118,7 117,7 @@ func ResumeEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *
}

// TerminateEC2Instances Shutdown instances
func TerminateEC2Instances(cfg aws.Config, instances []*resource.Resource, logger *log.Entry) error {
func TerminateEC2Instances(cfg aws.Config, instances []*resource.Resource) error {
svc := ec2.NewFromConfig(cfg)
var instanceIds []*string

Expand All @@ -132,7 131,7 @@ func TerminateEC2Instances(cfg aws.Config, instances []*resource.Resource, logge
return nil
}

logger.Debug("Terminating EC2 Instances ", instanceIds, " ...")
ec2Logger.Debug("Terminating EC2 Instances ", instanceIds, " ...")

params := &ec2.TerminateInstancesInput{
InstanceIds: instanceIds,
Expand Down
14 changes: 9 additions & 5 deletions provider/aws/ec2_types.go
Original file line number Diff line number Diff line change
@@ -1,6 1,8 @@
package aws

import (
log "github.com/sirupsen/logrus"

"github.com/mensaah/reka/config"
"github.com/mensaah/reka/resource"
)
Expand All @@ -14,25 16,27 @@ const (
ec2LongName = "Elastic Compute Cloud"
)

var ec2Logger *log.Entry

func newEC2Manager(cfg *config.Config, logPath string) resource.Manager {
logger := config.GetLogger(ec2Name, logPath)
ec2Logger = config.GetLogger(ec2Name, logPath)

ec2Manager = resource.Manager{
Name: ec2Name,
LongName: ec2LongName,
Config: cfg,
Logger: logger,
GetAll: func() ([]*resource.Resource, error) {
return GetAllEC2Instances(*cfg.Aws, logger)
return GetAllEC2Instances(*cfg.Aws)
},
Destroy: func(resources []*resource.Resource) error {
return TerminateEC2Instances(*cfg.Aws, resources, logger)
return TerminateEC2Instances(*cfg.Aws, resources)
},
Stop: func(resources []*resource.Resource) error {
return StopEC2Instances(*cfg.Aws, resources, logger)
return StopEC2Instances(*cfg.Aws, resources)
},
Resume: func(resources []*resource.Resource) error {
return ResumeEC2Instances(*cfg.Aws, resources, logger)
return ResumeEC2Instances(*cfg.Aws, resources)
},
}
return ec2Manager
Expand Down
41 changes: 23 additions & 18 deletions provider/aws/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 16,7 @@ import (
"github.com/mensaah/reka/resource"
)

func getS3BucketRegion(cfg aws.Config, bucketName string, logger *log.Entry) (string, error) {
func getS3BucketRegion(cfg aws.Config, bucketName string) (string, error) {

region, err := s3manager.GetBucketRegion(context.Background(), s3.NewFromConfig(cfg), bucketName)
if err != nil {
Expand All @@ -28,12 28,12 @@ func getS3BucketRegion(cfg aws.Config, bucketName string, logger *log.Entry) (st
}
return "", err
}
logger.Debugf("Bucket %s is in %s region\n", bucketName, region)
s3Logger.Debugf("Bucket %s is in %s region\n", bucketName, region)
return region, err
}

func getS3BucketTags(svc *s3.Client, bucketName string, logger *log.Entry) (resource.Tags, error) {
logger.Debug("Fetching S3 Tags")
func getS3BucketTags(svc *s3.Client, bucketName string) (resource.Tags, error) {
s3Logger.Debug("Fetching S3 Tags")
input := &s3.GetBucketTaggingInput{
Bucket: aws.String(bucketName),
}
Expand All @@ -48,19 48,19 @@ func getS3BucketTags(svc *s3.Client, bucketName string, logger *log.Entry) (reso
}

// returns only s3Bucket IDs of unprotected s3 instances
func getS3BucketsDetails(svc *s3.Client, cfg aws.Config, output *s3.ListBucketsOutput, logger *log.Entry) ([]*resource.Resource, error) {
func getS3BucketsDetails(svc *s3.Client, cfg aws.Config, output *s3.ListBucketsOutput) ([]*resource.Resource, error) {
var s3Buckets []*resource.Resource
for _, s3Bucket := range output.Buckets {
// Get tags
tags, err := getS3BucketTags(svc, *s3Bucket.Name, logger)
tags, err := getS3BucketTags(svc, *s3Bucket.Name)
if err != nil {
logger.Error(err)
s3Logger.Error(err)
}
tags["creation-date"] = (*s3Bucket.CreationDate).String()
// Get region
s3Region, err := getS3BucketRegion(cfg, *s3Bucket.Name, logger)
s3Region, err := getS3BucketRegion(cfg, *s3Bucket.Name)
if err != nil {
logger.Errorf("Could not get region for Bucket %s", *s3Bucket.Name)
s3Logger.Errorf("Could not get region for Bucket %s", *s3Bucket.Name)
continue
}
s3 := NewResource(*s3Bucket.Name, s3Name)
Expand All @@ -72,14 72,14 @@ func getS3BucketsDetails(svc *s3.Client, cfg aws.Config, output *s3.ListBucketsO
s3Buckets = append(s3Buckets, s3)
}

logger.Debugf("Found %d buckets", len(s3Buckets))
s3Logger.Debugf("Found %d buckets", len(s3Buckets))

return s3Buckets, nil
}

// GetAllS3Buckets Get all s3Buckets
func getAllS3Buckets(cfg aws.Config, logger *log.Entry) ([]*resource.Resource, error) {
logger.Debug("Fetching S3 Buckets")
func getAllS3Buckets(cfg aws.Config) ([]*resource.Resource, error) {
s3Logger.Debug("Fetching S3 Buckets")
svc := s3.NewFromConfig(cfg)
params := &s3.ListBucketsInput{}

Expand All @@ -88,15 88,20 @@ func getAllS3Buckets(cfg aws.Config, logger *log.Entry) ([]*resource.Resource, e
if err != nil {
return nil, err
}
buckets, err := getS3BucketsDetails(svc, cfg, resp, logger)
buckets, err := getS3BucketsDetails(svc, cfg, resp)
if err != nil {
return nil, err
}
return buckets, nil
}

// Empties a Bucket
func emptyBucket(svc *s3.Client, bucket *resource.Resource) error {
return nil
}

// Destroys a Single Bucket
func destroyBucket(svc *s3.Client, bucket *resource.Resource, logger *log.Entry) error {
func destroyBucket(svc *s3.Client, bucket *resource.Resource) error {
input := &s3.DeleteBucketInput{
Bucket: aws.String(bucket.UUID),
}
Expand All @@ -109,7 114,7 @@ func destroyBucket(svc *s3.Client, bucket *resource.Resource, logger *log.Entry)
return nil
}

func destroyS3Buckets(cfg aws.Config, s3Buckets []*resource.Resource, logger *log.Entry) error {
func destroyS3Buckets(cfg aws.Config, s3Buckets []*resource.Resource) error {
bucketsPerRegion := make(map[string][]*resource.Resource)
delCount := 0
if len(s3Buckets) <= 0 {
Expand All @@ -126,15 131,15 @@ func destroyS3Buckets(cfg aws.Config, s3Buckets []*resource.Resource, logger *lo
options.Region = region
})
for _, bucket := range buckets {
err := destroyBucket(svc, bucket, logger)
err := destroyBucket(svc, bucket)
if err != nil {
logger.Errorf("Failed to delete Bucket %d - Error %s ", bucket.ID, err.Error())
s3Logger.Errorf("Failed to delete Bucket %d - Error %s ", bucket.ID, err.Error())
bucket.DestroyError = err
} else {
delCount
}
}
}
logger.Infof("Destroyed %d S3 buckets", delCount)
s3Logger.Infof("Destroyed %d S3 buckets", delCount)
return nil
}
10 changes: 7 additions & 3 deletions provider/aws/s3_types.go
Original file line number Diff line number Diff line change
@@ -1,6 1,8 @@
package aws

import (
log "github.com/sirupsen/logrus"

"github.com/mensaah/reka/config"
"github.com/mensaah/reka/resource"
)
Expand All @@ -12,20 14,22 @@ const (
s3LongName = "Simple Storage Service"
)

var s3Logger *log.Entry

func newS3Manager(cfg *config.Config, logPath string) resource.Manager {

logger := config.GetLogger(s3Name, logPath)
s3Logger = config.GetLogger(s3Name, logPath)

return resource.Manager{
Name: s3Name,
LongName: s3LongName,
Config: cfg,
Logger: logger,
GetAll: func() ([]*resource.Resource, error) {
return getAllS3Buckets(*cfg.Aws, logger)
return getAllS3Buckets(*cfg.Aws)
},
Destroy: func(resources []*resource.Resource) error {
return destroyS3Buckets(*cfg.Aws, resources, logger)
return destroyS3Buckets(*cfg.Aws, resources)
},
}
}
Loading

0 comments on commit f41b76b

Please sign in to comment.