Skip to content

Commit

Permalink
Cleanup aws-janitor part 2
Browse files Browse the repository at this point in the history
Signed-off-by: Vince Prignano <[email protected]>

Update AWS SDK and Bazel

Signed-off-by: Vince Prignano <[email protected]>

Run update-deps

Signed-off-by: Vince Prignano <[email protected]>
  • Loading branch information
vincepri committed Jan 31, 2019
1 parent ab01551 commit 1a069bd
Show file tree
Hide file tree
Showing 35 changed files with 3,768 additions and 247 deletions.
1,738 changes: 1,738 additions & 0 deletions Gopkg.lock

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ go_repository(
go_repository(
name = "com_github_aws_aws_sdk_go",
importpath = "github.com/aws/aws-sdk-go",
tag = "v1.16.18",
tag = "v1.16.22",
)

go_repository(
Expand Down Expand Up @@ -1509,3 +1509,9 @@ go_repository(
importpath = "go.uber.org/zap",
tag = "v1.9.1",
)

go_repository(
name = "io_k8s_klog",
importpath = "k8s.io/klog",
tag = "v0.1.0",
)
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/andygrunwald/go-gerrit v0.0.0-20171029143327-95b11af228a1
github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe
github.com/aws/aws-sdk-go v1.16.18
github.com/aws/aws-sdk-go v1.16.22
github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e
github.com/bwmarrin/snowflake v0.0.0-20170221160716-02cc386c183a
github.com/deckarep/golang-set v0.0.0-20171013212420-1d4478f51bed
Expand Down Expand Up @@ -90,6 +90,7 @@ require (
k8s.io/apiextensions-apiserver v0.0.0-20181128195303-1f84094d7e8e
k8s.io/apimachinery v0.0.0-20181128191346-49ce2735e507
k8s.io/client-go v9.0.0+incompatible
k8s.io/klog v0.1.0
k8s.io/kube-openapi v0.0.0-20180711000925-0cf8f7e6ed1d // indirect
sigs.k8s.io/yaml v1.1.0
vbom.ml/util v0.0.0-20170409195630-256737ac55c4
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe h1:B7prfUXk9GHn
github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe/go.mod h1:1ADF5tAtU1/mVtfMcHAYSm2fPw71DA7fFk0yed64/0I=
github.com/aws/aws-sdk-go v1.16.18 h1:ZXmG9Uexu2f2kKK0Onlod3Hl4X77qQvCGx2725fSubI=
github.com/aws/aws-sdk-go v1.16.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.16.22 h1:9wop6aMrfW/bLaW+p/tNMfmeDmvErKXHqakSPqyYrHA=
github.com/aws/aws-sdk-go v1.16.22/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e h1:VuTBHPJNCQ88Okm9ld5SyLCvU50soWJYQYjQFdcDxew=
github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
Expand Down Expand Up @@ -316,6 +318,8 @@ k8s.io/apimachinery v0.0.0-20181128191346-49ce2735e507 h1:DRtb2PO1ps3SPBkAUYz9J+
k8s.io/apimachinery v0.0.0-20181128191346-49ce2735e507/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0=
k8s.io/client-go v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A=
k8s.io/client-go v9.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
k8s.io/klog v0.1.0 h1:I5HMfc/DtuVaGR1KPwUrTc476K8NCqNBldC7H4dYEzk=
k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/kube-openapi v0.0.0-20180711000925-0cf8f7e6ed1d h1:mn2F9UzCk6KGa7M/d2ibLyRtBQm7n6QvbCjDe/cDWSg=
k8s.io/kube-openapi v0.0.0-20180711000925-0cf8f7e6ed1d/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
k8s.io/test-infra v0.0.0-20181019233642-2e10a0bbe9b3/go.mod h1:2NzXB13Ji0nqpyublHeiPC4FZwU0TknfvyaaNfl/BTA=
Expand Down
2 changes: 1 addition & 1 deletion maintenance/aws-janitor/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ go_library(
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library",
"//vendor/github.com/golang/glog:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
],
)

Expand Down
40 changes: 26 additions & 14 deletions maintenance/aws-janitor/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,42 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/golang/glog"
"k8s.io/klog"
"k8s.io/test-infra/maintenance/aws-janitor/account"
"k8s.io/test-infra/maintenance/aws-janitor/resources"
s3path "k8s.io/test-infra/maintenance/aws-janitor/s3"
)

const defaultRegion = "us-east-1"
const (
defaultRegion = "us-east-1"
)

var maxTTL = flag.Duration("ttl", 24*time.Hour, "Maximum time before we attempt deletion of a resource. Set to 0s to nuke all non-default resources.")
var path = flag.String("path", "", "S3 path to store mark data in (required)")
var (
maxTTL = flag.Duration("ttl", 24*time.Hour, "Maximum time before we attempt deletion of a resource. Set to 0s to nuke all non-default resources.")
path = flag.String("path", "", "S3 path to store mark data in (required)")
)

func getRegions(sess *session.Session) ([]string, error) {
var regions []string
svc := ec2.New(sess, &aws.Config{Region: aws.String(defaultRegion)})

resp, err := svc.DescribeRegions(nil)
if err != nil {
return nil, err
}

var regions []string
for _, region := range resp.Regions {
regions = append(regions, *region.RegionName)
}

return regions, nil
}

func main() {
klog.InitFlags(nil)
flag.Lookup("logtostderr").Value.Set("true")
flag.Parse()
defer klog.Flush()

// Retry aggressively (with default back-off). If the account is
// in a really bad state, we may be contending with API rate
Expand All @@ -60,43 +69,46 @@ func main() {

s3p, err := s3path.GetPath(sess, *path)
if err != nil {
glog.Fatalf("--path %q isn't a valid S3 path: %v", *path, err)
klog.Fatalf("--path %q isn't a valid S3 path: %v", *path, err)
}
acct, err := account.GetAccount(sess, defaultRegion)
if err != nil {
glog.Fatalf("error getting current user: %v", err)
klog.Fatalf("Error getting current user: %v", err)
}
glog.V(1).Infof("account: %s", acct)
klog.Infof("Account: %s", acct)

regions, err := getRegions(sess)
if err != nil {
glog.Fatalf("error getting available regions: %v", err)
klog.Fatalf("Error getting available regions: %v", err)
}
glog.V(1).Infof("regions: %v", regions)
klog.Infof("Regions: %+v", regions)

res, err := resources.LoadSet(sess, s3p, *maxTTL)
if err != nil {
glog.Fatalf("error loading %q: %v", *path, err)
klog.Fatalf("Error loading %q: %v", *path, err)
}

for _, region := range regions {
for _, typ := range resources.RegionalTypeList {
if err := typ.MarkAndSweep(sess, acct, region, res); err != nil {
glog.Errorf("error sweeping %T: %v", typ, err)
klog.Errorf("Error sweeping %T: %v", typ, err)
return
}
}
}

for _, typ := range resources.GlobalTypeList {
if err := typ.MarkAndSweep(sess, acct, "us-east-1", res); err != nil {
glog.Errorf("error sweeping %T: %v", typ, err)
klog.Errorf("Error sweeping %T: %v", typ, err)
return
}
}

swept := res.MarkComplete()
if err := res.Save(sess, s3p); err != nil {
glog.Fatalf("error saving %q: %v", *path, err)
klog.Fatalf("Error saving %q: %v", *path, err)
}

if swept > 0 {
os.Exit(1)
}
Expand Down
1 change: 1 addition & 0 deletions maintenance/aws-janitor/resources/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ go_library(
"//vendor/github.com/aws/aws-sdk-go/service/s3:go_default_library",
"//vendor/github.com/golang/glog:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
],
)

Expand Down
12 changes: 7 additions & 5 deletions maintenance/aws-janitor/resources/addresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/golang/glog"
"github.com/pkg/errors"
"k8s.io/klog"
)

// Elastic IPs: https://docs.aws.amazon.com/sdk-for-go/api/service/ec2/#EC2.DescribeAddresses
Expand All @@ -42,17 +42,19 @@ func (Addresses) MarkAndSweep(sess *session.Session, acct string, region string,
for _, addr := range resp.Addresses {
a := &address{Account: acct, Region: region, ID: *addr.AllocationId}
if set.Mark(a) {
glog.Warningf("%s: deleting %T: %v", a.ARN(), addr, addr)
klog.Warningf("%s: deleting %T: %v", a.ARN(), addr, addr)

if addr.AssociationId != nil {
glog.Warningf("%s: disassociating %T from active instance", a.ARN(), addr)
klog.Warningf("%s: disassociating %T from active instance", a.ARN(), addr)
_, err := svc.DisassociateAddress(&ec2.DisassociateAddressInput{AssociationId: addr.AssociationId})
if err != nil {
glog.Warningf("%s: disassociating %T failed: %v", a.ARN(), addr, err)
klog.Warningf("%s: disassociating %T failed: %v", a.ARN(), addr, err)
}
}

_, err := svc.ReleaseAddress(&ec2.ReleaseAddressInput{AllocationId: addr.AllocationId})
if err != nil {
glog.Warningf("%v: delete failed: %v", a.ARN(), err)
klog.Warningf("%v: delete failed: %v", a.ARN(), err)
}
}
}
Expand Down
43 changes: 25 additions & 18 deletions maintenance/aws-janitor/resources/asg.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/autoscaling"
"github.com/golang/glog"
"github.com/pkg/errors"
"k8s.io/klog"
)

// AutoScalingGroups: https://docs.aws.amazon.com/sdk-for-go/api/service/autoscaling/#AutoScaling.DescribeAutoScalingGroups
Expand All @@ -34,41 +34,48 @@ func (AutoScalingGroups) MarkAndSweep(sess *session.Session, acct string, region
svc := autoscaling.New(sess, &aws.Config{Region: aws.String(region)})

var toDelete []*autoScalingGroup // Paged call, defer deletion until we have the whole list.
if err := svc.DescribeAutoScalingGroupsPages(nil, func(page *autoscaling.DescribeAutoScalingGroupsOutput, _ bool) bool {

pageFunc := func(page *autoscaling.DescribeAutoScalingGroupsOutput, _ bool) bool {
for _, asg := range page.AutoScalingGroups {
a := &autoScalingGroup{ID: *asg.AutoScalingGroupARN, Name: *asg.AutoScalingGroupName}
if set.Mark(a) {
glog.Warningf("%s: deleting %T: %v", a.ARN(), asg, asg)
klog.Warningf("%s: deleting %T: %v", a.ARN(), asg, asg)
toDelete = append(toDelete, a)
}
}
return true
}); err != nil {
}

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

for _, asg := range toDelete {
_, err := svc.DeleteAutoScalingGroup(
&autoscaling.DeleteAutoScalingGroupInput{
AutoScalingGroupName: aws.String(asg.Name),
ForceDelete: aws.Bool(true),
})
if err != nil {
glog.Warningf("%v: delete failed: %v", asg.ARN(), err)
deleteInput := &autoscaling.DeleteAutoScalingGroupInput{
AutoScalingGroupName: aws.String(asg.Name),
ForceDelete: aws.Bool(true),
}

if _, err := svc.DeleteAutoScalingGroup(deleteInput); err != nil {
klog.Warningf("%v: delete failed: %v", asg.ARN(), err)
}
}

// Block on ASGs finishing deletion. There are a lot of dependent
// resources, so this just makes the rest go more smoothly (and
// prevents a second pass).
for _, asg := range toDelete {
glog.Warningf("%v: waiting for delete", asg.ARN())
err := svc.WaitUntilGroupNotExists(
&autoscaling.DescribeAutoScalingGroupsInput{
AutoScalingGroupNames: []*string{aws.String(asg.Name)},
})
if err != nil {
glog.Warningf("%v: wait failed: %v", asg.ARN(), err)
klog.Warningf("%v: waiting for delete", asg.ARN())

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

if err := svc.WaitUntilGroupNotExists(describeInput); err != nil {
klog.Warningf("%v: wait failed: %v", asg.ARN(), err)
}
}

return nil
}

Expand Down
29 changes: 20 additions & 9 deletions maintenance/aws-janitor/resources/dhcp_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/golang/glog"
"github.com/pkg/errors"
"k8s.io/klog"
)

// DHCPOptions: https://docs.aws.amazon.com/sdk-for-go/api/service/ec2/#EC2.DescribeDhcpOptions
Expand All @@ -48,6 +48,7 @@ func (DHCPOptions) MarkAndSweep(sess *session.Session, acct string, region strin
if err != nil {
return err
}

for _, vpc := range resp.Vpcs {
defaultRefs[*vpc.DhcpOptionsId] = true
}
Expand All @@ -63,23 +64,27 @@ func (DHCPOptions) MarkAndSweep(sess *session.Session, acct string, region strin
if defaultRefs[*dhcp.DhcpOptionsId] {
continue
}

// Separately, skip any "default looking" DHCP Option Sets. See comment below.
if defaultLookingDHCPOptions(dhcp, region) {
defaults = append(defaults, *dhcp.DhcpOptionsId)
continue
}

dh := &dhcpOption{Account: acct, Region: region, ID: *dhcp.DhcpOptionsId}
if set.Mark(dh) {
glog.Warningf("%s: deleting %T: %v", dh.ARN(), dhcp, dhcp)
_, err := svc.DeleteDhcpOptions(&ec2.DeleteDhcpOptionsInput{DhcpOptionsId: dhcp.DhcpOptionsId})
if err != nil {
glog.Warningf("%v: delete failed: %v", dh.ARN(), err)
klog.Warningf("%s: deleting %T: %v", dh.ARN(), dhcp, dhcp)

if _, err := svc.DeleteDhcpOptions(&ec2.DeleteDhcpOptionsInput{DhcpOptionsId: dhcp.DhcpOptionsId}); err != nil {
klog.Warningf("%v: delete failed: %v", dh.ARN(), err)
}
}
}

if len(defaults) > 1 {
glog.Errorf("Found more than one default-looking DHCP option set: %v", defaults)
klog.Errorf("Found more than one default-looking DHCP option set: %v", defaults)
}

return nil
}

Expand Down Expand Up @@ -121,25 +126,31 @@ func defaultLookingDHCPOptions(dhcp *ec2.DhcpOptions, region string) bool {
if len(dhcp.Tags) != 0 {
return false
}

for _, conf := range dhcp.DhcpConfigurations {
if *conf.Key == "domain-name" {
switch *conf.Key {
case "domain-name":
var domain string
if region == "us-east-1" {
domain = "ec2.internal"
} else {
domain = region + ".compute.internal"
}

// TODO(vincepri): Investigate this line, seems it might segfault if conf.Values is 0?
if len(conf.Values) != 1 || *conf.Values[0].Value != domain {
return false
}
} else if *conf.Key == "domain-name-servers" {
case "domain-name-servers":
// TODO(vincepri): Same as above.
if len(conf.Values) != 1 || *conf.Values[0].Value != "AmazonProvidedDNS" {
return false
}
} else {
default:
return false
}
}

return true
}

Expand Down
Loading

0 comments on commit 1a069bd

Please sign in to comment.