From 0be767a90a2c42a2b29184b2b149d5309c5ed1e9 Mon Sep 17 00:00:00 2001 From: Kierran McPherson Date: Sat, 10 Nov 2018 11:02:34 +1300 Subject: [PATCH] Request AWS ASGs in batches Signed-off-by: Kierran McPherson --- upup/pkg/fi/cloudup/awsup/aws_cloud.go | 47 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/upup/pkg/fi/cloudup/awsup/aws_cloud.go b/upup/pkg/fi/cloudup/awsup/aws_cloud.go index 1f2e15f530139..a15a41d62dd12 100644 --- a/upup/pkg/fi/cloudup/awsup/aws_cloud.go +++ b/upup/pkg/fi/cloudup/awsup/aws_cloud.go @@ -491,26 +491,29 @@ func FindAutoscalingGroups(c AWSCloud, tags map[string]string) ([]*autoscaling.G } if len(asgNames) != 0 { - request := &autoscaling.DescribeAutoScalingGroupsInput{ - AutoScalingGroupNames: asgNames, - } - err := c.Autoscaling().DescribeAutoScalingGroupsPages(request, func(p *autoscaling.DescribeAutoScalingGroupsOutput, lastPage bool) bool { - for _, asg := range p.AutoScalingGroups { - if !matchesAsgTags(tags, asg.Tags) { - // We used an inexact filter above - continue - } - // Check for "Delete in progress" (the only use of .Status) - if asg.Status != nil { - glog.Warningf("Skipping ASG %v (which matches tags): %v", *asg.AutoScalingGroupARN, *asg.Status) - continue + for i := 0; i < len(asgNames); i += 50 { + batch := asgNames[i:minInt(i+50, len(asgNames))] + request := &autoscaling.DescribeAutoScalingGroupsInput{ + AutoScalingGroupNames: batch, + } + err := c.Autoscaling().DescribeAutoScalingGroupsPages(request, func(p *autoscaling.DescribeAutoScalingGroupsOutput, lastPage bool) bool { + for _, asg := range p.AutoScalingGroups { + if !matchesAsgTags(tags, asg.Tags) { + // We used an inexact filter above + continue + } + // Check for "Delete in progress" (the only use of .Status) + if asg.Status != nil { + glog.Warningf("Skipping ASG %v (which matches tags): %v", *asg.AutoScalingGroupARN, *asg.Status) + continue + } + asgs = append(asgs, asg) } - asgs = append(asgs, asg) + return true + }) + if err != nil { + return nil, fmt.Errorf("error listing autoscaling groups: %v", err) } - return true - }) - if err != nil { - return nil, fmt.Errorf("error listing autoscaling groups: %v", err) } } @@ -518,6 +521,14 @@ func FindAutoscalingGroups(c AWSCloud, tags map[string]string) ([]*autoscaling.G return asgs, nil } +// Returns the minimum of two ints +func minInt(a int, b int) int { + if a < b { + return a + } + return b +} + // matchesAsgTags is used to filter an asg by tags func matchesAsgTags(tags map[string]string, actual []*autoscaling.TagDescription) bool { for k, v := range tags {