Skip to content
This repository has been archived by the owner on Jan 10, 2023. It is now read-only.

Commit

Permalink
Merge pull request #166 from Netflix/fix-globalgc
Browse files Browse the repository at this point in the history
Switch to filtering DescribeNetworkInterfaces based on AZs, not VPCs
  • Loading branch information
sargun committed Aug 17, 2018
2 parents dfa6926 + 5a4df9b commit b5c334d
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 3 deletions.
9 changes: 9 additions & 0 deletions vpc/ec2wrapper/ec2metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,15 @@ func (mdc *EC2MetadataClientWrapper) InstanceID() (string, error) {

}

// AvailabilityZone returns the qualified availability zone of the instance
func (mdc *EC2MetadataClientWrapper) AvailabilityZone() (string, error) {
val, err := mdc.getMetadata("placement/availability-zone")
if err != nil {
return "", err
}
return strings.TrimSpace(val), nil
}

// Interfaces returns a map of mac addresses to interfaces
func (mdc *EC2MetadataClientWrapper) Interfaces() (map[string]EC2NetworkInterface, error) {
ret := make(map[string]EC2NetworkInterface)
Expand Down
55 changes: 52 additions & 3 deletions vpc/globalgc/globalgc.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,29 +55,78 @@ func globalGc(parentCtx *context.VPCContext) error {
return nil
}

func getBaseFilter(vpcID string) []*ec2.Filter {
func getBaseFilter(vpcID, az string) []*ec2.Filter {
filters := []*ec2.Filter{
{
Name: aws.String("description"),
Values: aws.StringSlice([]string{setup.NetworkInterfaceDescription}),
},
{
Name: aws.String("availability-zone"),
Values: aws.StringSlice([]string{az}),
},
}

/* We don't filter on VPC here, because VPC filters make the call fail "reliably"
if vpcID != "" {
filter := ec2.Filter{
Name: aws.String("vpc-id"),
Values: aws.StringSlice([]string{vpcID}),
}
filters = append(filters, &filter)
}
*/
return filters
}

func getAvailabilityZones(parentCtx *context.VPCContext) ([]string, error) {
ec2Client := ec2.New(parentCtx.AWSSession)
myAz, err := parentCtx.EC2metadataClientWrapper.AvailabilityZone()
if err != nil {
return nil, err
}
region := myAz[0 : len(myAz)-1]

req := &ec2.DescribeAvailabilityZonesInput{
Filters: []*ec2.Filter{
{
Name: aws.String("region-name"),
Values: aws.StringSlice([]string{region}),
},
},
}
resp, err := ec2Client.DescribeAvailabilityZonesWithContext(parentCtx, req)
if err != nil {
return nil, err
}

azNames := []string{}
for _, az := range resp.AvailabilityZones {
azNames = append(azNames, *az.ZoneName)
}

return azNames, nil
}

func doGlobalGc(parentCtx *context.VPCContext, minDetachTime time.Duration, vpcID string) error {
availabilityZones, err := getAvailabilityZones(parentCtx)
if err != nil {
return err
}
for _, az := range availabilityZones {
err = doZonalGC(parentCtx, minDetachTime, az, vpcID)
if err != nil {
return err
}
}
return nil
}

func doZonalGC(parentCtx *context.VPCContext, minDetachTime time.Duration, az string, vpcID string) error {
ec2Client := ec2.New(parentCtx.AWSSession)

baseFilters := getBaseFilter(vpcID)
parentCtx.Logger.WithField("filters", getBaseFilter(vpcID)).Debug("Configuring ENI fetch filters")
baseFilters := getBaseFilter(vpcID, az)
parentCtx.Logger.WithField("filters", baseFilters).Debug("Configuring ENI fetch filters")

describeAvailableRequest := &ec2.DescribeNetworkInterfacesInput{
Filters: append([]*ec2.Filter{
Expand Down

0 comments on commit b5c334d

Please sign in to comment.