Skip to content

Commit

Permalink
udn, controllers: Wire up networkID helper
Browse files Browse the repository at this point in the history
Wire up the util.GetNetworkID to the secondary controllers as a
getNetworkID lazy function so Nodes annotations will be parsed only if
needed.

Signed-off-by: Enrique Llorente <ellorent@redhat.com>
  • Loading branch information
qinqon committed Jul 19, 2024
1 parent 424d22b commit a439ebc
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 0 deletions.
19 changes: 19 additions & 0 deletions go-controller/pkg/node/secondary_node_network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"

"k8s.io/klog/v2"
"k8s.io/utils/ptr"
)

// SecondaryNodeNetworkController structure is the object which holds the controls for starting
Expand All @@ -16,6 +17,8 @@ type SecondaryNodeNetworkController struct {
BaseNodeNetworkController
// pod events factory handler
podHandler *factory.Handler

networkID *int
}

// NewSecondaryNodeNetworkController creates a new OVN controller for creating logical network
Expand All @@ -34,6 +37,7 @@ func NewSecondaryNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, n
// Start starts the default controller; handles all events and creates all needed logical entities
func (nc *SecondaryNodeNetworkController) Start(ctx context.Context) error {
klog.Infof("Start secondary node network controller of network %s", nc.GetNetworkName())

handler, err := nc.watchPodsDPU()
if err != nil {
return err
Expand All @@ -57,3 +61,18 @@ func (nc *SecondaryNodeNetworkController) Stop() {
func (nc *SecondaryNodeNetworkController) Cleanup() error {
return nil
}

func (oc *SecondaryNodeNetworkController) getNetworkID() (int, error) {
if oc.networkID == nil || *oc.networkID == util.InvalidNetworkID {
oc.networkID = ptr.To(util.InvalidNetworkID)
nodes, err := oc.watchFactory.GetNodes()
if err != nil {
return util.InvalidNetworkID, err
}
*oc.networkID, err = util.GetNetworkID(nodes, oc.NetInfo)
if err != nil {
return util.InvalidNetworkID, err
}
}
return *oc.networkID, nil
}
71 changes: 71 additions & 0 deletions go-controller/pkg/node/secondary_node_network_controller_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package node

import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"

"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory"
ovntest "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"
)

var _ = Describe("SecondaryNodeNetworkController", func() {
var (
nad = ovntest.GenerateNAD("bluenet", "rednad", "greenamespace",
types.Layer3Topology, "100.128.0.0/16", types.NetworkRolePrimary)
)
It("should return networkID from one of the nodes in the cluster", func() {
fakeClient := &util.OVNNodeClientset{
KubeClient: fake.NewSimpleClientset(&corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "worker1",
Annotations: map[string]string{
"k8s.ovn.org/network-ids": `{"bluenet": "3"}`,
},
},
}),
}
controller := SecondaryNodeNetworkController{}
var err error
controller.watchFactory, err = factory.NewNodeWatchFactory(fakeClient, "worker1")
Expect(controller.watchFactory.Start()).To(Succeed())

Expect(err).NotTo(HaveOccurred())
controller.NetInfo, err = util.ParseNADInfo(nad)
Expect(err).NotTo(HaveOccurred())

networkID, err := controller.getNetworkID()
Expect(err).ToNot(HaveOccurred())
Expect(networkID).To(Equal(3))
})

It("should return invalid networkID if network not found", func() {
fakeClient := &util.OVNNodeClientset{
KubeClient: fake.NewSimpleClientset(&corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "worker1",
Annotations: map[string]string{
"k8s.ovn.org/network-ids": `{"othernet": "3"}`,
},
},
}),
}
controller := SecondaryNodeNetworkController{}
var err error
controller.watchFactory, err = factory.NewNodeWatchFactory(fakeClient, "worker1")
Expect(controller.watchFactory.Start()).To(Succeed())

Expect(err).NotTo(HaveOccurred())
controller.NetInfo, err = util.ParseNADInfo(nad)
Expect(err).NotTo(HaveOccurred())

networkID, err := controller.getNetworkID()
Expect(err).To(HaveOccurred())
Expect(networkID).To(Equal(util.InvalidNetworkID))
})
})
3 changes: 3 additions & 0 deletions go-controller/pkg/ovn/base_network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ type BaseNetworkController struct {
// configuration for secondary network controller
type BaseSecondaryNetworkController struct {
BaseNetworkController

networkID *int

// multi-network policy events factory handler
policyHandler *factory.Handler
}
Expand Down
16 changes: 16 additions & 0 deletions go-controller/pkg/ovn/base_network_controller_secondary.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
kapi "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
)

func (bsnc *BaseSecondaryNetworkController) getPortInfoForSecondaryNetwork(pod *kapi.Pod) map[string]*lpInfo {
Expand Down Expand Up @@ -697,3 +698,18 @@ func (oc *BaseSecondaryNetworkController) allowPersistentIPs() bool {
util.DoesNetworkRequireIPAM(oc.NetInfo) &&
(oc.NetInfo.TopologyType() == types.Layer2Topology || oc.NetInfo.TopologyType() == types.LocalnetTopology)
}

func (oc *BaseSecondaryNetworkController) getNetworkID() (int, error) {
if oc.networkID == nil || *oc.networkID == util.InvalidNetworkID {
oc.networkID = ptr.To(util.InvalidNetworkID)
nodes, err := oc.watchFactory.GetNodes()
if err != nil {
return util.InvalidNetworkID, err
}
*oc.networkID, err = util.GetNetworkID(nodes, oc.NetInfo)
if err != nil {
return util.InvalidNetworkID, err
}
}
return *oc.networkID, nil
}
57 changes: 57 additions & 0 deletions go-controller/pkg/ovn/base_network_controller_secondary_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ovn

import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

ovntest "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"
)

var _ = Describe("BaseSecondaryNetworkController", func() {
var (
nad = ovntest.GenerateNAD("bluenet", "rednad", "greenamespace",
types.Layer3Topology, "100.128.0.0/16", types.NetworkRolePrimary)
)
It("should return networkID from one of the nodes node", func() {
fakeOVN := NewFakeOVN(false)
fakeOVN.start(&corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "worker1",
Annotations: map[string]string{
"k8s.ovn.org/network-ids": `{"bluenet": "3"}`,
},
},
})
Expect(fakeOVN.NewSecondaryNetworkController(nad)).To(Succeed())
controller, ok := fakeOVN.secondaryControllers["bluenet"]
Expect(ok).To(BeTrue())

networkID, err := controller.bnc.getNetworkID()
Expect(err).ToNot(HaveOccurred())
Expect(networkID).To(Equal(3))
})
It("should return invalid networkID if network is not found", func() {
fakeOVN := NewFakeOVN(false)
fakeOVN.start(&corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "worker1",
Annotations: map[string]string{
"k8s.ovn.org/network-ids": `{"other": "3"}`,
},
},
})
Expect(fakeOVN.NewSecondaryNetworkController(nad)).To(Succeed())
controller, ok := fakeOVN.secondaryControllers["bluenet"]
Expect(ok).To(BeTrue())

networkID, err := controller.bnc.getNetworkID()
Expect(err).To(HaveOccurred())
Expect(networkID).To(Equal(util.InvalidNetworkID))
})

})

0 comments on commit a439ebc

Please sign in to comment.