Skip to content

Commit

Permalink
Fix aws unit test flakiness on 1.2 branch
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeffwan committed Dec 7, 2018
1 parent dc71b12 commit 9632052
Showing 1 changed file with 31 additions and 17 deletions.
48 changes: 31 additions & 17 deletions cluster-autoscaler/cloudprovider/aws/aws_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ package aws

import (
"fmt"
"reflect"
"sort"
"strings"
"testing"

"github.com/stretchr/testify/mock"
Expand Down Expand Up @@ -170,21 +173,21 @@ func TestFetchExplicitAsgs(t *testing.T) {
validateAsg(t, asgs[0].config, groupname, min, max)
}

/* Disabled due to flakiness. See https://github.com/kubernetes/autoscaler/issues/608
func TestFetchAutoAsgs(t *testing.T) {
min, max := 1, 10
groupname, tags := "coolasg", []string{"tag", "anothertag"}

s := &AutoScalingMock{}
// Lookup groups associated with tags
s.On("DescribeTagsPages",
&autoscaling.DescribeTagsInput{
Filters: []*autoscaling.Filter{
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[0]})},
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[1]})},
},
MaxRecords: aws.Int64(maxRecordsReturnedByAPI),
expectedTagsInput := &autoscaling.DescribeTagsInput{
Filters: []*autoscaling.Filter{
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[0]})},
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[1]})},
},
MaxRecords: aws.Int64(maxRecordsReturnedByAPI),
}
// Use MatchedBy pattern to avoid list order issue https://github.com/kubernetes/autoscaler/issues/1346
s.On("DescribeTagsPages", mock.MatchedBy(tagsMatcher(expectedTagsInput)),
mock.AnythingOfType("func(*autoscaling.DescribeTagsOutput, bool) bool"),
).Run(func(args mock.Arguments) {
fn := args.Get(1).(func(*autoscaling.DescribeTagsOutput, bool) bool)
Expand Down Expand Up @@ -226,14 +229,7 @@ func TestFetchAutoAsgs(t *testing.T) {
validateAsg(t, asgs[0].config, groupname, min, max)

// Simulate the previously discovered ASG disappearing
s.On("DescribeTagsPages",
&autoscaling.DescribeTagsInput{
Filters: []*autoscaling.Filter{
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[0]})},
{Name: aws.String("key"), Values: aws.StringSlice([]string{tags[1]})},
},
MaxRecords: aws.Int64(maxRecordsReturnedByAPI),
},
s.On("DescribeTagsPages", mock.MatchedBy(tagsMatcher(expectedTagsInput)),
mock.AnythingOfType("func(*autoscaling.DescribeTagsOutput, bool) bool"),
).Run(func(args mock.Arguments) {
fn := args.Get(1).(func(*autoscaling.DescribeTagsOutput, bool) bool)
Expand All @@ -244,4 +240,22 @@ func TestFetchAutoAsgs(t *testing.T) {
assert.NoError(t, err)
assert.Empty(t, m.asgCache.get())
}
*/

func tagsMatcher(expected *autoscaling.DescribeTagsInput) func(*autoscaling.DescribeTagsInput) bool {
return func(actual *autoscaling.DescribeTagsInput) bool {
expectedTags := flatTagSlice(expected.Filters)
actualTags := flatTagSlice(actual.Filters)

return *expected.MaxRecords == *actual.MaxRecords && reflect.DeepEqual(expectedTags, actualTags)
}
}

func flatTagSlice(filters []*autoscaling.Filter) []string {
tags := []string{}
for _, filter := range filters {
tags = append(tags, aws.StringValueSlice(filter.Values)...)
}
// Sort slice for compare
sort.Strings(tags)
return tags
}

0 comments on commit 9632052

Please sign in to comment.