From 3590cbee28bd7adba8d4d846a36d2be17369fa8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Caama=C3=B1o=20Ruiz?= Date: Thu, 10 Oct 2024 16:09:05 +0000 Subject: [PATCH] Add specific interface for GetActiveNetworkForNamespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jaime CaamaƱo Ruiz --- .../endpointslice_mirror_controller.go | 14 +-- .../endpointslice_mirror_controller_test.go | 47 +++----- .../fake_cluster_manager_test.go | 7 +- .../network_cluster_controller.go | 8 +- .../pkg/clustermanager/pod/allocator.go | 8 +- .../pkg/clustermanager/pod/allocator_test.go | 4 +- go-controller/pkg/cni/cni.go | 12 +- go-controller/pkg/cni/cni_test.go | 12 +- go-controller/pkg/cni/cniserver.go | 6 +- go-controller/pkg/cni/cniserver_test.go | 2 +- go-controller/pkg/cni/types.go | 4 +- go-controller/pkg/cni/udn/primary_network.go | 12 +- .../pkg/cni/udn/primary_network_test.go | 8 +- .../network_attach_def_controller.go | 7 +- .../network_attach_def_controller_test.go | 4 +- .../network_manager.go | 5 +- .../node/default_node_network_controller.go | 11 +- go-controller/pkg/node/gateway_init.go | 6 +- .../pkg/node/gateway_init_linux_test.go | 37 +----- go-controller/pkg/node/gateway_localnet.go | 4 +- .../pkg/node/gateway_localnet_linux_test.go | 2 + go-controller/pkg/node/gateway_shared_intf.go | 48 ++++---- go-controller/pkg/node/gateway_udn_test.go | 13 +-- .../pkg/ovn/base_network_controller.go | 6 +- .../services/services_controller.go | 8 +- .../services/services_controller_test.go | 10 +- .../pkg/ovn/default_network_controller.go | 6 +- go-controller/pkg/ovn/hybrid_test.go | 105 +++++++++++++++--- go-controller/pkg/ovn/master_test.go | 21 +++- go-controller/pkg/ovn/ovn_test.go | 87 ++++++++------- .../secondary_layer2_network_controller.go | 6 +- ...econdary_layer2_network_controller_test.go | 14 ++- .../secondary_layer3_network_controller.go | 6 +- ...econdary_layer3_network_controller_test.go | 23 ++-- .../secondary_localnet_network_controller.go | 4 +- go-controller/pkg/testing/nad/netattach.go | 42 +------ 36 files changed, 312 insertions(+), 307 deletions(-) diff --git a/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller.go b/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller.go index f2c9f2642ed..38273383148 100644 --- a/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller.go +++ b/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller.go @@ -43,7 +43,7 @@ type Controller struct { endpointSlicesSynced cache.InformerSynced podLister corelisters.PodLister podsSynced cache.InformerSynced - nadController networkAttachDefController.NADController + networkManager networkAttachDefController.NetworkManager cancel context.CancelFunc } @@ -111,14 +111,14 @@ func (c *Controller) onEndpointSliceAdd(obj interface{}) { func NewController( ovnClient *util.OVNClusterManagerClientset, - wf *factory.WatchFactory, nadController networkAttachDefController.NADController) (*Controller, error) { + wf *factory.WatchFactory, networkManager networkAttachDefController.NetworkManager) (*Controller, error) { wg := &sync.WaitGroup{} c := &Controller{ - kubeClient: ovnClient.KubeClient, - wg: wg, - name: types.EndpointSliceMirrorControllerName, - nadController: nadController, + kubeClient: ovnClient.KubeClient, + wg: wg, + name: types.EndpointSliceMirrorControllerName, + networkManager: networkManager, } c.queue = workqueue.NewTypedRateLimitingQueueWithConfig( @@ -244,7 +244,7 @@ func (c *Controller) syncDefaultEndpointSlice(ctx context.Context, key string) e return err } - namespacePrimaryNetwork, err := c.nadController.GetActiveNetworkForNamespace(namespace) + namespacePrimaryNetwork, err := c.networkManager.GetActiveNetworkForNamespace(namespace) if err != nil { return err } diff --git a/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller_test.go b/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller_test.go index 8d871549513..dfbf0ec9b5a 100644 --- a/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller_test.go +++ b/go-controller/pkg/clustermanager/endpointslicemirror/endpointslice_mirror_controller_test.go @@ -17,9 +17,7 @@ import ( "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory" - nad "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" - kubetest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" fakenad "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util" @@ -27,10 +25,10 @@ import ( var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func() { var ( - app *cli.App - controller *Controller - fakeClient *util.OVNClusterManagerClientset - nadController nad.NADController + app *cli.App + controller *Controller + fakeClient *util.OVNClusterManagerClientset + fakeNetworkManager fakenad.FakeNetworkManager ) start := func(objects ...runtime.Object) { @@ -40,17 +38,13 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( fakeClient = util.GetOVNClientset(objects...).GetClusterManagerClientset() wf, err := factory.NewClusterManagerWatchFactory(fakeClient) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - nadController, err = nad.NewClusterNADController("test", &fakenad.FakeNetworkControllerManager{}, wf, nil) - gomega.Expect(err).NotTo(gomega.HaveOccurred()) - controller, err = NewController(fakeClient, wf, nadController) + fakeNetworkManager = fakenad.FakeNetworkManager{} + controller, err = NewController(fakeClient, wf, &fakeNetworkManager) gomega.Expect(err).NotTo(gomega.HaveOccurred()) err = wf.Start() gomega.Expect(err).NotTo(gomega.HaveOccurred()) - err = nadController.Start() - gomega.Expect(err).NotTo(gomega.HaveOccurred()) - err = controller.Start(context.Background(), 1) gomega.Expect(err).NotTo(gomega.HaveOccurred()) } @@ -70,9 +64,7 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( if controller != nil { controller.Stop() } - if nadController != nil { - nadController.Stop() - } + fakeNetworkManager.PrimaryNetworks = map[string]util.NetInfo{} }) ginkgo.Context("on startup repair", func() { @@ -108,7 +100,7 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( }, }, } - staleEndpointSlice := kubetest.MirrorEndpointSlice(&defaultEndpointSlice, "l3-network", false) + staleEndpointSlice := testing.MirrorEndpointSlice(&defaultEndpointSlice, "l3-network", false) staleEndpointSlice.Labels[types.LabelSourceEndpointSlice] = "non-existing-endpointslice" objs := []runtime.Object{ @@ -133,12 +125,10 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( start(objs...) nad := testing.GenerateNAD("l3-network", "l3-network", namespaceT.Name, types.Layer3Topology, "10.132.2.0/16/24", types.NetworkRolePrimary) - - _, err := fakeClient.NetworkAttchDefClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespaceT.Name).Create( - context.TODO(), - nad, - metav1.CreateOptions{}) + netInfo, err := util.ParseNADInfo(nad) gomega.Expect(err).ToNot(gomega.HaveOccurred()) + netInfo.SetNADs(nad.Namespace + "/" + nad.Name) + fakeNetworkManager.PrimaryNetworks = map[string]util.NetInfo{"testns": netInfo} var mirroredEndpointSlices *discovery.EndpointSliceList gomega.Eventually(func() error { @@ -314,7 +304,7 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( }, }, } - mirroredEndpointSlice := kubetest.MirrorEndpointSlice(&defaultEndpointSlice, "l3-network", false) + mirroredEndpointSlice := testing.MirrorEndpointSlice(&defaultEndpointSlice, "l3-network", false) objs := []runtime.Object{ &v1.PodList{ Items: []v1.Pod{ @@ -337,20 +327,13 @@ var _ = ginkgo.Describe("Cluster manager EndpointSlice mirror controller", func( start(objs...) nad := testing.GenerateNAD("l3-network", "l3-network", namespaceT.Name, types.Layer3Topology, "10.132.2.0/16/24", types.NetworkRolePrimary) - _, err := fakeClient.NetworkAttchDefClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespaceT.Name).Create( - context.TODO(), - nad, - metav1.CreateOptions{}) + netInfo, err := util.ParseNADInfo(nad) gomega.Expect(err).ToNot(gomega.HaveOccurred()) + netInfo.SetNADs(nad.Namespace + "/" + nad.Name) + fakeNetworkManager.PrimaryNetworks = map[string]util.NetInfo{"testns": netInfo} var mirroredEndpointSlices *discovery.EndpointSliceList gomega.Eventually(func() error { - // nad should exist - _, err := fakeClient.NetworkAttchDefClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespaceT.Name).Get(context.TODO(), "l3-network", metav1.GetOptions{}) - if err != nil { - return err - } - // defaultEndpointSlice should exist _, err = fakeClient.KubeClient.DiscoveryV1().EndpointSlices(namespaceT.Name).Get(context.TODO(), defaultEndpointSlice.Name, metav1.GetOptions{}) if err != nil { diff --git a/go-controller/pkg/clustermanager/fake_cluster_manager_test.go b/go-controller/pkg/clustermanager/fake_cluster_manager_test.go index d3a2eabb6e5..f4ca38b37f8 100644 --- a/go-controller/pkg/clustermanager/fake_cluster_manager_test.go +++ b/go-controller/pkg/clustermanager/fake_cluster_manager_test.go @@ -16,8 +16,8 @@ import ( egresssvc "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/egressservice/v1" egresssvcfake "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/egressservice/v1/apis/clientset/versioned/fake" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory" - nad "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/healthcheck" + "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" @@ -90,9 +90,8 @@ func (o *FakeClusterManager) init() { gomega.Expect(err).ToNot(gomega.HaveOccurred()) } if util.IsNetworkSegmentationSupportEnabled() { - nadController, err := nad.NewClusterNADController("test", nil, o.watcher, nil) - gomega.Expect(err).NotTo(gomega.HaveOccurred()) - o.epsMirror, err = endpointslicemirror.NewController(o.fakeClient, o.watcher, nadController) + fakeNetworkManager := &nad.FakeNetworkManager{} + o.epsMirror, err = endpointslicemirror.NewController(o.fakeClient, o.watcher, fakeNetworkManager) gomega.Expect(err).NotTo(gomega.HaveOccurred()) err = o.epsMirror.Start(context.TODO(), 1) diff --git a/go-controller/pkg/clustermanager/network_cluster_controller.go b/go-controller/pkg/clustermanager/network_cluster_controller.go index 6d6c0dc83ca..8e70bae15e8 100644 --- a/go-controller/pkg/clustermanager/network_cluster_controller.go +++ b/go-controller/pkg/clustermanager/network_cluster_controller.go @@ -62,7 +62,7 @@ type networkClusterController struct { ipamClaimReconciler *persistentips.IPAMClaimReconciler subnetAllocator subnet.Allocator - nadController networkAttachDefController.NADController + networkManager networkAttachDefController.NetworkManager // event recorder used to post events to k8s recorder record.EventRecorder @@ -70,7 +70,7 @@ type networkClusterController struct { util.NetInfo } -func newNetworkClusterController(networkIDAllocator idallocator.NamedAllocator, netInfo util.NetInfo, ovnClient *util.OVNClusterManagerClientset, wf *factory.WatchFactory, recorder record.EventRecorder, nadController networkAttachDefController.NADController) *networkClusterController { +func newNetworkClusterController(networkIDAllocator idallocator.NamedAllocator, netInfo util.NetInfo, ovnClient *util.OVNClusterManagerClientset, wf *factory.WatchFactory, recorder record.EventRecorder, networkManager networkAttachDefController.NADController) *networkClusterController { kube := &kube.KubeOVN{ Kube: kube.Kube{ KClient: ovnClient.KubeClient, @@ -88,7 +88,7 @@ func newNetworkClusterController(networkIDAllocator idallocator.NamedAllocator, wg: wg, networkIDAllocator: networkIDAllocator, recorder: recorder, - nadController: nadController, + networkManager: networkManager, } return ncc @@ -193,7 +193,7 @@ func (ncc *networkClusterController) init() error { ) ncc.podAllocator = pod.NewPodAllocator(ncc.NetInfo, podAllocationAnnotator, ipAllocator, - ipamClaimsReconciler, ncc.nadController, ncc.recorder) + ipamClaimsReconciler, ncc.networkManager, ncc.recorder) if err := ncc.podAllocator.Init(); err != nil { return fmt.Errorf("failed to initialize pod ip allocator: %w", err) } diff --git a/go-controller/pkg/clustermanager/pod/allocator.go b/go-controller/pkg/clustermanager/pod/allocator.go index b7e7c9b412c..ea671c8a2f2 100644 --- a/go-controller/pkg/clustermanager/pod/allocator.go +++ b/go-controller/pkg/clustermanager/pod/allocator.go @@ -41,7 +41,7 @@ type PodAllocator struct { ipamClaimsReconciler persistentips.PersistentAllocations - nadController nad.NADController + networkManager nad.NetworkManager // event recorder used to post events to k8s recorder record.EventRecorder @@ -58,7 +58,7 @@ func NewPodAllocator( podAnnotationAllocator *pod.PodAnnotationAllocator, ipAllocator subnet.Allocator, claimsReconciler persistentips.PersistentAllocations, - nadController nad.NADController, + networkManager nad.NetworkManager, recorder record.EventRecorder, ) *PodAllocator { podAllocator := &PodAllocator{ @@ -66,7 +66,7 @@ func NewPodAllocator( releasedPods: map[string]sets.Set[string]{}, releasedPodsMutex: sync.Mutex{}, podAnnotationAllocator: podAnnotationAllocator, - nadController: nadController, + networkManager: networkManager, recorder: recorder, } @@ -109,7 +109,7 @@ func (a *PodAllocator) Init() error { // getActiveNetworkForNamespace returns the active network for the given pod's namespace // and is a wrapper around GetActiveNetworkForNamespace func (a *PodAllocator) getActiveNetworkForPod(pod *corev1.Pod) (util.NetInfo, error) { - activeNetwork, err := a.nadController.GetActiveNetworkForNamespace(pod.Namespace) + activeNetwork, err := a.networkManager.GetActiveNetworkForNamespace(pod.Namespace) if err != nil { if util.IsUnprocessedActiveNetworkError(err) { a.recordPodErrorEvent(pod, err) diff --git a/go-controller/pkg/clustermanager/pod/allocator_test.go b/go-controller/pkg/clustermanager/pod/allocator_test.go index f522eaa05cc..0600f167c0c 100644 --- a/go-controller/pkg/clustermanager/pod/allocator_test.go +++ b/go-controller/pkg/clustermanager/pod/allocator_test.go @@ -592,7 +592,7 @@ func TestPodAllocator_reconcileForNAD(t *testing.T) { } } - nadController := &nad.FakeNADController{PrimaryNetworks: nadNetworks} + fakeNetworkManager := &nad.FakeNetworkManager{PrimaryNetworks: nadNetworks} fakeRecorder := record.NewFakeRecorder(10) @@ -608,7 +608,7 @@ func TestPodAllocator_reconcileForNAD(t *testing.T) { releasedPodsMutex: sync.Mutex{}, ipamClaimsReconciler: ipamClaimsReconciler, recorder: fakeRecorder, - nadController: nadController, + networkManager: fakeNetworkManager, } var old, new *corev1.Pod diff --git a/go-controller/pkg/cni/cni.go b/go-controller/pkg/cni/cni.go index 8a84096daad..fcf86a3241d 100644 --- a/go-controller/pkg/cni/cni.go +++ b/go-controller/pkg/cni/cni.go @@ -107,11 +107,11 @@ func (pr *PodRequest) checkOrUpdatePodUID(pod *kapi.Pod) error { } func (pr *PodRequest) cmdAdd(kubeAuth *KubeAPIAuth, clientset *ClientSet, - nadController nad.NADController) (*Response, error) { - return pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientset, getCNIResult, nadController) + networkManager nad.NetworkManager) (*Response, error) { + return pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientset, getCNIResult, networkManager) } func (pr *PodRequest) cmdAddWithGetCNIResultFunc(kubeAuth *KubeAPIAuth, clientset *ClientSet, - getCNIResultFn getCNIResultFunc, nadController nad.NADController) (*Response, error) { + getCNIResultFn getCNIResultFunc, networkManager nad.NetworkManager) (*Response, error) { namespace := pr.PodNamespace podName := pr.PodName if namespace == "" || podName == "" { @@ -144,7 +144,7 @@ func (pr *PodRequest) cmdAddWithGetCNIResultFunc(kubeAuth *KubeAPIAuth, clientse // Get the IP address and MAC address of the pod // for DPU, ensure connection-details is present - primaryUDN := udn.NewPrimaryNetwork(nadController) + primaryUDN := udn.NewPrimaryNetwork(networkManager) if util.IsNetworkSegmentationSupportEnabled() { annotCondFn = primaryUDN.WaitForPrimaryAnnotationFn(namespace, annotCondFn) } @@ -293,7 +293,7 @@ func (pr *PodRequest) cmdCheck() error { // Argument '*PodRequest' encapsulates all the necessary information // kclient is passed in so that clientset can be reused from the server // Return value is the actual bytes to be sent back without further processing. -func HandlePodRequest(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, nadController nad.NADController) ([]byte, error) { +func HandlePodRequest(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, networkManager nad.NetworkManager) ([]byte, error) { var result, resultForLogging []byte var response *Response var err, err1 error @@ -301,7 +301,7 @@ func HandlePodRequest(request *PodRequest, clientset *ClientSet, kubeAuth *KubeA klog.Infof("%s %s starting CNI request %+v", request, request.Command, request) switch request.Command { case CNIAdd: - response, err = request.cmdAdd(kubeAuth, clientset, nadController) + response, err = request.cmdAdd(kubeAuth, clientset, networkManager) case CNIDel: response, err = request.cmdDel(clientset) case CNICheck: diff --git a/go-controller/pkg/cni/cni_test.go b/go-controller/pkg/cni/cni_test.go index ff436506065..2a28b4dde83 100644 --- a/go-controller/pkg/cni/cni_test.go +++ b/go-controller/pkg/cni/cni_test.go @@ -57,7 +57,7 @@ var _ = Describe("Network Segmentation", func() { } prInterfaceOpsStub = &podRequestInterfaceOpsStub{} enableMultiNetwork, enableNetworkSegmentation bool - nadController *ovntest.FakeNADController + fakeNetworkManager *ovntest.FakeNetworkManager ) BeforeEach(func() { @@ -153,13 +153,13 @@ var _ = Describe("Network Segmentation", func() { }, }, } - nadController = &ovntest.FakeNADController{ + fakeNetworkManager = &ovntest.FakeNetworkManager{ PrimaryNetworks: make(map[string]util.NetInfo), } }) It("should not fail at cmdAdd", func() { podNamespaceLister.On("Get", pr.PodName).Return(pod, nil) - Expect(pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientSet, getCNIResultStub, nadController)).NotTo(BeNil()) + Expect(pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientSet, getCNIResultStub, fakeNetworkManager)).NotTo(BeNil()) Expect(obtainedPodIterfaceInfos).ToNot(BeEmpty()) }) It("should not fail at cmdDel", func() { @@ -233,16 +233,16 @@ var _ = Describe("Network Segmentation", func() { nadLister.On("NetworkAttachmentDefinitions", "foo-ns").Return(nadNamespaceLister) nadNetwork, err := util.ParseNADInfo(nad) Expect(err).NotTo(HaveOccurred()) - nadController = &ovntest.FakeNADController{ + fakeNetworkManager = &ovntest.FakeNetworkManager{ PrimaryNetworks: make(map[string]util.NetInfo), } - nadController.PrimaryNetworks[nad.Namespace] = nadNetwork + fakeNetworkManager.PrimaryNetworks[nad.Namespace] = nadNetwork getCNIResultStub = dummyGetCNIResult }) It("should return the information of both the default net and the primary UDN in the result", func() { podNamespaceLister.On("Get", pr.PodName).Return(pod, nil) - response, err := pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientSet, getCNIResultStub, nadController) + response, err := pr.cmdAddWithGetCNIResultFunc(kubeAuth, clientSet, getCNIResultStub, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) // for every interface added, we return 2 interfaces; the host side of the // veth, then the pod side of the veth. diff --git a/go-controller/pkg/cni/cniserver.go b/go-controller/pkg/cni/cniserver.go index ee9f97e4f20..beaaae0f3b0 100644 --- a/go-controller/pkg/cni/cniserver.go +++ b/go-controller/pkg/cni/cniserver.go @@ -50,7 +50,7 @@ import ( // NewCNIServer creates and returns a new Server object which will listen on a socket in the given path func NewCNIServer(factory factory.NodeWatchFactory, kclient kubernetes.Interface, - nadController nad.NADController) (*Server, error) { + networkManager nad.NetworkManager) (*Server, error) { if config.OvnKubeNode.Mode == types.NodeModeDPU { return nil, fmt.Errorf("unsupported ovnkube-node mode for CNI server: %s", config.OvnKubeNode.Mode) } @@ -75,7 +75,7 @@ func NewCNIServer(factory factory.NodeWatchFactory, kclient kubernetes.Interface } if util.IsNetworkSegmentationSupportEnabled() { - s.nadController = nadController + s.networkManager = networkManager } if len(config.Kubernetes.CAData) > 0 { @@ -221,7 +221,7 @@ func (s *Server) handleCNIRequest(r *http.Request) ([]byte, error) { } defer req.cancel() - result, err := s.handlePodRequestFunc(req, s.clientSet, s.kubeAuth, s.nadController) + result, err := s.handlePodRequestFunc(req, s.clientSet, s.kubeAuth, s.networkManager) if err != nil { // Prefix error with request information for easier debugging return nil, fmt.Errorf("%s %v", req, err) diff --git a/go-controller/pkg/cni/cniserver_test.go b/go-controller/pkg/cni/cniserver_test.go index 86baa2eb66c..7f17dd5b19c 100644 --- a/go-controller/pkg/cni/cniserver_test.go +++ b/go-controller/pkg/cni/cniserver_test.go @@ -49,7 +49,7 @@ func clientDoCNI(t *testing.T, client *http.Client, req *Request) ([]byte, int) var expectedResult cnitypes.Result -func serverHandleCNI(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, nadController nad.NADController) ([]byte, error) { +func serverHandleCNI(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, networkManager nad.NetworkManager) ([]byte, error) { if request.Command == CNIAdd { return json.Marshal(&expectedResult) } else if request.Command == CNIDel || request.Command == CNIUpdate || request.Command == CNICheck { diff --git a/go-controller/pkg/cni/types.go b/go-controller/pkg/cni/types.go index 8be8edc2eab..469bb4d5687 100644 --- a/go-controller/pkg/cni/types.go +++ b/go-controller/pkg/cni/types.go @@ -168,7 +168,7 @@ type PodRequest struct { deviceInfo nadapi.DeviceInfo } -type podRequestFunc func(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, nadController nad.NADController) ([]byte, error) +type podRequestFunc func(request *PodRequest, clientset *ClientSet, kubeAuth *KubeAPIAuth, networkManager nad.NetworkManager) ([]byte, error) type getCNIResultFunc func(request *PodRequest, getter PodInfoGetter, podInterfaceInfo *PodInterfaceInfo) (*current.Result, error) type PodInfoGetter interface { @@ -195,5 +195,5 @@ type Server struct { handlePodRequestFunc podRequestFunc clientSet *ClientSet kubeAuth *KubeAPIAuth - nadController nad.NADController + networkManager nad.NetworkManager } diff --git a/go-controller/pkg/cni/udn/primary_network.go b/go-controller/pkg/cni/udn/primary_network.go index 10fcc2c359e..055ee313483 100644 --- a/go-controller/pkg/cni/udn/primary_network.go +++ b/go-controller/pkg/cni/udn/primary_network.go @@ -14,14 +14,14 @@ import ( type podAnnotWaitCond = func(map[string]string, string) (*util.PodAnnotation, bool) type UserDefinedPrimaryNetwork struct { - nadController nad.NADController - annotation *util.PodAnnotation - activeNetwork util.NetInfo + networkManager nad.NetworkManager + annotation *util.PodAnnotation + activeNetwork util.NetInfo } -func NewPrimaryNetwork(nadController nad.NADController) *UserDefinedPrimaryNetwork { +func NewPrimaryNetwork(networkManager nad.NetworkManager) *UserDefinedPrimaryNetwork { return &UserDefinedPrimaryNetwork{ - nadController: nadController, + networkManager: networkManager, } } @@ -123,7 +123,7 @@ func (p *UserDefinedPrimaryNetwork) ensureActiveNetwork(namespace string) error if p.activeNetwork != nil { return nil } - activeNetwork, err := p.nadController.GetActiveNetworkForNamespace(namespace) + activeNetwork, err := p.networkManager.GetActiveNetworkForNamespace(namespace) if err != nil { return err } diff --git a/go-controller/pkg/cni/udn/primary_network_test.go b/go-controller/pkg/cni/udn/primary_network_test.go index 08cb692fa4f..669ccd431d2 100644 --- a/go-controller/pkg/cni/udn/primary_network_test.go +++ b/go-controller/pkg/cni/udn/primary_network_test.go @@ -188,20 +188,20 @@ func TestWaitForPrimaryAnnotationFn(t *testing.T) { return tt.annotationFromFn, tt.isReadyFromFn } - nadController := &nad.FakeNADController{ + fakeNetworkManager := &nad.FakeNetworkManager{ PrimaryNetworks: map[string]util.NetInfo{}, } for _, nad := range tt.nads { nadNetwork, _ := util.ParseNADInfo(nad) nadNetwork.SetNADs(util.GetNADName(nad.Namespace, nad.Name)) if nadNetwork.IsPrimaryNetwork() { - if _, loaded := nadController.PrimaryNetworks[nad.Namespace]; !loaded { - nadController.PrimaryNetworks[nad.Namespace] = nadNetwork + if _, loaded := fakeNetworkManager.PrimaryNetworks[nad.Namespace]; !loaded { + fakeNetworkManager.PrimaryNetworks[nad.Namespace] = nadNetwork } } } - userDefinedPrimaryNetwork := NewPrimaryNetwork(nadController) + userDefinedPrimaryNetwork := NewPrimaryNetwork(fakeNetworkManager) obtainedAnnotation, obtainedIsReady := userDefinedPrimaryNetwork.WaitForPrimaryAnnotationFn(tt.namespace, waitCond)(tt.annotations, tt.nadName) obtainedFound := userDefinedPrimaryNetwork.Found() obtainedNetworkName := userDefinedPrimaryNetwork.NetworkName() diff --git a/go-controller/pkg/network-attach-def-controller/network_attach_def_controller.go b/go-controller/pkg/network-attach-def-controller/network_attach_def_controller.go index 334111aac36..4eaa0281017 100644 --- a/go-controller/pkg/network-attach-def-controller/network_attach_def_controller.go +++ b/go-controller/pkg/network-attach-def-controller/network_attach_def_controller.go @@ -63,10 +63,15 @@ type watchFactory interface { NodeCoreInformer() coreinformers.NodeInformer } +// NetworkManager provides information about networks +type NetworkManager interface { + GetActiveNetworkForNamespace(namespace string) (util.NetInfo, error) +} + type NADController interface { + NetworkManager Start() error Stop() - GetActiveNetworkForNamespace(namespace string) (util.NetInfo, error) } // NADController handles namespaced scoped NAD events and diff --git a/go-controller/pkg/network-attach-def-controller/network_attach_def_controller_test.go b/go-controller/pkg/network-attach-def-controller/network_attach_def_controller_test.go index 55b7e102105..092ecfbe17d 100644 --- a/go-controller/pkg/network-attach-def-controller/network_attach_def_controller_test.go +++ b/go-controller/pkg/network-attach-def-controller/network_attach_def_controller_test.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "reflect" "sync" "testing" @@ -513,9 +512,9 @@ func TestNetAttachDefinitionController(t *testing.T) { fmt.Sprintf("matching network config for network %s", name)) g.Expect(tncm.controllers[testNetworkKey].GetNADs()).To(gomega.ConsistOf(expected.nads), fmt.Sprintf("matching NADs for network %s", name)) + expectRunning = append(expectRunning, testNetworkKey) } }() - expectRunning = append(expectRunning, testNetworkKey) if netInfo.IsPrimaryNetwork() && !netInfo.IsDefault() { key := expected.nads[0] namespace, _, err := cache.SplitMetaNamespaceKey(key) @@ -523,7 +522,6 @@ func TestNetAttachDefinitionController(t *testing.T) { netInfoFound, err := nadController.GetActiveNetworkForNamespace(namespace) g.Expect(err).ToNot(gomega.HaveOccurred()) g.Expect(netInfoFound.Equals(netInfo)).To(gomega.BeTrue()) - g.Expect(reflect.DeepEqual(netInfoFound, netInfo)).To(gomega.BeTrue()) g.Expect(netInfoFound.GetNADs()).To(gomega.ConsistOf(expected.nads)) } } diff --git a/go-controller/pkg/network-attach-def-controller/network_manager.go b/go-controller/pkg/network-attach-def-controller/network_manager.go index 7f2ab8a8cd8..fcc3f46cde0 100644 --- a/go-controller/pkg/network-attach-def-controller/network_manager.go +++ b/go-controller/pkg/network-attach-def-controller/network_manager.go @@ -124,7 +124,6 @@ type networkManagerImpl struct { raLister ralisters.RouteAdvertisementsLister nodeLister corelisters.NodeLister - controller controller.Reconciler networkReconciler controller.Reconciler raController controller.Controller nodeController controller.Controller @@ -167,7 +166,7 @@ func (nm *networkManagerImpl) Stop() { func (nm *networkManagerImpl) EnsureNetwork(network util.NetInfo) { nm.setNetwork(network.GetNetworkName(), network) - nm.controller.Reconcile(network.GetNetworkName()) + nm.networkReconciler.Reconcile(network.GetNetworkName()) } func (nm *networkManagerImpl) DeleteNetwork(network string) { @@ -179,7 +178,7 @@ func (nm *networkManagerImpl) DeleteNetwork(network string) { default: nm.setNetwork(network, nil) } - nm.controller.Reconcile(network) + nm.networkReconciler.Reconcile(network) } func (nm *networkManagerImpl) setNetwork(network string, netInfo util.NetInfo) { diff --git a/go-controller/pkg/node/default_node_network_controller.go b/go-controller/pkg/node/default_node_network_controller.go index 6a4d727f37d..d6c0be5fa67 100644 --- a/go-controller/pkg/node/default_node_network_controller.go +++ b/go-controller/pkg/node/default_node_network_controller.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - nad "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "net" "os" "strconv" @@ -12,6 +11,8 @@ import ( "sync" "time" + nad "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" + kapi "k8s.io/api/core/v1" discovery "k8s.io/api/discovery/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -114,7 +115,7 @@ type DefaultNodeNetworkController struct { apbExternalRouteNodeController *apbroute.ExternalGatewayNodeController - nadController nad.NADController + networkManager nad.NetworkManager cniServer *cni.Server } @@ -134,7 +135,7 @@ func newDefaultNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, sto } // NewDefaultNodeNetworkController creates a new network controller for node management of the default network -func NewDefaultNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, nadController nad.NADController) (*DefaultNodeNetworkController, error) { +func NewDefaultNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, networkManager nad.NetworkManager) (*DefaultNodeNetworkController, error) { var err error stopChan := make(chan struct{}) wg := &sync.WaitGroup{} @@ -158,7 +159,7 @@ func NewDefaultNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, nad return nil, err } - nc.nadController = nadController + nc.networkManager = networkManager nc.initRetryFrameworkForNode() @@ -828,7 +829,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error { if !ok { return fmt.Errorf("cannot get kubeclient for starting CNI server") } - cniServer, err = cni.NewCNIServer(nc.watchFactory, kclient.KClient, nc.nadController) + cniServer, err = cni.NewCNIServer(nc.watchFactory, kclient.KClient, nc.networkManager) if err != nil { return err } diff --git a/go-controller/pkg/node/gateway_init.go b/go-controller/pkg/node/gateway_init.go index 17bf6a7b9cb..6b6ddf0c14a 100644 --- a/go-controller/pkg/node/gateway_init.go +++ b/go-controller/pkg/node/gateway_init.go @@ -361,11 +361,11 @@ func (nc *DefaultNodeNetworkController) initGateway(subnets []*net.IPNet, nodeAn case config.GatewayModeLocal: klog.Info("Preparing Local Gateway") gw, err = newLocalGateway(nc.name, subnets, gatewayNextHops, gatewayIntf, egressGWInterface, ifAddrs, nodeAnnotator, - managementPortConfig, nc.Kube, nc.watchFactory, nc.routeManager, nc.nadController) + managementPortConfig, nc.Kube, nc.watchFactory, nc.routeManager, nc.networkManager) case config.GatewayModeShared: klog.Info("Preparing Shared Gateway") gw, err = newSharedGateway(nc.name, subnets, gatewayNextHops, gatewayIntf, egressGWInterface, ifAddrs, nodeAnnotator, nc.Kube, - managementPortConfig, nc.watchFactory, nc.routeManager, nc.nadController) + managementPortConfig, nc.watchFactory, nc.routeManager, nc.networkManager) case config.GatewayModeDisabled: var chassisID string klog.Info("Gateway Mode is disabled") @@ -498,7 +498,7 @@ func (nc *DefaultNodeNetworkController) initGatewayDPUHost(kubeNodeIP net.IP) er if err := initSharedGatewayIPTables(); err != nil { return err } - gw.nodePortWatcherIptables = newNodePortWatcherIptables(nc.nadController) + gw.nodePortWatcherIptables = newNodePortWatcherIptables(nc.networkManager) gw.loadBalancerHealthChecker = newLoadBalancerHealthChecker(nc.name, nc.watchFactory) portClaimWatcher, err := newPortClaimWatcher(nc.recorder) if err != nil { diff --git a/go-controller/pkg/node/gateway_init_linux_test.go b/go-controller/pkg/node/gateway_init_linux_test.go index c7ccef24fde..7bfac2fb2ca 100644 --- a/go-controller/pkg/node/gateway_init_linux_test.go +++ b/go-controller/pkg/node/gateway_init_linux_test.go @@ -32,7 +32,6 @@ import ( udnfakeclient "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/userdefinednetwork/v1/apis/clientset/versioned/fake" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/kube" - networkAttachDefController "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/routemanager" ovntest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" linkMock "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/mocks/github.com/vishvananda/netlink" @@ -249,15 +248,7 @@ func shareGatewayInterfaceTest(app *cli.App, testNS ns.NetNS, err = nodeAnnotator.Run() Expect(err).NotTo(HaveOccurred()) rm := routemanager.NewController() - var nadController networkAttachDefController.NADController - if util.IsNetworkSegmentationSupportEnabled() { - testNCM := &nad.FakeNetworkControllerManager{} - nadController, err = networkAttachDefController.NewNodeNADController("test", "node", testNCM, wf) - Expect(err).NotTo(HaveOccurred()) - err = nadController.Start() - Expect(err).NotTo(HaveOccurred()) - defer nadController.Stop() - } + fakeNetworkManager := &nad.FakeNetworkManager{} Expect(err).NotTo(HaveOccurred()) wg.Add(1) go testNS.Do(func(netNS ns.NetNS) error { @@ -306,7 +297,7 @@ func shareGatewayInterfaceTest(app *cli.App, testNS ns.NetNS, Expect(err).NotTo(HaveOccurred()) ifAddrs := ovntest.MustParseIPNets(eth0CIDR) sharedGw, err := newSharedGateway(nodeName, ovntest.MustParseIPNets(nodeSubnet), gatewayNextHops, gatewayIntf, "", ifAddrs, nodeAnnotator, k, - &fakeMgmtPortConfig, wf, rm, nadController) + &fakeMgmtPortConfig, wf, rm, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) err = sharedGw.Init(stop, wg) Expect(err).NotTo(HaveOccurred()) @@ -677,15 +668,7 @@ func shareGatewayInterfaceDPUTest(app *cli.App, testNS ns.NetNS, runtime.LockOSThread() defer runtime.UnlockOSThread() rm := routemanager.NewController() - var nadController networkAttachDefController.NADController - if util.IsNetworkSegmentationSupportEnabled() { - testNCM := &nad.FakeNetworkControllerManager{} - nadController, err = networkAttachDefController.NewNodeNADController("test", "node", testNCM, wf) - Expect(err).NotTo(HaveOccurred()) - err = nadController.Start() - Expect(err).NotTo(HaveOccurred()) - defer nadController.Stop() - } + fakeNetworkManager := &nad.FakeNetworkManager{} wg.Add(1) go testNS.Do(func(netNS ns.NetNS) error { defer GinkgoRecover() @@ -702,7 +685,7 @@ func shareGatewayInterfaceDPUTest(app *cli.App, testNS ns.NetNS, gatewayNextHops, gatewayIntf, err := getGatewayNextHops() Expect(err).NotTo(HaveOccurred()) sharedGw, err := newSharedGateway(nodeName, ovntest.MustParseIPNets(nodeSubnet), gatewayNextHops, - gatewayIntf, "", ifAddrs, nodeAnnotator, k, &fakeMgmtPortConfig, wf, rm, nadController) + gatewayIntf, "", ifAddrs, nodeAnnotator, k, &fakeMgmtPortConfig, wf, rm, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) err = sharedGw.Init(stop, wg) Expect(err).NotTo(HaveOccurred()) @@ -1132,15 +1115,7 @@ OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0` ip, ipNet, _ := net.ParseCIDR(eth0CIDR) ipNet.IP = ip rm := routemanager.NewController() - var nadController networkAttachDefController.NADController - if util.IsNetworkSegmentationSupportEnabled() { - testNCM := &nad.FakeNetworkControllerManager{} - nadController, err = networkAttachDefController.NewNodeNADController("test", "node", testNCM, wf) - Expect(err).NotTo(HaveOccurred()) - err = nadController.Start() - Expect(err).NotTo(HaveOccurred()) - defer nadController.Stop() - } + fakeNetworkManager := &nad.FakeNetworkManager{} go testNS.Do(func(netNS ns.NetNS) error { defer GinkgoRecover() rm.Run(stop, 10*time.Second) @@ -1154,7 +1129,7 @@ OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0` Expect(err).NotTo(HaveOccurred()) ifAddrs := ovntest.MustParseIPNets(eth0CIDR) localGw, err := newLocalGateway(nodeName, ovntest.MustParseIPNets(nodeSubnet), gatewayNextHops, gatewayIntf, "", ifAddrs, - nodeAnnotator, &fakeMgmtPortConfig, k, wf, rm, nadController) + nodeAnnotator, &fakeMgmtPortConfig, k, wf, rm, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) err = localGw.Init(stop, wg) Expect(err).NotTo(HaveOccurred()) diff --git a/go-controller/pkg/node/gateway_localnet.go b/go-controller/pkg/node/gateway_localnet.go index cba700259f2..f61f6fdaf19 100644 --- a/go-controller/pkg/node/gateway_localnet.go +++ b/go-controller/pkg/node/gateway_localnet.go @@ -23,7 +23,7 @@ import ( func newLocalGateway(nodeName string, hostSubnets []*net.IPNet, gwNextHops []net.IP, gwIntf, egressGWIntf string, gwIPs []*net.IPNet, nodeAnnotator kube.Annotator, cfg *managementPortConfig, kube kube.Interface, watchFactory factory.NodeWatchFactory, - routeManager *routemanager.Controller, nadController nad.NADController) (*gateway, error) { + routeManager *routemanager.Controller, networkManager nad.NetworkManager) (*gateway, error) { klog.Info("Creating new local gateway") gw := &gateway{} @@ -160,7 +160,7 @@ func newLocalGateway(nodeName string, hostSubnets []*net.IPNet, gwNextHops []net return err } } - gw.nodePortWatcher, err = newNodePortWatcher(gwBridge, gw.openflowManager, gw.nodeIPManager, watchFactory, nadController) + gw.nodePortWatcher, err = newNodePortWatcher(gwBridge, gw.openflowManager, gw.nodeIPManager, watchFactory, networkManager) if err != nil { return err } diff --git a/go-controller/pkg/node/gateway_localnet_linux_test.go b/go-controller/pkg/node/gateway_localnet_linux_test.go index f3136d5a22e..f998174ddc3 100644 --- a/go-controller/pkg/node/gateway_localnet_linux_test.go +++ b/go-controller/pkg/node/gateway_localnet_linux_test.go @@ -14,6 +14,7 @@ import ( nodeipt "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/iptables" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/retry" ovntest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" + "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util/mocks" @@ -72,6 +73,7 @@ func initFakeNodePortWatcher(iptV4, iptV6 util.IPTablesHelper) *nodePortWatcher }, }, }, + networkManager: &nad.FakeNetworkManager{}, } return &fNPW } diff --git a/go-controller/pkg/node/gateway_shared_intf.go b/go-controller/pkg/node/gateway_shared_intf.go index a00f3d9620e..e149d0e1599 100644 --- a/go-controller/pkg/node/gateway_shared_intf.go +++ b/go-controller/pkg/node/gateway_shared_intf.go @@ -61,12 +61,12 @@ const ( // nodePortWatcherIptables manages iptables rules for shared gateway // to ensure that services using NodePorts are accessible. type nodePortWatcherIptables struct { - nadController nad.NADController + networkManager nad.NetworkManager } -func newNodePortWatcherIptables(nadController nad.NADController) *nodePortWatcherIptables { +func newNodePortWatcherIptables(networkManager nad.NetworkManager) *nodePortWatcherIptables { return &nodePortWatcherIptables{ - nadController: nadController, + networkManager: networkManager, } } @@ -84,7 +84,7 @@ type nodePortWatcher struct { serviceInfoLock sync.Mutex ofm *openflowManager nodeIPManager *addressManager - nadController nad.NADController + networkManager nad.NetworkManager watchFactory factory.NodeWatchFactory } @@ -648,7 +648,7 @@ func (npw *nodePortWatcher) AddService(service *kapi.Service) error { klog.V(5).Infof("Adding service %s in namespace %s", service.Name, service.Namespace) - netInfo, err := npw.nadController.GetActiveNetworkForNamespace(service.Namespace) + netInfo, err := npw.networkManager.GetActiveNetworkForNamespace(service.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", service.Name, service.Namespace, err) } @@ -719,7 +719,7 @@ func (npw *nodePortWatcher) UpdateService(old, new *kapi.Service) error { if util.ServiceTypeHasClusterIP(new) && util.IsClusterIPSet(new) { klog.V(5).Infof("Adding new service rules for: %v", new) - netInfo, err := npw.nadController.GetActiveNetworkForNamespace(new.Namespace) + netInfo, err := npw.networkManager.GetActiveNetworkForNamespace(new.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", new.Name, new.Namespace, err) } @@ -839,7 +839,7 @@ func (npw *nodePortWatcher) SyncServices(services []interface{}) error { hasLocalHostNetworkEp := util.HasLocalHostNetworkEndpoints(localEndpoints, nodeIPs) npw.getAndSetServiceInfo(name, service, hasLocalHostNetworkEp, localEndpoints) - netInfo, err := npw.nadController.GetActiveNetworkForNamespace(service.Namespace) + netInfo, err := npw.networkManager.GetActiveNetworkForNamespace(service.Namespace) if err != nil { errors = append(errors, err) continue @@ -908,7 +908,7 @@ func (npw *nodePortWatcher) AddEndpointSlice(epSlice *discovery.EndpointSlice) e localEndpoints := npw.GetLocalEligibleEndpointAddresses(epSlices, svc) hasLocalHostNetworkEp := util.HasLocalHostNetworkEndpoints(localEndpoints, nodeIPs) - netInfo, err := npw.nadController.GetActiveNetworkForNamespace(svc.Namespace) + netInfo, err := npw.networkManager.GetActiveNetworkForNamespace(svc.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", svc.Name, svc.Namespace, err) } @@ -971,7 +971,7 @@ func (npw *nodePortWatcher) DeleteEndpointSlice(epSlice *discovery.EndpointSlice } localEndpoints := npw.GetLocalEligibleEndpointAddresses(epSlices, svc) if svcConfig, exists := npw.updateServiceInfo(namespacedName, nil, &hasLocalHostNetworkEp, localEndpoints); exists { - netInfo, err := npw.nadController.GetActiveNetworkForNamespace(namespacedName.Namespace) + netInfo, err := npw.networkManager.GetActiveNetworkForNamespace(namespacedName.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", svc.Name, svc.Namespace, err) } @@ -1083,7 +1083,7 @@ func (npwipt *nodePortWatcherIptables) AddService(service *kapi.Service) error { return nil } - netInfo, err := npwipt.nadController.GetActiveNetworkForNamespace(service.Namespace) + netInfo, err := npwipt.networkManager.GetActiveNetworkForNamespace(service.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", service.Name, service.Namespace, err) } @@ -1111,7 +1111,7 @@ func (npwipt *nodePortWatcherIptables) UpdateService(old, new *kapi.Service) err } if util.ServiceTypeHasClusterIP(new) && util.IsClusterIPSet(new) { - netInfo, err := npwipt.nadController.GetActiveNetworkForNamespace(new.Namespace) + netInfo, err := npwipt.networkManager.GetActiveNetworkForNamespace(new.Namespace) if err != nil { return fmt.Errorf("error getting active network for service %s in namespace %s: %w", new.Name, new.Namespace, err) } @@ -1889,7 +1889,7 @@ func initSvcViaMgmPortRoutingRules(hostSubnets []*net.IPNet) error { func newSharedGateway(nodeName string, subnets []*net.IPNet, gwNextHops []net.IP, gwIntf, egressGWIntf string, gwIPs []*net.IPNet, nodeAnnotator kube.Annotator, kube kube.Interface, cfg *managementPortConfig, - watchFactory factory.NodeWatchFactory, routeManager *routemanager.Controller, nadController nad.NADController) (*gateway, error) { + watchFactory factory.NodeWatchFactory, routeManager *routemanager.Controller, networkManager nad.NetworkManager) (*gateway, error) { klog.Info("Creating new shared gateway") gw := &gateway{} @@ -2007,7 +2007,7 @@ func newSharedGateway(nodeName string, subnets []*net.IPNet, gwNextHops []net.IP } } klog.Info("Creating Shared Gateway Node Port Watcher") - gw.nodePortWatcher, err = newNodePortWatcher(gwBridge, gw.openflowManager, gw.nodeIPManager, watchFactory, nadController) + gw.nodePortWatcher, err = newNodePortWatcher(gwBridge, gw.openflowManager, gw.nodeIPManager, watchFactory, networkManager) if err != nil { return err } @@ -2029,7 +2029,7 @@ func newSharedGateway(nodeName string, subnets []*net.IPNet, gwNextHops []net.IP func newNodePortWatcher(gwBridge *bridgeConfiguration, ofm *openflowManager, nodeIPManager *addressManager, watchFactory factory.NodeWatchFactory, - nadController nad.NADController) (*nodePortWatcher, error) { + networkManager nad.NetworkManager) (*nodePortWatcher, error) { // Get ofport of physical interface ofportPhys, stderr, err := util.GetOVSOfPort("--if-exists", "get", @@ -2082,16 +2082,16 @@ func newNodePortWatcher(gwBridge *bridgeConfiguration, ofm *openflowManager, gatewayIPv4, gatewayIPv6 := getGatewayFamilyAddrs(gwBridge.ips) npw := &nodePortWatcher{ - dpuMode: dpuMode, - gatewayIPv4: gatewayIPv4, - gatewayIPv6: gatewayIPv6, - ofportPhys: ofportPhys, - gwBridge: gwBridge.bridgeName, - serviceInfo: make(map[ktypes.NamespacedName]*serviceConfig), - nodeIPManager: nodeIPManager, - ofm: ofm, - watchFactory: watchFactory, - nadController: nadController, + dpuMode: dpuMode, + gatewayIPv4: gatewayIPv4, + gatewayIPv6: gatewayIPv6, + ofportPhys: ofportPhys, + gwBridge: gwBridge.bridgeName, + serviceInfo: make(map[ktypes.NamespacedName]*serviceConfig), + nodeIPManager: nodeIPManager, + ofm: ofm, + watchFactory: watchFactory, + networkManager: networkManager, } return npw, nil } diff --git a/go-controller/pkg/node/gateway_udn_test.go b/go-controller/pkg/node/gateway_udn_test.go index d0903a0427f..fb04a50e7a1 100644 --- a/go-controller/pkg/node/gateway_udn_test.go +++ b/go-controller/pkg/node/gateway_udn_test.go @@ -27,7 +27,6 @@ import ( "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory" factoryMocks "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory/mocks" kubemocks "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/kube/mocks" - networkAttachDefController "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/iprulemanager" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/routemanager" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/vrfmanager" @@ -575,13 +574,11 @@ var _ = Describe("UserDefinedNetworkGateway", func() { defer GinkgoRecover() gatewayNextHops, gatewayIntf, err := getGatewayNextHops() Expect(err).NotTo(HaveOccurred()) - testNCM := &fakenad.FakeNetworkControllerManager{} - nadController, err := networkAttachDefController.NewNodeNADController("test", "node", testNCM, wf) - Expect(err).NotTo(HaveOccurred()) + fakeNetworkManager := &fakenad.FakeNetworkManager{} // make preparations for creating openflow manager in DNCC which can be used for SNCC localGw, err := newLocalGateway(nodeName, ovntest.MustParseIPNets(v4NodeSubnet, v6NodeSubnet), gatewayNextHops, - gatewayIntf, "", ifAddrs, nodeAnnotatorMock, &fakeMgmtPortConfig, &kubeMock, wf, rm, nadController) + gatewayIntf, "", ifAddrs, nodeAnnotatorMock, &fakeMgmtPortConfig, &kubeMock, wf, rm, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) stop := make(chan struct{}) wg := &sync.WaitGroup{} @@ -773,12 +770,10 @@ var _ = Describe("UserDefinedNetworkGateway", func() { defer GinkgoRecover() gatewayNextHops, gatewayIntf, err := getGatewayNextHops() Expect(err).NotTo(HaveOccurred()) - testNCM := &fakenad.FakeNetworkControllerManager{} - nadController, err := networkAttachDefController.NewNodeNADController("test", "node", testNCM, wf) - Expect(err).NotTo(HaveOccurred()) + fakeNetworkManager := &fakenad.FakeNetworkManager{} // make preparations for creating openflow manager in DNCC which can be used for SNCC localGw, err := newLocalGateway(nodeName, ovntest.MustParseIPNets(v4NodeSubnet, v6NodeSubnet), gatewayNextHops, - gatewayIntf, "", ifAddrs, nodeAnnotatorMock, &fakeMgmtPortConfig, &kubeMock, wf, rm, nadController) + gatewayIntf, "", ifAddrs, nodeAnnotatorMock, &fakeMgmtPortConfig, &kubeMock, wf, rm, fakeNetworkManager) Expect(err).NotTo(HaveOccurred()) stop := make(chan struct{}) wg := &sync.WaitGroup{} diff --git a/go-controller/pkg/ovn/base_network_controller.go b/go-controller/pkg/ovn/base_network_controller.go index 85da29586a7..a6a3cd53839 100644 --- a/go-controller/pkg/ovn/base_network_controller.go +++ b/go-controller/pkg/ovn/base_network_controller.go @@ -164,8 +164,8 @@ type BaseNetworkController struct { // to the cluster router. Please see zone_interconnect/interconnect_handler.go for more details. zoneICHandler *zoneic.ZoneInterconnectHandler - // nadController used for getting network information for UDNs - nadController nad.NADController + // networkManager used for getting network information for UDNs + networkManager nad.NetworkManager // releasedPodsBeforeStartup tracks pods per NAD (map of NADs to pods UIDs) // might have been already be released on startup releasedPodsBeforeStartup map[string]sets.Set[string] @@ -808,7 +808,7 @@ func (bnc *BaseNetworkController) isLocalZoneNode(node *kapi.Node) bool { // and is a wrapper around GetActiveNetworkForNamespace func (bnc *BaseNetworkController) getActiveNetworkForNamespace(namespace string) (util.NetInfo, error) { - return bnc.nadController.GetActiveNetworkForNamespace(namespace) + return bnc.networkManager.GetActiveNetworkForNamespace(namespace) } // GetNetworkRole returns the role of this controller's diff --git a/go-controller/pkg/ovn/controller/services/services_controller.go b/go-controller/pkg/ovn/controller/services/services_controller.go index 6ce13ffcc89..0f59cbd1d22 100644 --- a/go-controller/pkg/ovn/controller/services/services_controller.go +++ b/go-controller/pkg/ovn/controller/services/services_controller.go @@ -63,7 +63,7 @@ func NewController(client clientset.Interface, serviceInformer coreinformers.ServiceInformer, endpointSliceInformer discoveryinformers.EndpointSliceInformer, nodeInformer coreinformers.NodeInformer, - nadController networkAttachDefController.NADController, + networkManager networkAttachDefController.NetworkManager, recorder record.EventRecorder, netInfo util.NetInfo, ) (*Controller, error) { @@ -83,7 +83,7 @@ func NewController(client clientset.Interface, serviceLister: serviceInformer.Lister(), endpointSliceInformer: endpointSliceInformer, endpointSliceLister: endpointSliceInformer.Lister(), - nadController: nadController, + networkManager: networkManager, eventRecorder: recorder, repair: newRepair(serviceInformer.Lister(), nbClient), @@ -117,7 +117,7 @@ type Controller struct { endpointSliceInformer discoveryinformers.EndpointSliceInformer endpointSliceLister discoverylisters.EndpointSliceLister - nadController networkAttachDefController.NADController + networkManager networkAttachDefController.NetworkManager nodesSynced cache.InformerSynced @@ -569,7 +569,7 @@ func (c *Controller) RequestFullSync(nodeInfos []nodeInfo) { // belong to the network that this service controller is responsible for. func (c *Controller) skipService(name, namespace string) bool { if util.IsNetworkSegmentationSupportEnabled() { - serviceNetwork, err := c.nadController.GetActiveNetworkForNamespace(namespace) + serviceNetwork, err := c.networkManager.GetActiveNetworkForNamespace(namespace) if err != nil { utilruntime.HandleError(fmt.Errorf("failed to retrieve network for service %s/%s: %w", namespace, name, err)) diff --git a/go-controller/pkg/ovn/controller/services/services_controller_test.go b/go-controller/pkg/ovn/controller/services/services_controller_test.go index bfb5d2f0668..caa9bc0ee97 100644 --- a/go-controller/pkg/ovn/controller/services/services_controller_test.go +++ b/go-controller/pkg/ovn/controller/services/services_controller_test.go @@ -28,7 +28,6 @@ import ( "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory" libovsdbutil "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/util" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/nbdb" - networkAttachDefController "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" kubetest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" libovsdbtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/libovsdb" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" @@ -85,8 +84,7 @@ func newControllerWithDBSetupForNetwork(dbSetup libovsdbtest.TestSetup, netInfo return nil, err } } - testNCM := &nad.FakeNetworkControllerManager{} - nadController, err := networkAttachDefController.NewZoneNADController("test", "zone", testNCM, factoryMock) + fakeNetworkManager := &nad.FakeNetworkManager{} if err != nil { return nil, err } @@ -96,7 +94,7 @@ func newControllerWithDBSetupForNetwork(dbSetup libovsdbtest.TestSetup, netInfo factoryMock.ServiceCoreInformer(), factoryMock.EndpointSliceCoreInformer(), factoryMock.NodeCoreInformer(), - nadController, + fakeNetworkManager, recorder, netInfo, ) @@ -1491,10 +1489,6 @@ func TestSyncServices(t *testing.T) { if err != nil { t.Fatalf("Error creating controller: %v", err) } - if err := controller.nadController.Start(); err != nil { - t.Fatalf("Error starting NAD controller: %v", err) - } - defer controller.nadController.Stop() defer controller.close() // Add k8s objects diff --git a/go-controller/pkg/ovn/default_network_controller.go b/go-controller/pkg/ovn/default_network_controller.go index a46056e76ba..f8dcc7cdcc9 100644 --- a/go-controller/pkg/ovn/default_network_controller.go +++ b/go-controller/pkg/ovn/default_network_controller.go @@ -152,7 +152,7 @@ func NewDefaultNetworkController(cnci *CommonNetworkControllerInfo, nadControlle func newDefaultNetworkControllerCommon(cnci *CommonNetworkControllerInfo, defaultStopChan chan struct{}, defaultWg *sync.WaitGroup, - addressSetFactory addressset.AddressSetFactory, nadController nad.NADController, + addressSetFactory addressset.AddressSetFactory, networkManager nad.NetworkManager, observManager *observability.Manager) (*DefaultNetworkController, error) { if addressSetFactory == nil { @@ -164,7 +164,7 @@ func newDefaultNetworkControllerCommon(cnci *CommonNetworkControllerInfo, cnci.watchFactory.ServiceCoreInformer(), cnci.watchFactory.EndpointSliceCoreInformer(), cnci.watchFactory.NodeCoreInformer(), - nadController, + networkManager, cnci.recorder, &util.DefaultNetInfo{}, ) @@ -213,7 +213,7 @@ func newDefaultNetworkControllerCommon(cnci *CommonNetworkControllerInfo, zoneICHandler: zoneICHandler, cancelableCtx: util.NewCancelableContext(), observManager: observManager, - nadController: nadController, + networkManager: networkManager, }, externalGatewayRouteInfo: apbExternalRouteController.ExternalGWRouteInfoCache, eIPC: egressIPZoneController{ diff --git a/go-controller/pkg/ovn/hybrid_test.go b/go-controller/pkg/ovn/hybrid_test.go index 0bdd7197434..fc213635288 100644 --- a/go-controller/pkg/ovn/hybrid_test.go +++ b/go-controller/pkg/ovn/hybrid_test.go @@ -36,6 +36,7 @@ import ( ovntest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" libovsdbtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/libovsdb" + nadtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -211,8 +212,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { libovsdbOvnNBClient, libovsdbOvnSBClient, libovsdbCleanup, err = libovsdbtest.NewNBSBTestHarness(dbSetup) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) c, cancel := context.WithCancel(ctx.Context) defer cancel() @@ -369,8 +379,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { expectedDatabaseState := []libovsdbtest.TestData{ovnClusterRouterLRP} expectedDatabaseState = addNodeLogicalFlows(expectedDatabaseState, expectedOVNClusterRouter, expectedNodeSwitch, expectedClusterRouterPortGroup, expectedClusterPortGroup, &node1) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -666,8 +685,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { libovsdbOvnNBClient, libovsdbOvnSBClient, libovsdbCleanup, err = libovsdbtest.NewNBSBTestHarness(dbSetup) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -838,8 +866,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { expectedDatabaseState := []libovsdbtest.TestData{ovnClusterRouterLRP} expectedDatabaseState = addNodeLogicalFlows(expectedDatabaseState, expectedOVNClusterRouter, expectedNodeSwitch, expectedClusterRouterPortGroup, expectedClusterPortGroup, &node1) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -1122,8 +1159,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { libovsdbOvnNBClient, libovsdbOvnSBClient, libovsdbCleanup, err = libovsdbtest.NewNBSBTestHarness(dbSetup) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -1324,8 +1370,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { libovsdbOvnNBClient, libovsdbOvnSBClient, libovsdbCleanup, err = libovsdbtest.NewNBSBTestHarness(dbSetup) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - clusterController, err := NewOvnController(fakeClient.GetMasterClientset(), f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient.GetMasterClientset(), + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -1518,8 +1573,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { expectedDatabaseState := []libovsdbtest.TestData{ovnClusterRouterLRP} expectedDatabaseState = addNodeLogicalFlows(expectedDatabaseState, expectedOVNClusterRouter, expectedNodeSwitch, expectedClusterRouterPortGroup, expectedClusterPortGroup, &node1) - clusterController, err := NewOvnController(fakeClient, f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient, + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true @@ -1740,8 +1804,17 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() { libovsdbOvnNBClient, libovsdbOvnSBClient, libovsdbCleanup, err = libovsdbtest.NewNBSBTestHarness(dbSetup) gomega.Expect(err).NotTo(gomega.HaveOccurred()) - clusterController, err := NewOvnController(fakeClient, f, stopChan, nil, libovsdbOvnNBClient, libovsdbOvnSBClient, - record.NewFakeRecorder(10), wg) + clusterController, err := NewOvnController( + fakeClient, + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + libovsdbOvnNBClient, + libovsdbOvnSBClient, + record.NewFakeRecorder(10), + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) setupCOPP := true diff --git a/go-controller/pkg/ovn/master_test.go b/go-controller/pkg/ovn/master_test.go index c8b31c4950c..79ccf8a3fbd 100644 --- a/go-controller/pkg/ovn/master_test.go +++ b/go-controller/pkg/ovn/master_test.go @@ -30,6 +30,7 @@ import ( "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/sbdb" ovntest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing" libovsdbtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/libovsdb" + nadtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/nad" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util" "github.com/urfave/cli/v2" @@ -1052,7 +1053,17 @@ var _ = ginkgo.Describe("Default network controller operations", func() { gomega.Expect(err).NotTo(gomega.HaveOccurred()) recorder = record.NewFakeRecorder(10) - oc, err = NewOvnController(fakeClient, f, stopChan, nil, nbClient, sbClient, recorder, wg) + oc, err = NewOvnController( + fakeClient, + &nadtest.FakeNetworkManager{}, + f, + stopChan, + nil, + nbClient, + sbClient, + recorder, + wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) gomega.Expect(oc).NotTo(gomega.BeNil()) @@ -2075,13 +2086,15 @@ func TestController_syncNodes(t *testing.T) { controller, err := NewOvnController( fakeClient, + &nadtest.FakeNetworkManager{}, f, stopChan, nil, nbClient, sbClient, record.NewFakeRecorder(0), - wg) + wg, + ) gomega.Expect(err).ToNot(gomega.HaveOccurred()) err = controller.syncNodes([]interface{}{&testNode}) if err != nil { @@ -2176,13 +2189,15 @@ func TestController_deleteStaleNodeChassis(t *testing.T) { controller, err := NewOvnController( fakeClient, + &nadtest.FakeNetworkManager{}, f, stopChan, nil, nbClient, sbClient, record.NewFakeRecorder(0), - wg) + wg, + ) gomega.Expect(err).ToNot(gomega.HaveOccurred()) err = controller.deleteStaleNodeChassis(&tt.node) diff --git a/go-controller/pkg/ovn/ovn_test.go b/go-controller/pkg/ovn/ovn_test.go index 6eb74399fd0..36a0e90833b 100644 --- a/go-controller/pkg/ovn/ovn_test.go +++ b/go-controller/pkg/ovn/ovn_test.go @@ -74,21 +74,21 @@ type secondaryControllerInfo struct { } type FakeOVN struct { - fakeClient *util.OVNMasterClientset - watcher *factory.WatchFactory - controller *DefaultNetworkController - stopChan chan struct{} - wg *sync.WaitGroup - asf *addressset.FakeAddressSetFactory - fakeRecorder *record.FakeRecorder - nbClient libovsdbclient.Client - sbClient libovsdbclient.Client - dbSetup libovsdbtest.TestSetup - nbsbCleanup *libovsdbtest.Context - egressQoSWg *sync.WaitGroup - egressSVCWg *sync.WaitGroup - anpWg *sync.WaitGroup - nadController nad.NADController + fakeClient *util.OVNMasterClientset + watcher *factory.WatchFactory + controller *DefaultNetworkController + stopChan chan struct{} + wg *sync.WaitGroup + asf *addressset.FakeAddressSetFactory + fakeRecorder *record.FakeRecorder + nbClient libovsdbclient.Client + sbClient libovsdbclient.Client + dbSetup libovsdbtest.TestSetup + nbsbCleanup *libovsdbtest.Context + egressQoSWg *sync.WaitGroup + egressSVCWg *sync.WaitGroup + anpWg *sync.WaitGroup + fakeNetworkManager *fakenad.FakeNetworkManager // information map of all secondary network controllers secondaryControllers map[string]secondaryControllerInfo @@ -101,12 +101,12 @@ func NewFakeOVN(useFakeAddressSet bool) *FakeOVN { asf = addressset.NewFakeAddressSetFactory(DefaultNetworkControllerName) } return &FakeOVN{ - asf: asf, - fakeRecorder: record.NewFakeRecorder(10), - egressQoSWg: &sync.WaitGroup{}, - egressSVCWg: &sync.WaitGroup{}, - anpWg: &sync.WaitGroup{}, - + asf: asf, + fakeRecorder: record.NewFakeRecorder(10), + egressQoSWg: &sync.WaitGroup{}, + egressSVCWg: &sync.WaitGroup{}, + anpWg: &sync.WaitGroup{}, + fakeNetworkManager: &fakenad.FakeNetworkManager{}, secondaryControllers: map[string]secondaryControllerInfo{}, } } @@ -207,13 +207,19 @@ func (o *FakeOVN) init(nadList []nettypes.NetworkAttachmentDefinition) { o.stopChan = make(chan struct{}) o.wg = &sync.WaitGroup{} - o.controller, err = NewOvnController(o.fakeClient, o.watcher, - o.stopChan, o.asf, - o.nbClient, o.sbClient, - o.fakeRecorder, o.wg) + o.controller, err = NewOvnController( + o.fakeClient, + o.fakeNetworkManager, + o.watcher, + o.stopChan, + o.asf, + o.nbClient, + o.sbClient, + o.fakeRecorder, + o.wg, + ) gomega.Expect(err).NotTo(gomega.HaveOccurred()) o.controller.multicastSupport = config.EnableMulticast - o.nadController = o.controller.nadController setupCOPP := false setupClusterController(o.controller, setupCOPP) @@ -282,9 +288,17 @@ func resetNBClient(ctx context.Context, nbClient libovsdbclient.Client) { // NewOvnController creates a new OVN controller for creating logical network // infrastructure and policy -func NewOvnController(ovnClient *util.OVNMasterClientset, wf *factory.WatchFactory, stopChan chan struct{}, - addressSetFactory addressset.AddressSetFactory, libovsdbOvnNBClient libovsdbclient.Client, - libovsdbOvnSBClient libovsdbclient.Client, recorder record.EventRecorder, wg *sync.WaitGroup) (*DefaultNetworkController, error) { +func NewOvnController( + ovnClient *util.OVNMasterClientset, + networkManager nad.NetworkManager, + wf *factory.WatchFactory, + stopChan chan struct{}, + addressSetFactory addressset.AddressSetFactory, + libovsdbOvnNBClient libovsdbclient.Client, + libovsdbOvnSBClient libovsdbclient.Client, + recorder record.EventRecorder, + wg *sync.WaitGroup, +) (*DefaultNetworkController, error) { fakeAddr, ok := addressSetFactory.(*addressset.FakeAddressSetFactory) if addressSetFactory == nil || (ok && fakeAddr == nil) { @@ -327,14 +341,7 @@ func NewOvnController(ovnClient *util.OVNMasterClientset, wf *factory.WatchFacto return nil, err } - var nadController nad.NADController - if config.OVNKubernetesFeature.EnableMultiNetwork { - nadController, err = nad.NewZoneNADController("test", "zone", &fakenad.FakeNetworkControllerManager{}, wf) - if err != nil { - return nil, err - } - } - dnc, err := newDefaultNetworkControllerCommon(cnci, stopChan, wg, addressSetFactory, nadController, nil) + dnc, err := newDefaultNetworkControllerCommon(cnci, stopChan, wg, addressSetFactory, networkManager, nil) gomega.Expect(err).NotTo(gomega.HaveOccurred()) if nbZoneFailed { @@ -452,17 +459,17 @@ func (o *FakeOVN) NewSecondaryNetworkController(netattachdef *nettypes.NetworkAt switch topoType { case types.Layer3Topology: - l3Controller, err := NewSecondaryLayer3NetworkController(cnci, nInfo, o.nadController) + l3Controller, err := NewSecondaryLayer3NetworkController(cnci, nInfo, o.fakeNetworkManager) gomega.Expect(err).NotTo(gomega.HaveOccurred()) l3Controller.addressSetFactory = asf secondaryController = &l3Controller.BaseSecondaryNetworkController case types.Layer2Topology: - l2Controller, err := NewSecondaryLayer2NetworkController(cnci, nInfo, o.nadController) + l2Controller, err := NewSecondaryLayer2NetworkController(cnci, nInfo, o.fakeNetworkManager) gomega.Expect(err).NotTo(gomega.HaveOccurred()) l2Controller.addressSetFactory = asf secondaryController = &l2Controller.BaseSecondaryNetworkController case types.LocalnetTopology: - localnetController := NewSecondaryLocalnetNetworkController(cnci, nInfo, o.nadController) + localnetController := NewSecondaryLocalnetNetworkController(cnci, nInfo, o.fakeNetworkManager) localnetController.addressSetFactory = asf secondaryController = &localnetController.BaseSecondaryNetworkController default: diff --git a/go-controller/pkg/ovn/secondary_layer2_network_controller.go b/go-controller/pkg/ovn/secondary_layer2_network_controller.go index 2beff0c8837..a015507434f 100644 --- a/go-controller/pkg/ovn/secondary_layer2_network_controller.go +++ b/go-controller/pkg/ovn/secondary_layer2_network_controller.go @@ -256,7 +256,7 @@ type SecondaryLayer2NetworkController struct { } // NewSecondaryLayer2NetworkController create a new OVN controller for the given secondary layer2 nad -func NewSecondaryLayer2NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, nadController nad.NADController) (*SecondaryLayer2NetworkController, error) { +func NewSecondaryLayer2NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, networkManager nad.NetworkManager) (*SecondaryLayer2NetworkController, error) { stopChan := make(chan struct{}) @@ -276,7 +276,7 @@ func NewSecondaryLayer2NetworkController(cnci *CommonNetworkControllerInfo, netI cnci.watchFactory.ServiceCoreInformer(), cnci.watchFactory.EndpointSliceCoreInformer(), cnci.watchFactory.NodeCoreInformer(), - nadController, + networkManager, cnci.recorder, netInfo, ) @@ -305,7 +305,7 @@ func NewSecondaryLayer2NetworkController(cnci *CommonNetworkControllerInfo, netI wg: &sync.WaitGroup{}, localZoneNodes: &sync.Map{}, cancelableCtx: util.NewCancelableContext(), - nadController: nadController, + networkManager: networkManager, }, }, }, diff --git a/go-controller/pkg/ovn/secondary_layer2_network_controller_test.go b/go-controller/pkg/ovn/secondary_layer2_network_controller_test.go index 69bba92a5c3..a158bfa146d 100644 --- a/go-controller/pkg/ovn/secondary_layer2_network_controller_test.go +++ b/go-controller/pkg/ovn/secondary_layer2_network_controller_test.go @@ -80,6 +80,9 @@ var _ = Describe("OVN Multi-Homed pod operations for layer2 network", func() { networkConfig, err := util.NewNetInfo(netInfo.netconf()) Expect(err).NotTo(HaveOccurred()) + networkConfig.AddNADs(nad.Namespace + "/" + nad.Name) + fakeOvn.fakeNetworkManager.PrimaryNetworks = map[string]util.NetInfo{ns: networkConfig} + initialDB.NBData = append( initialDB.NBData, &nbdb.LogicalRouter{ @@ -123,7 +126,6 @@ var _ = Describe("OVN Multi-Homed pod operations for layer2 network", func() { _, ok := pod.Annotations[util.OvnPodAnnotationName] Expect(ok).To(BeFalse()) } - Expect(fakeOvn.controller.nadController.Start()).NotTo(HaveOccurred()) Expect(fakeOvn.controller.WatchNamespaces()).NotTo(HaveOccurred()) Expect(fakeOvn.controller.WatchPods()).NotTo(HaveOccurred()) @@ -224,10 +226,10 @@ var _ = Describe("OVN Multi-Homed pod operations for layer2 network", func() { networkConfig, err := util.NewNetInfo(netConf) Expect(err).NotTo(HaveOccurred()) - nadController := &nad.FakeNADController{ + fakeNetworkManager := &nad.FakeNetworkManager{ PrimaryNetworks: map[string]util.NetInfo{}, } - nadController.PrimaryNetworks[ns] = networkConfig + fakeNetworkManager.PrimaryNetworks[ns] = networkConfig nad, err := newNetworkAttachmentDefinition( ns, nadName, @@ -307,7 +309,7 @@ var _ = Describe("OVN Multi-Homed pod operations for layer2 network", func() { &secondaryNetController.bnc.CommonNetworkControllerInfo, networkConfig, nodeName, - nadController, + fakeNetworkManager, ).Cleanup()).To(Succeed()) Eventually(fakeOvn.nbClient).Should(libovsdbtest.HaveData([]libovsdbtest.TestData{nbZone})) @@ -525,8 +527,8 @@ func dummyLayer2PrimaryUserDefinedNetwork(subnets string) secondaryNetInfo { } func newSecondaryLayer2NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, nodeName string, - nadController networkAttachDefController.NADController) *SecondaryLayer2NetworkController { - layer2NetworkController, _ := NewSecondaryLayer2NetworkController(cnci, netInfo, nadController) + networkManager networkAttachDefController.NetworkManager) *SecondaryLayer2NetworkController { + layer2NetworkController, _ := NewSecondaryLayer2NetworkController(cnci, netInfo, networkManager) layer2NetworkController.gatewayManagers.Store( nodeName, newDummyGatewayManager(cnci.kube, cnci.nbClient, netInfo, cnci.watchFactory, nodeName), diff --git a/go-controller/pkg/ovn/secondary_layer3_network_controller.go b/go-controller/pkg/ovn/secondary_layer3_network_controller.go index 46589144e7d..09490ab93e8 100644 --- a/go-controller/pkg/ovn/secondary_layer3_network_controller.go +++ b/go-controller/pkg/ovn/secondary_layer3_network_controller.go @@ -307,7 +307,7 @@ type SecondaryLayer3NetworkController struct { } // NewSecondaryLayer3NetworkController create a new OVN controller for the given secondary layer3 NAD -func NewSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, nadController nad.NADController) (*SecondaryLayer3NetworkController, error) { +func NewSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, networkManager nad.NetworkManager) (*SecondaryLayer3NetworkController, error) { stopChan := make(chan struct{}) ipv4Mode, ipv6Mode := netInfo.IPMode() @@ -326,7 +326,7 @@ func NewSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netI cnci.watchFactory.ServiceCoreInformer(), cnci.watchFactory.EndpointSliceCoreInformer(), cnci.watchFactory.NodeCoreInformer(), - nadController, + networkManager, cnci.recorder, netInfo, ) @@ -354,7 +354,7 @@ func NewSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netI localZoneNodes: &sync.Map{}, zoneICHandler: zoneICHandler, cancelableCtx: util.NewCancelableContext(), - nadController: nadController, + networkManager: networkManager, }, }, mgmtPortFailed: sync.Map{}, diff --git a/go-controller/pkg/ovn/secondary_layer3_network_controller_test.go b/go-controller/pkg/ovn/secondary_layer3_network_controller_test.go index 9c114a1f268..20960f04a87 100644 --- a/go-controller/pkg/ovn/secondary_layer3_network_controller_test.go +++ b/go-controller/pkg/ovn/secondary_layer3_network_controller_test.go @@ -110,6 +110,9 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { networkConfig, err := util.NewNetInfo(netInfo.netconf()) Expect(err).NotTo(HaveOccurred()) + networkConfig.AddNADs(nad.Namespace + "/" + nad.Name) + fakeOvn.fakeNetworkManager.PrimaryNetworks = map[string]util.NetInfo{ns: networkConfig} + initialDB.NBData = append( initialDB.NBData, &nbdb.LogicalSwitch{ @@ -156,8 +159,6 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { _, ok := pod.Annotations[util.OvnPodAnnotationName] Expect(ok).To(BeFalse()) - Expect(fakeOvn.controller.nadController.Start()).NotTo(HaveOccurred()) - Expect(fakeOvn.controller.WatchNamespaces()).NotTo(HaveOccurred()) Expect(fakeOvn.controller.WatchPods()).NotTo(HaveOccurred()) secondaryNetController, ok := fakeOvn.secondaryControllers[secondaryNetworkName] @@ -168,12 +169,6 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { Expect(secondaryNetController.bnc.WatchNodes()).To(Succeed()) Expect(secondaryNetController.bnc.WatchPods()).To(Succeed()) - if netInfo.isPrimary { - ninfo, err := fakeOvn.nadController.GetActiveNetworkForNamespace(ns) - Expect(err).NotTo(HaveOccurred()) - Expect(ninfo.GetNetworkName()).To(Equal(netInfo.netName)) - } - // check that after start networks annotations and nbdb will be updated Eventually(func() string { return getPodAnnotations(fakeOvn.fakeClient.KubeClient, podInfo.namespace, podInfo.podName) @@ -260,10 +255,10 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { Expect(err).NotTo(HaveOccurred()) networkConfig.SetNADs(util.GetNADName(nad.Namespace, nad.Name)) - nadController := &fakenad.FakeNADController{ + fakeNetworkManager := &fakenad.FakeNetworkManager{ PrimaryNetworks: make(map[string]util.NetInfo), } - nadController.PrimaryNetworks[ns] = networkConfig + fakeNetworkManager.PrimaryNetworks[ns] = networkConfig const nodeIPv4CIDR = "192.168.126.202/24" testNode, err := newNodeWithSecondaryNets(nodeName, nodeIPv4CIDR, netInfo) @@ -318,8 +313,6 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { _, ok := pod.Annotations[util.OvnPodAnnotationName] Expect(ok).To(BeFalse()) - Expect(fakeOvn.controller.nadController.Start()).NotTo(HaveOccurred()) - Expect(fakeOvn.controller.WatchNamespaces()).To(Succeed()) Expect(fakeOvn.controller.WatchPods()).To(Succeed()) secondaryNetController, ok := fakeOvn.secondaryControllers[secondaryNetworkName] @@ -343,7 +336,7 @@ var _ = Describe("OVN Multi-Homed pod operations", func() { &secondaryNetController.bnc.CommonNetworkControllerInfo, networkConfig, nodeName, - nadController, + fakeNetworkManager, ).Cleanup()).To(Succeed()) Eventually(fakeOvn.nbClient).Should(libovsdbtest.HaveData(defaultNetExpectations)) @@ -946,8 +939,8 @@ func standardNonDefaultNetworkExtIDsForLogicalSwitch(netInfo util.NetInfo) map[s return externalIDs } -func newSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, nodeName string, nadController networkAttachDefController.NADController) *SecondaryLayer3NetworkController { - layer3NetworkController, err := NewSecondaryLayer3NetworkController(cnci, netInfo, nadController) +func newSecondaryLayer3NetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, nodeName string, networkManager networkAttachDefController.NetworkManager) *SecondaryLayer3NetworkController { + layer3NetworkController, err := NewSecondaryLayer3NetworkController(cnci, netInfo, networkManager) Expect(err).NotTo(HaveOccurred()) layer3NetworkController.gatewayManagers.Store( nodeName, diff --git a/go-controller/pkg/ovn/secondary_localnet_network_controller.go b/go-controller/pkg/ovn/secondary_localnet_network_controller.go index e18a1cef41a..dff05b0052e 100644 --- a/go-controller/pkg/ovn/secondary_localnet_network_controller.go +++ b/go-controller/pkg/ovn/secondary_localnet_network_controller.go @@ -186,7 +186,7 @@ type SecondaryLocalnetNetworkController struct { // NewSecondaryLocalnetNetworkController create a new OVN controller for the given secondary localnet NAD func NewSecondaryLocalnetNetworkController(cnci *CommonNetworkControllerInfo, netInfo util.NetInfo, - nadController networkAttachDefController.NADController) *SecondaryLocalnetNetworkController { + networkManager networkAttachDefController.NetworkManager) *SecondaryLocalnetNetworkController { stopChan := make(chan struct{}) @@ -211,7 +211,7 @@ func NewSecondaryLocalnetNetworkController(cnci *CommonNetworkControllerInfo, ne wg: &sync.WaitGroup{}, cancelableCtx: util.NewCancelableContext(), localZoneNodes: &sync.Map{}, - nadController: nadController, + networkManager: networkManager, }, }, }, diff --git a/go-controller/pkg/testing/nad/netattach.go b/go-controller/pkg/testing/nad/netattach.go index 72c68ca914b..c5c24e315d2 100644 --- a/go-controller/pkg/testing/nad/netattach.go +++ b/go-controller/pkg/testing/nad/netattach.go @@ -1,52 +1,16 @@ package nad import ( - "context" - networkAttachDefController "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/network-attach-def-controller" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util" ) -type FakeNetworkController struct { - util.NetInfo -} - -func (nc *FakeNetworkController) Start(ctx context.Context) error { - return nil -} - -func (nc *FakeNetworkController) Stop() {} - -func (nc *FakeNetworkController) Cleanup() error { - return nil -} - -func (nc *FakeNetworkController) Reconcile(util.ReconcilableNetInfo) error { - return nil -} - -type FakeNetworkControllerManager struct{} - -func (ncm *FakeNetworkControllerManager) NewNetworkController(netInfo util.NetInfo) (networkAttachDefController.NetworkController, error) { - return &FakeNetworkController{netInfo}, nil -} - -func (ncm *FakeNetworkControllerManager) CleanupDeletedNetworks(validNetworks ...util.BasicNetInfo) error { - return nil -} - -func (tncm *FakeNetworkControllerManager) GetDefaultNetworkController() networkAttachDefController.ReconcilableNetworkController { - return nil -} - -type FakeNADController struct { +type FakeNetworkManager struct { // namespace -> netInfo PrimaryNetworks map[string]util.NetInfo } -func (nc *FakeNADController) Start() error { return nil } -func (nc *FakeNADController) Stop() {} -func (nc *FakeNADController) GetActiveNetworkForNamespace(namespace string) (util.NetInfo, error) { - if primaryNetworks, ok := nc.PrimaryNetworks[namespace]; ok && primaryNetworks != nil { +func (nm *FakeNetworkManager) GetActiveNetworkForNamespace(namespace string) (util.NetInfo, error) { + if primaryNetworks, ok := nm.PrimaryNetworks[namespace]; ok && primaryNetworks != nil { return primaryNetworks, nil } return &util.DefaultNetInfo{}, nil