Skip to content

Commit

Permalink
L2 services support
Browse files Browse the repository at this point in the history
Signed-off-by: Patryk Diak <[email protected]>
  • Loading branch information
kyrtapz committed Sep 6, 2024
1 parent 9e27c79 commit fe25add
Show file tree
Hide file tree
Showing 12 changed files with 222 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/containernetworking/cni/pkg/types"
libovsdbclient "github.com/ovn-org/libovsdb/client"

ovncnitypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/cni/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory"
Expand Down Expand Up @@ -65,7 +66,7 @@ func (cm *NetworkControllerManager) NewNetworkController(nInfo util.NetInfo) (na
case ovntypes.Layer3Topology:
return ovn.NewSecondaryLayer3NetworkController(cnci, nInfo)
case ovntypes.Layer2Topology:
return ovn.NewSecondaryLayer2NetworkController(cnci, nInfo), nil
return ovn.NewSecondaryLayer2NetworkController(cnci, nInfo)
case ovntypes.LocalnetTopology:
return ovn.NewSecondaryLocalnetNetworkController(cnci, nInfo), nil
}
Expand All @@ -83,7 +84,7 @@ func (cm *NetworkControllerManager) newDummyNetworkController(topoType, netName
case ovntypes.Layer3Topology:
return ovn.NewSecondaryLayer3NetworkController(cnci, netInfo)
case ovntypes.Layer2Topology:
return ovn.NewSecondaryLayer2NetworkController(cnci, netInfo), nil
return ovn.NewSecondaryLayer2NetworkController(cnci, netInfo)
case ovntypes.LocalnetTopology:
return ovn.NewSecondaryLocalnetNetworkController(cnci, netInfo), nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func (oc *BaseSecondaryLayer2NetworkController) run() error {
}

func (oc *BaseSecondaryLayer2NetworkController) initializeLogicalSwitch(switchName string, clusterSubnets []config.CIDRNetworkEntry,
excludeSubnets []*net.IPNet) (*nbdb.LogicalSwitch, error) {
excludeSubnets []*net.IPNet, clusterLoadBalancerGroupUUID, switchLoadBalancerGroupUUID string) (*nbdb.LogicalSwitch, error) {
logicalSwitch := nbdb.LogicalSwitch{
Name: switchName,
ExternalIDs: util.GenerateExternalIDsForSwitchOrRouter(oc.NetInfo),
Expand All @@ -134,6 +134,10 @@ func (oc *BaseSecondaryLayer2NetworkController) initializeLogicalSwitch(switchNa
}
}

if clusterLoadBalancerGroupUUID != "" && switchLoadBalancerGroupUUID != "" {
logicalSwitch.LoadBalancerGroup = []string{clusterLoadBalancerGroupUUID, switchLoadBalancerGroupUUID}
}

err := libovsdbops.CreateOrUpdateLogicalSwitch(oc.nbClient, &logicalSwitch)
if err != nil {
return nil, fmt.Errorf("failed to create logical switch %+v: %v", logicalSwitch, err)
Expand Down
89 changes: 51 additions & 38 deletions go-controller/pkg/ovn/controller/services/lb_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ import (
"testing"
"time"

"github.com/stretchr/testify/assert"

globalconfig "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
kubetest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
"github.com/stretchr/testify/assert"

v1 "k8s.io/api/core/v1"
discovery "k8s.io/api/discovery/v1"
Expand Down Expand Up @@ -1217,9 +1218,7 @@ func Test_buildClusterLBs(t *testing.T) {
defaultGroups := []string{types.ClusterLBGroupName}
defaultOpts := LBOpts{Reject: true}

UDNNetInfo := getSampleUDNNetInfo(namespace)
UDNGroups := []string{UDNNetInfo.GetNetworkScopedLoadBalancerGroupName(types.ClusterLBGroupName)}

udnNets := []util.NetInfo{getSampleUDNNetInfo(namespace, "layer3"), getSampleUDNNetInfo(namespace, "layer2")}
tc := []struct {
name string
service *v1.Service
Expand Down Expand Up @@ -1439,14 +1438,18 @@ func Test_buildClusterLBs(t *testing.T) {
assert.Equal(t, tt.expected, actual)

// UDN
UDNExternalIDs := loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), UDNNetInfo.GetNetworkName())
for idx := range tt.expected {
tt.expected[idx].ExternalIDs = UDNExternalIDs
tt.expected[idx].Groups = UDNGroups
tt.expected[idx].Name = UDNNetInfo.GetNetworkScopedLoadBalancerName(tt.expected[idx].Name)
for _, udn := range udnNets {
UDNExternalIDs := loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), udn.GetNetworkName())
expected := make([]LB, len(tt.expected))
copy(expected, tt.expected)
for idx := range tt.expected {
expected[idx].ExternalIDs = UDNExternalIDs
expected[idx].Groups = []string{udn.GetNetworkScopedLoadBalancerGroupName(types.ClusterLBGroupName)}
expected[idx].Name = udn.GetNetworkScopedLoadBalancerName(tt.expected[idx].Name)
}
actual = buildClusterLBs(tt.service, tt.configs, tt.nodeInfos, true, udn)
assert.Equal(t, expected, actual)
}
actual = buildClusterLBs(tt.service, tt.configs, tt.nodeInfos, true, UDNNetInfo)
assert.Equal(t, tt.expected, actual)
})
}
}
Expand All @@ -1472,7 +1475,7 @@ func Test_buildPerNodeLBs(t *testing.T) {
name := "foo"
namespace := "testns"

UDNNetInfo := getSampleUDNNetInfo(namespace)
udnNetworks := []util.NetInfo{getSampleUDNNetInfo(namespace, "layer3"), getSampleUDNNetInfo(namespace, "layer2")}

defaultService := &v1.Service{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
Expand Down Expand Up @@ -3088,8 +3091,6 @@ func Test_buildPerNodeLBs(t *testing.T) {
},
}

UDNExternalIDs := loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), UDNNetInfo.GetNetworkName())

// v4
for i, tt := range tc {
t.Run(fmt.Sprintf("%d_%s", i, tt.name), func(t *testing.T) {
Expand All @@ -3100,13 +3101,16 @@ func Test_buildPerNodeLBs(t *testing.T) {
assert.Equal(t, tt.expectedShared, actual, "shared gateway mode not as expected")

// UDN
for idx := range tt.expectedShared {
tt.expectedShared[idx].ExternalIDs = UDNExternalIDs
tt.expectedShared[idx].Name = UDNNetInfo.GetNetworkScopedLoadBalancerName(tt.expectedShared[idx].Name)

for _, udn := range udnNetworks {
expectedShared := make([]LB, len(tt.expectedShared))
copy(expectedShared, tt.expectedShared)
for idx := range tt.expectedShared {
expectedShared[idx].ExternalIDs = loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), udn.GetNetworkName())
expectedShared[idx].Name = udn.GetNetworkScopedLoadBalancerName(tt.expectedShared[idx].Name)
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodes, udn)
assert.Equal(t, expectedShared, actual, "shared gateway mode not as expected")
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodes, UDNNetInfo)
assert.Equal(t, tt.expectedShared, actual, "shared gateway mode not as expected")
}

if tt.expectedLocal != nil {
Expand All @@ -3117,13 +3121,16 @@ func Test_buildPerNodeLBs(t *testing.T) {
assert.Equal(t, tt.expectedLocal, actual, "local gateway mode not as expected")

// UDN
for idx := range tt.expectedLocal {
tt.expectedLocal[idx].ExternalIDs = UDNExternalIDs
tt.expectedLocal[idx].Name = UDNNetInfo.GetNetworkScopedLoadBalancerName(tt.expectedLocal[idx].Name)

for _, udn := range udnNetworks {
expectedLocal := make([]LB, len(tt.expectedLocal))
copy(expectedLocal, tt.expectedLocal)
for idx := range tt.expectedLocal {
expectedLocal[idx].ExternalIDs = loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), udn.GetNetworkName())
expectedLocal[idx].Name = udn.GetNetworkScopedLoadBalancerName(tt.expectedLocal[idx].Name)
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodes, udn)
assert.Equal(t, expectedLocal, actual, "local gateway mode not as expected")
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodes, UDNNetInfo)
assert.Equal(t, tt.expectedLocal, actual, "local gateway mode not as expected")
}

})
Expand All @@ -3142,13 +3149,16 @@ func Test_buildPerNodeLBs(t *testing.T) {
assert.Equal(t, tt.expectedShared, actual, "shared gateway mode not as expected")

// UDN
for idx := range tt.expectedShared {
tt.expectedShared[idx].ExternalIDs = UDNExternalIDs
tt.expectedShared[idx].Name = UDNNetInfo.GetNetworkScopedLoadBalancerName(tt.expectedShared[idx].Name)

for _, udn := range udnNetworks {
expectedShared := make([]LB, len(tt.expectedShared))
copy(expectedShared, tt.expectedShared)
for idx := range tt.expectedShared {
expectedShared[idx].ExternalIDs = loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), udn.GetNetworkName())
expectedShared[idx].Name = udn.GetNetworkScopedLoadBalancerName(tt.expectedShared[idx].Name)
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodesV6, udn)
assert.Equal(t, expectedShared, actual, "shared gateway mode not as expected for UDN")
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodesV6, UDNNetInfo)
assert.Equal(t, tt.expectedShared, actual, "shared gateway mode not as expected for UDN")
}

if tt.expectedLocal != nil {
Expand All @@ -3159,13 +3169,16 @@ func Test_buildPerNodeLBs(t *testing.T) {
assert.Equal(t, tt.expectedLocal, actual, "local gateway mode not as expected")

// UDN
for idx := range tt.expectedLocal {
tt.expectedLocal[idx].ExternalIDs = UDNExternalIDs
tt.expectedLocal[idx].Name = UDNNetInfo.GetNetworkScopedLoadBalancerName(tt.expectedLocal[idx].Name)

for _, udn := range udnNetworks {
expectedLocal := make([]LB, len(tt.expectedLocal))
copy(expectedLocal, tt.expectedLocal)
for idx := range tt.expectedLocal {
expectedLocal[idx].ExternalIDs = loadBalancerExternalIDsForNetwork(namespacedServiceName(namespace, name), udn.GetNetworkName())
expectedLocal[idx].Name = udn.GetNetworkScopedLoadBalancerName(tt.expectedLocal[idx].Name)
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodesV6, udn)
assert.Equal(t, expectedLocal, actual, "local gateway mode not as expected for UDN")
}
actual = buildPerNodeLBs(tt.service, tt.configs, defaultNodesV6, UDNNetInfo)
assert.Equal(t, tt.expectedLocal, actual, "local gateway mode not as expected for UDN")
}

})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"github.com/onsi/gomega"
"github.com/onsi/gomega/format"
libovsdbclient "github.com/ovn-org/libovsdb/client"
"golang.org/x/exp/maps"

ovncnitypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/cni/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
globalconfig "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
Expand Down Expand Up @@ -134,9 +136,9 @@ func (c *serviceController) close() {
c.libovsdbCleanup.Cleanup()
}

func getSampleUDNNetInfo(namespace string) util.NetInfo {
func getSampleUDNNetInfo(namespace string, topology string) util.NetInfo {
netInfo, _ := util.NewNetInfo(&ovncnitypes.NetConf{
Topology: "layer3",
Topology: topology,
NADName: fmt.Sprintf("%s/nad1", namespace),
MTU: 1400,
Role: "primary",
Expand Down Expand Up @@ -198,7 +200,7 @@ func TestSyncServices(t *testing.T) {
initialLrGroups = []string{types.ClusterLBGroupName, types.ClusterRouterLBGroupName}

udnNetworkName = "tenant-red"
udnNetInfo = getSampleUDNNetInfo(ns)
udnNetInfo = getSampleUDNNetInfo(ns, "layer3")
)
// setup global config
oldGateway := globalconfig.Gateway.Mode
Expand Down
2 changes: 1 addition & 1 deletion go-controller/pkg/ovn/controller/services/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestExternalIDsForLoadBalancer(t *testing.T) {
name := "svc-ab23"
namespace := "ns"
defaultNetInfo := util.DefaultNetInfo{}
UDNNetInfo := getSampleUDNNetInfo(namespace)
UDNNetInfo := getSampleUDNNetInfo(namespace, "layer3")
assert.Equal(t,
map[string]string{
types.LoadBalancerKindExternalID: "Service",
Expand Down
19 changes: 11 additions & 8 deletions go-controller/pkg/ovn/ovn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
ocpnetworkapiv1alpha1 "github.com/openshift/api/network/v1alpha1"
ocpnetworkfake "github.com/openshift/client-go/network/clientset/versioned/fake"
libovsdbclient "github.com/ovn-org/libovsdb/client"

ovncnitypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/cni/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
adminpolicybasedrouteapi "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/adminpolicybasedroute/v1"
Expand All @@ -32,6 +33,14 @@ import (
egressservicefake "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/egressservice/v1/apis/clientset/versioned/fake"
udnclientfake "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/userdefinednetwork/v1/apis/clientset/versioned/fake"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/record"
anpapi "sigs.k8s.io/network-policy-api/apis/v1alpha1"
anpfake "sigs.k8s.io/network-policy-api/pkg/client/clientset/versioned/fake"

"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/kube"
libovsdbutil "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/util"
Expand All @@ -42,13 +51,6 @@ import (
libovsdbtest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing/libovsdb"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
util "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/record"
anpapi "sigs.k8s.io/network-policy-api/apis/v1alpha1"
anpfake "sigs.k8s.io/network-policy-api/pkg/client/clientset/versioned/fake"
)

const (
Expand Down Expand Up @@ -444,7 +446,8 @@ func (o *FakeOVN) NewSecondaryNetworkController(netattachdef *nettypes.NetworkAt
l3Controller.addressSetFactory = asf
secondaryController = &l3Controller.BaseSecondaryNetworkController
case types.Layer2Topology:
l2Controller := NewSecondaryLayer2NetworkController(cnci, nInfo)
l2Controller, err := NewSecondaryLayer2NetworkController(cnci, nInfo)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
l2Controller.addressSetFactory = asf
secondaryController = &l2Controller.BaseSecondaryNetworkController
case types.LocalnetTopology:
Expand Down
Loading

0 comments on commit fe25add

Please sign in to comment.