Skip to content

Commit

Permalink
Cherry-pick of #1485: Fix aws flaking Unit Tests in 1.13
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeffwan committed Dec 8, 2018
1 parent fd90f4c commit 8197ea1
Showing 1 changed file with 37 additions and 22 deletions.
59 changes: 37 additions & 22 deletions cluster-autoscaler/cloudprovider/aws/aws_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ package aws

import (
"fmt"

"net/http"
"net/http/httptest"
"os"
"reflect"
"sort"
"strings"
"testing"

"github.com/aws/aws-sdk-go/aws"
Expand Down Expand Up @@ -303,21 +307,21 @@ func TestGetASGTemplate(t *testing.T) {
}
}

/* 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 @@ -351,30 +355,41 @@ func TestFetchAutoAsgs(t *testing.T) {
}

// fetchAutoASGs is called at manager creation time, via forceRefresh
m, err := createAWSManagerInternal(nil, do, &autoScalingWrapper{s})
m, err := createAWSManagerInternal(nil, do, &autoScalingWrapper{s}, nil)
assert.NoError(t, err)

asgs := m.asgCache.get()
asgs := m.asgCache.Get()
assert.Equal(t, 1, len(asgs))
validateAsg(t, asgs[0].config, groupname, min, max)
validateAsg(t, asgs[0], 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)
fn(&autoscaling.DescribeTagsOutput{Tags: []*autoscaling.TagDescription{}}, false)
}).Return(nil).Once()

err = m.fetchAutoAsgs()
err = m.asgCache.regenerate()
assert.NoError(t, err)
assert.Empty(t, m.asgCache.get())
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 8197ea1

Please sign in to comment.