Skip to content

Commit

Permalink
Merge pull request #197 from dims/move-from-aws-v1-to-aws-v2
Browse files Browse the repository at this point in the history
Move from AWS SDK v1 to v2
  • Loading branch information
k8s-ci-robot authored Jul 31, 2024
2 parents 210745d + 7555133 commit 1258e24
Show file tree
Hide file tree
Showing 45 changed files with 1,364 additions and 687 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ verify-boilerplate:
.PHONY: verify-lint
# TODO(ixdy): fix legacy errors and remove --new-from-rev
verify-lint: $(GOLANGCI_LINT)
./hack/tools/bin/golangci-lint run --timeout='2m0s' --max-issues-per-linter 0 --max-same-issues 0 -v --new-from-rev HEAD~
./hack/tools/bin/golangci-lint run --timeout='3m0s' --max-issues-per-linter 0 --max-same-issues 0 -v --new-from-rev HEAD~

.PHONY: verify-codegen
verify-codegen: $(CONTROLLER_GEN)
Expand Down
24 changes: 14 additions & 10 deletions aws-janitor/account/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,32 @@ limitations under the License.
package account

import (
"context"
"fmt"
"strings"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/sts"
aws2 "github.com/aws/aws-sdk-go-v2/aws"
iamv2 "github.com/aws/aws-sdk-go-v2/service/iam"
stsv2 "github.com/aws/aws-sdk-go-v2/service/sts"
)

func GetAccount(sess *session.Session, region string) (string, error) {
svc := iam.New(sess, &aws.Config{Region: aws.String(region)})
resp, err := svc.GetUser(nil)
func GetAccount(cfg aws2.Config, region string) (string, error) {
svc := iamv2.NewFromConfig(cfg, func(option *iamv2.Options) {
if region != "" {
option.Region = region
}
})
resp, err := svc.GetUser(context.TODO(), nil)
if err == nil {
arn, err := parseARN(*resp.User.Arn)
if err != nil {
return "", err
}
return arn.account, nil
}
svc2 := sts.New(sess)
input := &sts.GetCallerIdentityInput{}
result, err := svc2.GetCallerIdentity(input)
svc2 := stsv2.NewFromConfig(cfg)
input := &stsv2.GetCallerIdentityInput{}
result, err := svc2.GetCallerIdentity(context.TODO(), input)
if err != nil {
return "", err
}
Expand Down
19 changes: 11 additions & 8 deletions aws-janitor/regions/regions.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ limitations under the License.
package regions

import (
"context"
"fmt"
"os"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
aws2 "github.com/aws/aws-sdk-go-v2/aws"
ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2"

"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/util/sets"
)
Expand All @@ -37,10 +38,12 @@ func init() {
}

// GetAll retrieves all regions from the AWS API
func GetAll(sess *session.Session) ([]string, error) {
func GetAll(cfg *aws2.Config) ([]string, error) {
var regions []string
svc := ec2.New(sess, &aws.Config{Region: aws.String(Default)})
resp, err := svc.DescribeRegions(nil)
svc := ec2v2.NewFromConfig(*cfg, func(options *ec2v2.Options) {
options.Region = Default
})
resp, err := svc.DescribeRegions(context.TODO(), nil)
if err != nil {
return nil, err
}
Expand All @@ -51,8 +54,8 @@ func GetAll(sess *session.Session) ([]string, error) {
}

// ParseRegion checks whether the provided region is valid. If an empty region is provided, returns all valid regions.
func ParseRegion(sess *session.Session, region string) ([]string, error) {
all, err := GetAll(sess)
func ParseRegion(cfg *aws2.Config, region string) ([]string, error) {
all, err := GetAll(cfg)
if err != nil {
return nil, errors.Wrap(err, "failed retrieving list of regions")
}
Expand Down
21 changes: 13 additions & 8 deletions aws-janitor/resources/addresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ limitations under the License.
package resources

import (
"context"
"fmt"
"time"

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

"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
Expand All @@ -32,9 +33,11 @@ type Addresses struct{}

func (Addresses) MarkAndSweep(opts Options, set *Set) error {
logger := logrus.WithField("options", opts)
svc := ec2.New(opts.Session, aws.NewConfig().WithRegion(opts.Region))
svc := ec2v2.NewFromConfig(*opts.Config, func(opt *ec2v2.Options) {
opt.Region = opts.Region
})

resp, err := svc.DescribeAddresses(nil)
resp, err := svc.DescribeAddresses(context.TODO(), nil)
if err != nil {
return err
}
Expand All @@ -56,7 +59,7 @@ func (Addresses) MarkAndSweep(opts Options, set *Set) error {
if opts.DryRun {
continue
}
_, err := svc.ReleaseAddress(&ec2.ReleaseAddressInput{AllocationId: addr.AllocationId})
_, err := svc.ReleaseAddress(context.TODO(), &ec2v2.ReleaseAddressInput{AllocationId: addr.AllocationId})
if err != nil {
logger.Warningf("%s: delete failed: %v", a.ARN(), err)
}
Expand All @@ -65,11 +68,13 @@ func (Addresses) MarkAndSweep(opts Options, set *Set) error {
}

func (Addresses) ListAll(opts Options) (*Set, error) {
svc := ec2.New(opts.Session, aws.NewConfig().WithRegion(opts.Region))
svc := ec2v2.NewFromConfig(*opts.Config, func(opt *ec2v2.Options) {
opt.Region = opts.Region
})
set := NewSet(0)
inp := &ec2.DescribeAddressesInput{}
inp := &ec2v2.DescribeAddressesInput{}

addrs, err := svc.DescribeAddresses(inp)
addrs, err := svc.DescribeAddresses(context.TODO(), inp)
if err != nil {
return nil, errors.Wrapf(err, "couldn't describe EC2 addresses for %q in %q", opts.Account, opts.Region)
}
Expand Down
61 changes: 39 additions & 22 deletions aws-janitor/resources/asg.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ limitations under the License.
package resources

import (
"context"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/autoscaling"
aws2 "github.com/aws/aws-sdk-go-v2/aws"
autoscalingv2 "github.com/aws/aws-sdk-go-v2/service/autoscaling"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
Expand All @@ -31,15 +32,17 @@ type AutoScalingGroups struct{}

func (AutoScalingGroups) MarkAndSweep(opts Options, set *Set) error {
logger := logrus.WithField("options", opts)
svc := autoscaling.New(opts.Session, aws.NewConfig().WithRegion(opts.Region))
svc := autoscalingv2.NewFromConfig(*opts.Config, func(opt *autoscalingv2.Options) {
opt.Region = opts.Region
})

var toDelete []*autoScalingGroup // Paged call, defer deletion until we have the whole list.

pageFunc := func(page *autoscaling.DescribeAutoScalingGroupsOutput, _ bool) bool {
pageFunc := func(page *autoscalingv2.DescribeAutoScalingGroupsOutput, _ bool) bool {
for _, asg := range page.AutoScalingGroups {
a := &autoScalingGroup{
arn: aws.StringValue(asg.AutoScalingGroupARN),
name: aws.StringValue(asg.AutoScalingGroupName),
arn: *asg.AutoScalingGroupARN,
name: *asg.AutoScalingGroupName,
}
tags := make(Tags, len(asg.Tags))
for _, t := range asg.Tags {
Expand All @@ -57,17 +60,17 @@ func (AutoScalingGroups) MarkAndSweep(opts Options, set *Set) error {
return true
}

if err := svc.DescribeAutoScalingGroupsPages(&autoscaling.DescribeAutoScalingGroupsInput{}, pageFunc); err != nil {
if err := DescribeAutoScalingGroupsPages(svc, &autoscalingv2.DescribeAutoScalingGroupsInput{}, pageFunc); err != nil {
return err
}

for _, asg := range toDelete {
deleteInput := &autoscaling.DeleteAutoScalingGroupInput{
AutoScalingGroupName: aws.String(asg.name),
ForceDelete: aws.Bool(true),
deleteInput := &autoscalingv2.DeleteAutoScalingGroupInput{
AutoScalingGroupName: aws2.String(asg.name),
ForceDelete: aws2.Bool(true),
}

if _, err := svc.DeleteAutoScalingGroup(deleteInput); err != nil {
if _, err := svc.DeleteAutoScalingGroup(context.TODO(), deleteInput); err != nil {
logger.Warningf("%s: delete failed: %v", asg.ARN(), err)
}
}
Expand All @@ -77,30 +80,44 @@ func (AutoScalingGroups) MarkAndSweep(opts Options, set *Set) error {
// prevents a second pass).
for _, asg := range toDelete {
logger.Warningf("%s: waiting for delete", asg.ARN())

describeInput := &autoscaling.DescribeAutoScalingGroupsInput{
AutoScalingGroupNames: []*string{aws.String(asg.name)},
}

if err := svc.WaitUntilGroupNotExists(describeInput); err != nil {
waiter := autoscalingv2.NewGroupNotExistsWaiter(svc)
if err := waiter.Wait(context.TODO(), &autoscalingv2.DescribeAutoScalingGroupsInput{
AutoScalingGroupNames: []string{asg.name},
}, 5*time.Minute); err != nil {
logger.Warningf("%s: wait failed: %v", asg.ARN(), err)
}
}

return nil
}

func DescribeAutoScalingGroupsPages(svc *autoscalingv2.Client, input *autoscalingv2.DescribeAutoScalingGroupsInput, pageFunc func(page *autoscalingv2.DescribeAutoScalingGroupsOutput, _ bool) bool) error {
paginator := autoscalingv2.NewDescribeAutoScalingGroupsPaginator(svc, input)

for paginator.HasMorePages() {
page, err := paginator.NextPage(context.TODO())
if err != nil {
logrus.Warningf("failed to get page, %v", err)
} else {
pageFunc(page, false)
}
}
return nil
}

func (AutoScalingGroups) ListAll(opts Options) (*Set, error) {
c := autoscaling.New(opts.Session, aws.NewConfig().WithRegion(opts.Region))
svc := autoscalingv2.NewFromConfig(*opts.Config, func(opt *autoscalingv2.Options) {
opt.Region = opts.Region
})
set := NewSet(0)
input := &autoscaling.DescribeAutoScalingGroupsInput{}
input := &autoscalingv2.DescribeAutoScalingGroupsInput{}

err := c.DescribeAutoScalingGroupsPages(input, func(asgs *autoscaling.DescribeAutoScalingGroupsOutput, isLast bool) bool {
err := DescribeAutoScalingGroupsPages(svc, input, func(asgs *autoscalingv2.DescribeAutoScalingGroupsOutput, isLast bool) bool {
now := time.Now()
for _, asg := range asgs.AutoScalingGroups {
arn := autoScalingGroup{
arn: aws.StringValue(asg.AutoScalingGroupARN),
name: aws.StringValue(asg.AutoScalingGroupName),
arn: *asg.AutoScalingGroupARN,
name: *asg.AutoScalingGroupName,
}.ARN()
set.firstSeen[arn] = now
}
Expand Down
5 changes: 3 additions & 2 deletions aws-janitor/resources/clean.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,17 @@ import (
"strings"

"github.com/aws/aws-sdk-go/aws/awserr"

"github.com/pkg/errors"
"github.com/sirupsen/logrus"
kerrors "k8s.io/apimachinery/pkg/util/errors"
"sigs.k8s.io/boskos/aws-janitor/regions"
)

// CleanAll cleans all of the resources for all of the regions visible to
// the provided AWS session.
// the provided AWS config.
func CleanAll(opts Options, region string) error {
regionList, err := regions.ParseRegion(opts.Session, region)
regionList, err := regions.ParseRegion(opts.Config, region)
if err != nil {
return err
}
Expand Down
Loading

0 comments on commit 1258e24

Please sign in to comment.