From 5ac2f7c5c9b81d78c82dea0269809e2aebd747d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Caama=C3=B1o=20Ruiz?= Date: Tue, 13 Jun 2023 11:11:55 +0000 Subject: [PATCH] Enable cluster manager support for layer2 networks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jaime CaamaƱo Ruiz --- .../secondary_network_cluster_manager.go | 6 ++++-- .../clustermanager/secondary_network_unit_test.go | 12 ++++++++++++ .../pkg/ovn/base_network_controller_pods.go | 8 ++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/go-controller/pkg/clustermanager/secondary_network_cluster_manager.go b/go-controller/pkg/clustermanager/secondary_network_cluster_manager.go index ba89d9f0105..841001a23f4 100644 --- a/go-controller/pkg/clustermanager/secondary_network_cluster_manager.go +++ b/go-controller/pkg/clustermanager/secondary_network_cluster_manager.go @@ -92,8 +92,8 @@ func (sncm *secondaryNetworkClusterManager) Stop() { } // NewNetworkController implements the networkAttachDefController.NetworkControllerManager -// interface function. This function is called by the net-attach-def controller when -// a layer2 or layer3 secondary network is created. Layer2 type is not handled here. +// interface function. This function is called by the net-attach-def controller when +// a secondary network is created. func (sncm *secondaryNetworkClusterManager) NewNetworkController(nInfo util.NetInfo) (nad.NetworkController, error) { if !sncm.isTopologyManaged(nInfo) { return nil, nad.ErrNetworkControllerTopologyNotManaged @@ -114,6 +114,8 @@ func (sncm *secondaryNetworkClusterManager) isTopologyManaged(nInfo util.NetInfo switch nInfo.TopologyType() { case ovntypes.Layer3Topology: return true + case ovntypes.Layer2Topology: + return config.OVNKubernetesFeature.EnableInterconnect case ovntypes.LocalnetTopology: return config.OVNKubernetesFeature.EnableInterconnect && len(nInfo.Subnets()) > 0 } diff --git a/go-controller/pkg/clustermanager/secondary_network_unit_test.go b/go-controller/pkg/clustermanager/secondary_network_unit_test.go index 7bfda11e479..2b90c401c7d 100644 --- a/go-controller/pkg/clustermanager/secondary_network_unit_test.go +++ b/go-controller/pkg/clustermanager/secondary_network_unit_test.go @@ -147,6 +147,8 @@ var _ = ginkgo.Describe("Secondary Layer3 Cluster Controller Manager", func() { gomega.Expect(err).NotTo(gomega.HaveOccurred()) config.Kubernetes.HostNetworkNamespace = "" + config.OVNKubernetesFeature.EnableMultiNetwork = true + config.OVNKubernetesFeature.EnableInterconnect = true f, err = factory.NewClusterManagerWatchFactory(fakeClient) gomega.Expect(err).NotTo(gomega.HaveOccurred()) err = f.Start() @@ -156,10 +158,20 @@ var _ = ginkgo.Describe("Secondary Layer3 Cluster Controller Manager", func() { gomega.Expect(err).NotTo(gomega.HaveOccurred()) netInfo, err := util.NewNetInfo(&ovncnitypes.NetConf{NetConf: types.NetConf{Name: "blue"}, Topology: ovntypes.Layer2Topology}) gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + config.OVNKubernetesFeature.EnableInterconnect = false nc, err := sncm.NewNetworkController(netInfo) gomega.Expect(err).To(gomega.Equal(nad.ErrNetworkControllerTopologyNotManaged)) gomega.Expect(nc).To(gomega.BeNil()) + config.OVNKubernetesFeature.EnableInterconnect = true + nc, err = sncm.NewNetworkController(netInfo) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + gomega.Expect(nc).NotTo(gomega.BeNil()) + + err = nc.Start(ctx.Context) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + return nil } diff --git a/go-controller/pkg/ovn/base_network_controller_pods.go b/go-controller/pkg/ovn/base_network_controller_pods.go index 0d952d80bcc..77a1b20927a 100644 --- a/go-controller/pkg/ovn/base_network_controller_pods.go +++ b/go-controller/pkg/ovn/base_network_controller_pods.go @@ -648,9 +648,13 @@ func (bnc *BaseNetworkController) WatchPods() error { func (bnc *BaseNetworkController) handlesPodIPAllocation() bool { // the controller is in charge of pod IP allocation except L2 topologies - // with IPAM on interconnect + // on interconnect switch bnc.NetInfo.TopologyType() { - case ovntypes.Layer2Topology, ovntypes.LocalnetTopology: + case ovntypes.Layer2Topology: + // with interconnect, cluster manager allocates IPs and IDs + return !config.OVNKubernetesFeature.EnableInterconnect + case ovntypes.LocalnetTopology: + // with interconnect and IPAM, cluster manager allocates IPs return !config.OVNKubernetesFeature.EnableInterconnect || !bnc.doesNetworkRequireIPAM() } return true