Skip to content

Commit 97695bd

Browse files
authored
update unit tests and integration tests for CNINode (#278)
1 parent 2d502cf commit 97695bd

File tree

4 files changed

+152
-38
lines changed

4 files changed

+152
-38
lines changed

pkg/node/manager/manager_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,3 +898,57 @@ func Test_GetEniConfigName(t *testing.T) {
898898
})
899899
}
900900
}
901+
902+
func Test_TrunkEnabledInCNINode(t *testing.T) {
903+
ctrl := gomock.NewController(t)
904+
defer ctrl.Finish()
905+
906+
dataStoreWithUnManagedNode := map[string]node.Node{v1Node.Name: unManagedNode}
907+
908+
mock := NewMock(ctrl, dataStoreWithUnManagedNode)
909+
910+
testCases := []struct {
911+
features []rcV1alpha1.Feature
912+
managed bool
913+
msg string
914+
}{
915+
{
916+
features: []rcV1alpha1.Feature{},
917+
managed: false,
918+
msg: "no feature is added and node is not managed",
919+
},
920+
{
921+
features: []rcV1alpha1.Feature{
922+
{
923+
Name: rcV1alpha1.SecurityGroupsForPods,
924+
Value: "",
925+
},
926+
},
927+
managed: true,
928+
msg: "no SGP feature is added and node is not managed",
929+
},
930+
{
931+
features: []rcV1alpha1.Feature{
932+
{
933+
Name: rcV1alpha1.CustomNetworking,
934+
Value: "default",
935+
},
936+
},
937+
managed: false,
938+
msg: "SGP feature is added and node is managed",
939+
},
940+
}
941+
942+
for _, test := range testCases {
943+
t.Run(test.msg, func(t *testing.T) {
944+
mock.MockK8sAPI.EXPECT().GetCNINode(types.NamespacedName{Name: v1Node.Name}).Return(&rcV1alpha1.CNINode{
945+
Spec: rcV1alpha1.CNINodeSpec{
946+
Features: test.features,
947+
},
948+
}, nil).Times(1)
949+
managed, err := mock.Manager.trunkEnabledInCNINode(v1Node)
950+
assert.NoError(t, err)
951+
assert.Equal(t, test.managed, managed)
952+
})
953+
}
954+
}

test/framework/framework.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ package framework
1515

1616
import (
1717
eniConfig "github.com/aws/amazon-vpc-cni-k8s/pkg/apis/crd/v1alpha1"
18+
cninode "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1alpha1"
1819
sgp "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1beta1"
1920
ec2Manager "github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/resource/aws/ec2"
2021
"github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/resource/k8s/configmap"
@@ -72,6 +73,7 @@ func New(options Options) *Framework {
7273
clientgoscheme.AddToScheme(k8sSchema)
7374
sgp.AddToScheme(k8sSchema)
7475
eniConfig.AddToScheme(k8sSchema)
76+
cninode.AddToScheme(k8sSchema)
7577

7678
stopChan := ctrl.SetupSignalHandler()
7779
cache, err := cache.New(config, cache.Options{Scheme: k8sSchema})

test/framework/resource/k8s/node/manager.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package node
1616
import (
1717
"context"
1818

19+
cninode "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1alpha1"
1920
"github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/utils"
2021
v1 "k8s.io/api/core/v1"
2122
"k8s.io/apimachinery/pkg/labels"
@@ -28,6 +29,9 @@ type Manager interface {
2829
AddLabels(nodeList []v1.Node, label map[string]string) error
2930
RemoveLabels(nodeList []v1.Node, label map[string]string) error
3031
GetNode(node *v1.Node) (*v1.Node, error)
32+
GetNodeList() (*v1.NodeList, error)
33+
GetCNINode(node *v1.Node) (*cninode.CNINode, error)
34+
GetCNINodeList() (*cninode.CNINodeList, error)
3135
}
3236

3337
type defaultManager struct {
@@ -95,3 +99,21 @@ func (d *defaultManager) GetNode(node *v1.Node) (*v1.Node, error) {
9599
err := d.k8sClient.Get(context.TODO(), utils.NamespacedName(node), observedNode)
96100
return observedNode, err
97101
}
102+
103+
func (d *defaultManager) GetCNINode(node *v1.Node) (*cninode.CNINode, error) {
104+
cniNode := &cninode.CNINode{}
105+
err := d.k8sClient.Get(context.TODO(), types.NamespacedName{Name: node.Name}, cniNode)
106+
return cniNode, err
107+
}
108+
109+
func (d *defaultManager) GetCNINodeList() (*cninode.CNINodeList, error) {
110+
list := &cninode.CNINodeList{}
111+
err := d.k8sClient.List(context.TODO(), list)
112+
return list, err
113+
}
114+
115+
func (d *defaultManager) GetNodeList() (*v1.NodeList, error) {
116+
list := &v1.NodeList{}
117+
err := d.k8sClient.List(context.TODO(), list)
118+
return list, err
119+
}

test/integration/perpodsg/perpodsg_test.go

Lines changed: 74 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package perpodsg_test
1616
import (
1717
"time"
1818

19+
cninode "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1alpha1"
1920
"github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1beta1"
2021
"github.com/aws/amazon-vpc-resource-controller-k8s/pkg/config"
2122
"github.com/aws/amazon-vpc-resource-controller-k8s/pkg/provider/branch"
@@ -26,6 +27,7 @@ import (
2627
podWrapper "github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/resource/k8s/pod"
2728
sgpWrapper "github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/resource/k8s/sgp"
2829
"github.com/aws/amazon-vpc-resource-controller-k8s/test/framework/utils"
30+
"github.com/samber/lo"
2931

3032
. "github.com/onsi/ginkgo/v2"
3133
. "github.com/onsi/gomega"
@@ -35,6 +37,29 @@ import (
3537
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3638
)
3739

40+
var _ = Describe("CNINode Veification", func() {
41+
Describe("verify CNINode mapping to nodes", func() {
42+
Context("when nodes are ready", func() {
43+
It("should have same number of CNINode no matter which mode", func() {
44+
cniNodes, err := frameWork.NodeManager.GetCNINodeList()
45+
Expect(err).NotTo(HaveOccurred())
46+
nodes, err := frameWork.NodeManager.GetNodeList()
47+
Expect(err).NotTo(HaveOccurred())
48+
Expect(len(nodes.Items)).To(Equal(len(cniNodes.Items)))
49+
nameMatched := true
50+
for _, node := range nodes.Items {
51+
if !lo.ContainsBy(cniNodes.Items, func(cniNode cninode.CNINode) bool {
52+
return cniNode.Name == node.Name
53+
}) {
54+
nameMatched = false
55+
}
56+
}
57+
Expect(nameMatched).To(BeTrue())
58+
})
59+
})
60+
})
61+
})
62+
3863
var _ = Describe("Branch ENI Pods", func() {
3964
var (
4065
securityGroupPolicy *v1beta1.SecurityGroupPolicy
@@ -427,44 +452,55 @@ var _ = Describe("Branch ENI Pods", func() {
427452
It("pod should not run when un-managed and run when managed", func() {
428453
node := targetedNodes[0]
429454

430-
By("verifying node has trunk ENI label present")
431-
// This label is added by IPAM-D
432-
_, found := node.Labels[config.HasTrunkAttachedLabel]
433-
Expect(found).To(BeTrue())
434-
435-
// This should never happens as once the trunk is attached,
436-
// this label will not be removed again. This is for testing
437-
// purposes to make a managed node an un-managed node
438-
By("removing the has-trunk-attached label from the node")
439-
err = frameWork.NodeManager.RemoveLabels(targetedNodes,
440-
map[string]string{config.HasTrunkAttachedLabel: "true"})
441-
442-
firstPod := podTemplate.DeepCopy()
443-
By("creating a Pod on the un-managed node and verifying it fails")
444-
_, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, firstPod, utils.ResourceCreationTimeout)
445-
Expect(err).To(HaveOccurred())
446-
447-
By("deleting the pod")
448-
err = frameWork.PodManager.DeleteAndWaitTillPodIsDeleted(ctx, firstPod)
449-
Expect(err).ToNot(HaveOccurred())
450-
451-
// Currently we wait for some time before removing the trunk from cache
452-
// to allow evicted Pods's event to be received and their Branch ENIs be
453-
// removed. In this period if we try to make the node managed again, it will
454-
// fail
455-
time.Sleep(branch.NodeDeleteRequeueRequestDelay)
456-
457-
By("adding the has trunk ENI label")
458-
err = frameWork.NodeManager.AddLabels(targetedNodes,
459-
map[string]string{config.HasTrunkAttachedLabel: "true"})
455+
By("verifying node has CNINode present")
456+
cniNode, err := frameWork.NodeManager.GetCNINode(&node)
460457
Expect(err).ToNot(HaveOccurred())
461-
462-
By("creating the Pod on now managed node and verify it runs")
463-
secondPod := podTemplate.DeepCopy()
464-
secondPod, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, secondPod, utils.ResourceCreationTimeout)
465-
Expect(err).ToNot(HaveOccurred())
466-
467-
verify.VerifyNetworkingOfPodUsingENI(*secondPod, []string{securityGroupID1})
458+
Expect(cniNode.Name).To(Equal(node.Name))
459+
460+
// we don't support changing SGP managed node to unmanaged node
461+
// after using CNINode, no longer like node label the feature in CNINode Spec shouldn't be modified
462+
// only run this test for old label based mode
463+
if !lo.ContainsBy(cniNode.Spec.Features, func(addedFeature cninode.Feature) bool {
464+
return addedFeature.Name == cninode.SecurityGroupsForPods
465+
}) {
466+
if _, found := node.Labels[config.HasTrunkAttachedLabel]; found {
467+
// This should never happens as once the trunk is attached,
468+
// this label will not be removed again. This is for testing
469+
// purposes to make a managed node an un-managed node
470+
By("removing the has-trunk-attached label from the node")
471+
err = frameWork.NodeManager.RemoveLabels(targetedNodes,
472+
map[string]string{config.HasTrunkAttachedLabel: "true"})
473+
Expect(err).To(HaveOccurred())
474+
475+
firstPod := podTemplate.DeepCopy()
476+
By("creating a Pod on the un-managed node and verifying it fails")
477+
_, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, firstPod, utils.ResourceCreationTimeout)
478+
Expect(err).To(HaveOccurred())
479+
480+
By("deleting the pod")
481+
err = frameWork.PodManager.DeleteAndWaitTillPodIsDeleted(ctx, firstPod)
482+
Expect(err).ToNot(HaveOccurred())
483+
484+
// Currently we wait for some time before removing the trunk from cache
485+
// to allow evicted Pods's event to be received and their Branch ENIs be
486+
// removed. In this period if we try to make the node managed again, it will
487+
// fail
488+
time.Sleep(branch.NodeDeleteRequeueRequestDelay)
489+
490+
By("adding the has trunk ENI label")
491+
err = frameWork.NodeManager.AddLabels(targetedNodes,
492+
map[string]string{config.HasTrunkAttachedLabel: "true"})
493+
Expect(err).ToNot(HaveOccurred())
494+
495+
By("creating the Pod on now managed node and verify it runs")
496+
secondPod := podTemplate.DeepCopy()
497+
secondPod, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, secondPod, utils.ResourceCreationTimeout)
498+
Expect(err).ToNot(HaveOccurred())
499+
500+
verify.VerifyNetworkingOfPodUsingENI(*secondPod, []string{securityGroupID1})
501+
502+
}
503+
}
468504
})
469505
})
470506

@@ -485,7 +521,7 @@ var _ = Describe("Branch ENI Pods", func() {
485521
pod := podTemplate.DeepCopy()
486522

487523
By("creating pod which should not run since controller is down")
488-
pod, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, pod, time.Second*10)
524+
_, err = frameWork.PodManager.CreateAndWaitTillPodIsRunning(ctx, pod, time.Second*10)
489525
Expect(err).To(HaveOccurred())
490526

491527
By("scaling the controller deployment to 2")

0 commit comments

Comments
 (0)