From 7afa4fbbdb6bd38f17f25601122d359d91c8e0e7 Mon Sep 17 00:00:00 2001 From: Quan Tian Date: Thu, 25 Aug 2022 18:06:55 +0800 Subject: [PATCH] Use mock network for memberlist unit tests (#4152) Otherwise tests would fail if the memberlist port is already bound on the server that runs the tests. Signed-off-by: Quan Tian --- cmd/antrea-agent/agent.go | 2 +- pkg/agent/memberlist/cluster.go | 2 ++ pkg/agent/memberlist/cluster_test.go | 15 ++++++++------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd/antrea-agent/agent.go b/cmd/antrea-agent/agent.go index 2db8da16567..9f9814a0e6a 100644 --- a/cmd/antrea-agent/agent.go +++ b/cmd/antrea-agent/agent.go @@ -406,7 +406,7 @@ func run(o *Options) error { return fmt.Errorf("invalid Node Transport IPAddr in Node config: %v", nodeConfig) } memberlistCluster, err = memberlist.NewCluster(nodeTransportIP, o.config.ClusterMembershipPort, - nodeConfig.Name, nodeInformer, externalIPPoolInformer, + nodeConfig.Name, nodeInformer, externalIPPoolInformer, nil, ) if err != nil { return fmt.Errorf("error creating new memberlist cluster: %v", err) diff --git a/pkg/agent/memberlist/cluster.go b/pkg/agent/memberlist/cluster.go index c20b2f0fe55..bbacc5a2889 100644 --- a/pkg/agent/memberlist/cluster.go +++ b/pkg/agent/memberlist/cluster.go @@ -129,6 +129,7 @@ func NewCluster( nodeName string, nodeInformer coreinformers.NodeInformer, externalIPPoolInformer crdinformers.ExternalIPPoolInformer, + transport memberlist.Transport, // Parameterized for testing, could be left nil for production code. ) (*Cluster, error) { // The Node join/leave events will be notified via it. nodeEventCh := make(chan memberlist.NodeEvent, 1024) @@ -148,6 +149,7 @@ func NewCluster( conf := memberlist.DefaultLocalConfig() conf.Name = c.nodeName + conf.Transport = transport conf.BindPort = c.bindPort conf.AdvertisePort = c.bindPort conf.AdvertiseAddr = nodeIP.String() diff --git a/pkg/agent/memberlist/cluster_test.go b/pkg/agent/memberlist/cluster_test.go index 33f6c79957a..87a7929194a 100644 --- a/pkg/agent/memberlist/cluster_test.go +++ b/pkg/agent/memberlist/cluster_test.go @@ -45,9 +45,7 @@ type fakeCluster struct { crdClient *fakeversioned.Clientset } -func newFakeCluster(nodeConfig *config.NodeConfig, stopCh <-chan struct{}, i int) (*fakeCluster, error) { - port := apis.AntreaAgentClusterMembershipPort + i - +func newFakeCluster(nodeConfig *config.NodeConfig, stopCh <-chan struct{}) (*fakeCluster, error) { clientset := fake.NewSimpleClientset() informerFactory := informers.NewSharedInformerFactory(clientset, 0) @@ -56,7 +54,10 @@ func newFakeCluster(nodeConfig *config.NodeConfig, stopCh <-chan struct{}, i int crdInformerFactory := crdinformers.NewSharedInformerFactory(crdClient, 0) ipPoolInformer := crdInformerFactory.Crd().V1alpha2().ExternalIPPools() ip := net.ParseIP("127.0.0.1") - cluster, err := NewCluster(ip, port, nodeConfig.Name, nodeInformer, ipPoolInformer) + // Use mock network to avoid port conflict with system network and any impact on the system network. + mockNetwork := &memberlist.MockNetwork{} + mockTransport := mockNetwork.NewTransport(nodeConfig.Name) + cluster, err := NewCluster(ip, apis.AntreaAgentClusterMembershipPort, nodeConfig.Name, nodeInformer, ipPoolInformer, mockTransport) if err != nil { return nil, err } @@ -132,7 +133,7 @@ func TestCluster_Run(t *testing.T) { expectEgressSelectResult: false, }, } - for i, tCase := range testCases { + for _, tCase := range testCases { t.Run(tCase.name, func(t *testing.T) { nodeConfig := &config.NodeConfig{ Name: localNodeName, @@ -140,7 +141,7 @@ func TestCluster_Run(t *testing.T) { } stopCh := make(chan struct{}) defer close(stopCh) - fakeCluster, err := newFakeCluster(nodeConfig, stopCh, i) + fakeCluster, err := newFakeCluster(nodeConfig, stopCh) if err != nil { t.Fatalf("New fake memberlist server error: %v", err) } @@ -186,7 +187,7 @@ func TestCluster_RunClusterEvents(t *testing.T) { Spec: crdv1a2.EgressSpec{ExternalIPPool: fakeEIP1.Name, EgressIP: "1.1.1.2"}, } - fakeCluster, err := newFakeCluster(nodeConfig, stopCh, 10) + fakeCluster, err := newFakeCluster(nodeConfig, stopCh) if err != nil { t.Fatalf("New fake memberlist server error: %v", err) }