From 675189d7bc61d496aa90e5e67a845957802ec822 Mon Sep 17 00:00:00 2001 From: Jayanth Varavani <1111446+jayanthvn@users.noreply.github.com> Date: Sat, 11 Sep 2021 15:55:14 +0000 Subject: [PATCH] UTs for no_manage=false --- pkg/ipamd/ipamd_test.go | 147 +++++++++++++++++++++++++--- scripts/dockerfiles/Dockerfile.test | 1 - 2 files changed, 135 insertions(+), 13 deletions(-) diff --git a/pkg/ipamd/ipamd_test.go b/pkg/ipamd/ipamd_test.go index 4ca8085316..2946c90da1 100644 --- a/pkg/ipamd/ipamd_test.go +++ b/pkg/ipamd/ipamd_test.go @@ -48,23 +48,30 @@ import ( const ( primaryENIid = "eni-00000000" secENIid = "eni-00000001" + terENIid = "eni-00000002" primaryMAC = "12:ef:2a:98:e5:5a" secMAC = "12:ef:2a:98:e5:5b" + terMAC = "12:ef:2a:98:e5:5c" primaryDevice = 0 secDevice = 2 + terDevice = 3 primarySubnet = "10.10.10.0/24" secSubnet = "10.10.20.0/24" + terSubnet = "10.10.30.0/24" ipaddr01 = "10.10.10.11" ipaddr02 = "10.10.10.12" ipaddr03 = "10.10.10.13" ipaddr11 = "10.10.20.11" ipaddr12 = "10.10.20.12" + ipaddr21 = "10.10.30.11" + ipaddr22 = "10.10.30.12" vpcCIDR = "10.10.0.0/16" myNodeName = "testNodeName" prefix01 = "10.10.30.0/28" prefix02 = "10.10.40.0/28" ipaddrPD01 = "10.10.30.0" ipaddrPD02 = "10.10.40.0" + instanceID = "i-0e1f3b9eb950e4980" ) type testMocks struct { @@ -120,7 +127,7 @@ func TestNodeInit(t *testing.T) { } mockContext.dataStore.CheckpointMigrationPhase = 2 - eni1, eni2 := getDummyENIMetadata() + eni1, eni2, _:= getDummyENIMetadata() var cidrs []string m.awsutils.EXPECT().GetENILimit().Return(4, nil) @@ -255,13 +262,15 @@ func TestNodeInitwithPDenabled(t *testing.T) { assert.NoError(t, err) } -func getDummyENIMetadata() (awsutils.ENIMetadata, awsutils.ENIMetadata) { +func getDummyENIMetadata() (awsutils.ENIMetadata, awsutils.ENIMetadata, awsutils.ENIMetadata) { primary := true notPrimary := false testAddr1 := ipaddr01 testAddr2 := ipaddr02 testAddr11 := ipaddr11 testAddr12 := ipaddr12 + testAddr21 := ipaddr21 + testAddr22 := ipaddr22 eni1 := awsutils.ENIMetadata{ ENIID: primaryENIid, MAC: primaryMAC, @@ -291,7 +300,22 @@ func getDummyENIMetadata() (awsutils.ENIMetadata, awsutils.ENIMetadata) { }, }, } - return eni1, eni2 + + eni3 := awsutils.ENIMetadata{ + ENIID: terENIid, + MAC: terMAC, + DeviceNumber: terDevice, + SubnetIPv4CIDR: terSubnet, + IPv4Addresses: []*ec2.NetworkInterfacePrivateIpAddress{ + { + PrivateIpAddress: &testAddr21, Primary: ¬Primary, + }, + { + PrivateIpAddress: &testAddr22, Primary: ¬Primary, + }, + }, + } + return eni1, eni2, eni3 } func getDummyENIMetadataWithPrefix() (awsutils.ENIMetadata, awsutils.ENIMetadata) { @@ -1146,14 +1170,27 @@ func datastoreWith3PodsFromPrefix() *datastore.DataStore { func TestIPAMContext_filterUnmanagedENIs(t *testing.T) { ctrl := gomock.NewController(t) - eni1, eni2 := getDummyENIMetadata() - allENIs := []awsutils.ENIMetadata{eni1, eni2} + eni1, eni2, eni3:= getDummyENIMetadata() + allENIs := []awsutils.ENIMetadata{eni1, eni2, eni3} primaryENIonly := []awsutils.ENIMetadata{eni1} - eni1TagMap := map[string]awsutils.TagMap{eni1.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} - eni2TagMap := map[string]awsutils.TagMap{eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} + filteredENIonly := []awsutils.ENIMetadata{eni1, eni3} + Test1TagMap := map[string]awsutils.TagMap{eni1.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} + Test2TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} + Test3TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNoManageTagKey: "false"}} + Test4TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNodeTagKey: instanceID}} + Test5TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNodeTagKey: "i-abcdabcdabcd"}, + eni3.ENIID: {"hi": "tag", eniNodeTagKey: instanceID}} mockAWSUtils := mock_awsutils.NewMockAPIs(ctrl) - mockAWSUtils.EXPECT().GetPrimaryENI().Times(2).Return(eni1.ENIID) + mockAWSUtils.EXPECT().GetPrimaryENI().Times(6).Return(eni1.ENIID) + mockAWSUtils.EXPECT().GetInstanceID().Times(3).Return(instanceID) tests := []struct { name string @@ -1163,19 +1200,105 @@ func TestIPAMContext_filterUnmanagedENIs(t *testing.T) { unmanagedenis []string }{ {"No tags at all", nil, allENIs, allENIs, nil}, - {"Primary ENI unmanaged", eni1TagMap, allENIs, allENIs, nil}, - {"Secondary ENI unmanaged", eni2TagMap, allENIs, primaryENIonly, []string{eni2.ENIID}}, + {"Primary ENI unmanaged", Test1TagMap, allENIs, allENIs, nil}, + {"Secondary/Tertiary ENI unmanaged", Test2TagMap, allENIs, primaryENIonly, []string{eni2.ENIID, eni3.ENIID}}, + {"Secondary ENI unmanaged", Test3TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, + {"Secondary ENI unmanaged and Tertiary ENI CNI created", Test4TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, + {"Secondary ENI not CNI created and Tertiary ENI CNI created", Test5TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - c := &IPAMContext{awsClient: mockAWSUtils} + c := &IPAMContext{ + awsClient: mockAWSUtils, + enableManageUntaggedMode: true,} + mockAWSUtils.EXPECT().SetUnmanagedENIs(tt.unmanagedenis).AnyTimes() + c.setUnmanagedENIs(tt.tagMap) + + mockAWSUtils.EXPECT().IsUnmanagedENI(gomock.Any()).DoAndReturn( + func(eni string) (unmanaged bool) { + if eni != eni1.ENIID { + tags := tt.tagMap[eni] + if _, ok := tags[eniNoManageTagKey]; ok { + if tags[eniNoManageTagKey] == "true" { + return true + } + } else if _, ok := tags[eniNodeTagKey]; ok && tags[eniNodeTagKey] != instanceID { + return true + } + } + return false + + }).AnyTimes() + + mockAWSUtils.EXPECT().IsCNIUnmanagedENI(gomock.Any()).DoAndReturn( + func(eni string) (unmanaged bool) { + return false + + }).AnyTimes() + + if got := c.filterUnmanagedENIs(tt.enis); !reflect.DeepEqual(got, tt.want) { + t.Errorf("filterUnmanagedENIs() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestIPAMContext_filterUnmanagedENIs_disableManageUntaggedMode(t *testing.T) { + ctrl := gomock.NewController(t) + + eni1, eni2, eni3:= getDummyENIMetadata() + allENIs := []awsutils.ENIMetadata{eni1, eni2, eni3} + primaryENIonly := []awsutils.ENIMetadata{eni1} + filteredENIonly := []awsutils.ENIMetadata{eni1, eni3} + Test1TagMap := map[string]awsutils.TagMap{eni1.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} + Test2TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}} + Test3TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNoManageTagKey: "false"}} + Test4TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNoManageTagKey: "true"}, + eni3.ENIID: {"hi": "tag", eniNodeTagKey: instanceID}} + Test5TagMap := map[string]awsutils.TagMap{ + eni2.ENIID: {"hi": "tag", eniNodeTagKey: "i-abcdabcdabcd"}, + eni3.ENIID: {"hi": "tag", eniNodeTagKey: instanceID}} + + mockAWSUtils := mock_awsutils.NewMockAPIs(ctrl) + mockAWSUtils.EXPECT().GetPrimaryENI().Times(6).Return(eni1.ENIID) + mockAWSUtils.EXPECT().GetInstanceID().Times(3).Return(instanceID) + + tests := []struct { + name string + tagMap map[string]awsutils.TagMap + enis []awsutils.ENIMetadata + want []awsutils.ENIMetadata + unmanagedenis []string + }{ + {"No tags at all", nil, allENIs, allENIs, []string{eni2.ENIID, eni3.ENIID}}, + {"Primary ENI unmanaged", Test1TagMap, allENIs, allENIs, nil}, + {"Secondary/Tertiary ENI unmanaged", Test2TagMap, allENIs, primaryENIonly, []string{eni2.ENIID, eni3.ENIID}}, + {"Secondary ENI unmanaged", Test3TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, + {"Secondary ENI unmanaged and Tertiary ENI CNI created", Test4TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, + {"Secondary ENI not CNI created and Tertiary ENI CNI created", Test5TagMap, allENIs, filteredENIonly, []string{eni2.ENIID}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &IPAMContext{ + awsClient: mockAWSUtils, + enableManageUntaggedMode: false,} mockAWSUtils.EXPECT().SetUnmanagedENIs(tt.unmanagedenis).AnyTimes() c.setUnmanagedENIs(tt.tagMap) mockAWSUtils.EXPECT().IsUnmanagedENI(gomock.Any()).DoAndReturn( func(eni string) (unmanaged bool) { if eni != eni1.ENIID { - if _, ok := tt.tagMap[eni]; ok { + tags := tt.tagMap[eni] + if _, ok := tags[eniNoManageTagKey]; ok { + if tags[eniNoManageTagKey] == "true" { + return true + } + } else if _, ok := tags[eniNodeTagKey]; ok && tags[eniNodeTagKey] != instanceID { return true } } diff --git a/scripts/dockerfiles/Dockerfile.test b/scripts/dockerfiles/Dockerfile.test index 0c50717436..2f518d60a1 100644 --- a/scripts/dockerfiles/Dockerfile.test +++ b/scripts/dockerfiles/Dockerfile.test @@ -17,7 +17,6 @@ RUN go get -u golang.org/x/tools/cmd/goimports # go.mod and go.sum go into their own layers. COPY go.mod . COPY go.sum . -COPY vendor/ vendor/ # This ensures `go mod download` happens only when go.mod and go.sum change. RUN go mod download