Skip to content

Commit

Permalink
add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
SlevinWasAlreadyTaken committed Apr 11, 2022
1 parent f5046f8 commit 19e6b0b
Show file tree
Hide file tree
Showing 3 changed files with 207 additions and 0 deletions.
121 changes: 121 additions & 0 deletions pkg/cfn/manager/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,141 @@ import (
"errors"
"fmt"

"github.com/aws/aws-sdk-go-v2/service/autoscaling"
astypes "github.com/aws/aws-sdk-go-v2/service/autoscaling/types"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
cfn "github.com/aws/aws-sdk-go/service/cloudformation"

. "github.com/onsi/ginkgo"
. "github.com/onsi/ginkgo/extensions/table"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/mock"

api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5"
"github.com/weaveworks/eksctl/pkg/cfn/builder"
"github.com/weaveworks/eksctl/pkg/testutils/mockprovider"
)

var _ = Describe("StackCollection", func() {
Context("PropagateManagedNodeGroupTagsToASG", func() {
It("can create propagate tag", func() {
// define most mock parameters
asgName := "asg-test-name"
ngName := "ng-test-name"
ngTags := map[string]string{
"tag_key_1": "tag_value_1",
}
errCh := make(chan error)

p := mockprovider.NewMockProvider()

// DescribeTags classic mock
describeTagsInput := &autoscaling.DescribeTagsInput{
Filters: []astypes.Filter{{Name: aws.String("auto-scaling-group"), Values: []string{asgName}}},
}
describeOutput := &autoscaling.DescribeTagsOutput{}
p.MockASG().On("DescribeTags", mock.Anything, describeTagsInput).Return(describeOutput, nil)

// CreateOrUpdateTags classic mock
createOrUpdateTagsInput := &autoscaling.CreateOrUpdateTagsInput{
Tags: []astypes.Tag{
{
ResourceId: aws.String("asg-test-name"),
ResourceType: aws.String("auto-scaling-group"),
Key: aws.String("tag_key_1"),
Value: aws.String("tag_value_1"),
PropagateAtLaunch: aws.Bool(false),
},
},
}
createOrUpdateTagsOutput := &autoscaling.CreateOrUpdateTagsOutput{}
p.MockASG().On("CreateOrUpdateTags", mock.Anything, createOrUpdateTagsInput).Return(createOrUpdateTagsOutput, nil)

sm := NewStackCollection(p, api.NewClusterConfig())
err := sm.PropagateManagedNodeGroupTagsToASG(ngName, ngTags, []string{asgName}, errCh)
Expect(err).NotTo(HaveOccurred())
err = <-errCh
Expect(err).NotTo(HaveOccurred())
})
It("cannot propagate tags in chunks of 25", func() {
// define most mock parameters
ngName := "ng-test-name"
asgName := "asg-test-name"
ngTags := make(map[string]string)
// populate the createOrUpdateTagsSliceInput for easier generation of chunks
createOrUpdateTagsSliceInput := []astypes.Tag{}
for i := 0; i < 30; i++ {
tagKey, tagValue := fmt.Sprintf("tag_key_%d", i), fmt.Sprintf("tag_value_%d", i)
ngTags[tagKey] = tagValue
createOrUpdateTagsSliceInput = append(createOrUpdateTagsSliceInput, astypes.Tag{
ResourceId: aws.String(asgName),
ResourceType: aws.String("auto-scaling-group"),
Key: aws.String(tagKey),
Value: aws.String(tagValue),
PropagateAtLaunch: aws.Bool(false),
})
}
errCh := make(chan error)

p := mockprovider.NewMockProvider()

// DescribeTags classic mock
describeTagsInput := &autoscaling.DescribeTagsInput{
Filters: []astypes.Filter{{Name: aws.String("auto-scaling-group"), Values: []string{asgName}}},
}
describeOutput := &autoscaling.DescribeTagsOutput{}
p.MockASG().On("DescribeTags", mock.Anything, describeTagsInput).Return(describeOutput, nil)

// CreateOrUpdateTags chunked mock
// generate the expected chunk of tags
chunkSize := builder.MaximumCreatedTagNumberPerCall
firstchunkLenMatcher := func(input *autoscaling.CreateOrUpdateTagsInput) bool {
return len(input.Tags) == len(createOrUpdateTagsSliceInput[:chunkSize])
}
secondChunkLenMatcher := func(input *autoscaling.CreateOrUpdateTagsInput) bool {
return len(input.Tags) == len(createOrUpdateTagsSliceInput[chunkSize:])
}

// setup the call verification of the two chunks
// NOTE: because of the use of map (unordered processing), we just verify size of chunk
p.MockASG().On("CreateOrUpdateTags", mock.Anything, mock.MatchedBy(firstchunkLenMatcher)).Return(&autoscaling.CreateOrUpdateTagsOutput{}, nil)
p.MockASG().On("CreateOrUpdateTags", mock.Anything, mock.MatchedBy(secondChunkLenMatcher)).Return(&autoscaling.CreateOrUpdateTagsOutput{}, nil)

sm := NewStackCollection(p, api.NewClusterConfig())
err := sm.PropagateManagedNodeGroupTagsToASG(ngName, ngTags, []string{asgName}, errCh)
Expect(err).NotTo(HaveOccurred())
err = <-errCh
Expect(err).NotTo(HaveOccurred())
})
It("cannot propagate if to many tags", func() {
// define parameters
ngName := "ng-test-name"
asgName := "asg-test-name"
ngTags := make(map[string]string)
for i := 0; i < builder.MaximumTagNumber+1; i++ {
ngTags[fmt.Sprintf("tag_key_%d", i)] = fmt.Sprintf("tag_value_%d", i)
}
errCh := make(chan error)

p := mockprovider.NewMockProvider()

// DescribeTags classic mock
describeTagsInput := &autoscaling.DescribeTagsInput{
Filters: []astypes.Filter{{Name: aws.String("auto-scaling-group"), Values: []string{asgName}}},
}
describeOutput := &autoscaling.DescribeTagsOutput{}
p.MockASG().On("DescribeTags", mock.Anything, describeTagsInput).Return(describeOutput, nil)

sm := NewStackCollection(p, api.NewClusterConfig())
err := sm.PropagateManagedNodeGroupTagsToASG(ngName, ngTags, []string{asgName}, errCh)
Expect(err).NotTo(HaveOccurred())
err = <-errCh
Expect(err).To(MatchError(ContainSubstring("maximum amount for asg")))
})
})

Context("UpdateStack", func() {
It("succeeds if no changes required", func() {
// Order of AWS SDK invocation
Expand Down
85 changes: 85 additions & 0 deletions pkg/cfn/manager/fakes/fake_stack_manager.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/cfn/manager/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ type StackManager interface {
NewTasksToDeleteNodeGroups(stacks []NodeGroupStack, shouldDelete func(_ string) bool, wait bool, cleanup func(chan error, string) error) (*tasks.TaskTree, error)
NewTasksToDeleteOIDCProviderWithIAMServiceAccounts(oidc *iamoidc.OpenIDConnectManager, clientSetGetter kubernetes.ClientSetGetter) (*tasks.TaskTree, error)
NewUnmanagedNodeGroupTask(nodeGroups []*v1alpha5.NodeGroup, forceAddCNIPolicy bool, importer vpc.Importer) *tasks.TaskTree
PropagateManagedNodeGroupTagsToASG(ngName string, ngTags map[string]string, asgNames []string, errCh chan error) error
RefreshFargatePodExecutionRoleARN() error
StackStatusIsNotReady(s *Stack) bool
StackStatusIsNotTransitional(s *Stack) bool
Expand Down

0 comments on commit 19e6b0b

Please sign in to comment.