Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
1b2426b
e2e: preload netshoot image for kubevirt tests instead of iperf
booxter Mar 25, 2026
e4b71f5
e2e: preload netshoot image for no_overlay suite
booxter Mar 25, 2026
cc84bac
AddresssetManager: add legacy netpol mode.
npinaeva Feb 24, 2026
5b649e9
addresssetManager: fix resetting address sets on restart.
npinaeva Mar 19, 2026
d58942d
UT: stop setting HostNetworkNamespace across unrelated UTs
npinaeva Apr 14, 2026
caac89a
Bump metallb frr to 10.5.3
booxter Apr 24, 2026
f90bfac
Bump frr to 10.6.0 to pick up more coredump fixes
booxter Apr 24, 2026
960efda
Move hostNamespace handling to the addressset_manager.go
npinaeva Apr 14, 2026
7d04957
Replace selectedNamespace = nil with more obvious struct.
npinaeva Apr 24, 2026
e1d509a
UT: get rid of the fake address set factory
npinaeva Apr 24, 2026
6760a28
cleanup stale L2 primary UDN tunnel ID annotations on restart
cathy-zhou Apr 24, 2026
df2cd31
Merge pull request #6258 from npinaeva/addrset-netpol-replace
trozet Apr 24, 2026
2d56973
Merge pull request #6300 from booxter/bump-metallb-frr-too
trozet Apr 24, 2026
c1e81f8
Adds dynamic allocation for cluster manager
trozet Jan 29, 2026
9f7ece7
Update e2e for Dynamic Subnet Allocation
trozet Jan 30, 2026
9c6e65b
cluster manager: fixes race with NAD deletion
trozet Apr 20, 2026
267f18d
networkmanager: skip dynamic UDN for bare NADs
trozet Apr 21, 2026
726bdd1
e2e egress fw: fixes for Dynamic UDN
trozet Apr 21, 2026
5b9cf80
cluster manager: integrate status manager with d-udn
trozet Apr 21, 2026
53822e3
Fake NM: make it per network activity
trozet Apr 23, 2026
ace7c93
Merge pull request #6301 from cathy-zhou/cleanupStaleAnnotations
trozet Apr 27, 2026
4b7ffe0
Bump the go_modules group across 3 directories with 2 updates
dependabot[bot] Apr 27, 2026
a0e535a
EVPN: add allowas-in origin for BGP neighbors
jcaamano Apr 27, 2026
d445db0
Merge pull request #6160 from booxter/e2e-kubevirt-netshoot-preload
trozet Apr 27, 2026
93ced7c
Merge pull request #5895 from trozet/dynamic_udn_cluster_manager_impl
trozet Apr 27, 2026
1870f5d
Merge pull request #6262 from ovn-kubernetes/dependabot/go_modules/go…
trozet Apr 27, 2026
8e0df84
Merge pull request #6307 from jcaamano/evpn-allowasin-origin
tssurya Apr 28, 2026
b66b092
fix UDN unit test to use new node controller constructor
kyrtapz Apr 28, 2026
c0a9c97
Merge pull request #6309 from kyrtapz/udn_ut_fix
npinaeva Apr 28, 2026
ad46e42
test: fix layer2 UDN controller test flake in kubevirt live-migration
qinqon Apr 27, 2026
8552365
Merge pull request #6306 from qinqon/fix-layer2-udn-test-flake-6280
npinaeva Apr 28, 2026
8f666cc
Merge remote-tracking branch 'upstream/master' into d/s-merge-04-29-2026
Apr 29, 2026
36b7ab5
sync openshift/go.mod with upstream dependencies
Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions contrib/kind-common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,23 @@ install_metallb() {
'kind_path = os.path.join(build_path, "kind")' \
'kind_path = "kind"'

# MetalLB v0.15.3 still pins its in-cluster FRR speaker containers to 10.4.1.
# Keep the pinned upstream string for patching, but replace the actual
# deployed image so CI exercises the same FRR build as the rest of our BGP
# setup and coredump debugging.
replace_in_file_or_exit \
config/frr/speaker-patch.yaml \
"${FRR_K8S_UPSTREAM_FRR_IMAGE}" \
"${FRR_DEPLOYED_IMAGE}"
replace_in_file_or_exit \
config/manifests/metallb-frr.yaml \
"${FRR_K8S_UPSTREAM_FRR_IMAGE}" \
"${FRR_DEPLOYED_IMAGE}"
replace_in_file_or_exit \
charts/metallb/values.yaml \
"tag: ${FRR_K8S_UPSTREAM_FRR_IMAGE##*:}" \
"tag: ${FRR_DEPLOYED_IMAGE##*:}"

pip install -r dev-env/requirements.txt

local ip_family ipv6_network
Expand Down Expand Up @@ -1176,7 +1193,7 @@ get_kubevirt_release_url() {

readonly FRR_K8S_VERSION=v0.0.21
readonly FRR_K8S_UPSTREAM_FRR_IMAGE=quay.io/frrouting/frr:10.4.1
readonly FRR_DEPLOYED_IMAGE=quay.io/frrouting/frr:10.5.3
readonly FRR_DEPLOYED_IMAGE=quay.io/frrouting/frr:10.6.0
# Override to test newer FRR builds in the in-cluster frr-k8s daemonset
# without changing the pinned frr-k8s release.
FRR_K8S_FRR_IMAGE=${FRR_K8S_FRR_IMAGE:-${FRR_DEPLOYED_IMAGE}}
Expand All @@ -1203,13 +1220,14 @@ clone_frr() {
# https://github.com/FRRouting/frr/pull/15714).
#
# Bump to 10.4.1 for upstream demo was posted here: https://github.com/metallb/frr-k8s/pull/404
# We bump further to 10.5.3 to include additional fixes for EVPN and coredumps:
# We bump further to 10.6.0 to include additional fixes for EVPN and coredumps:
# https://github.com/ovn-kubernetes/ovn-kubernetes/pull/5874#issuecomment-3907335193
# https://github.com/ovn-kubernetes/ovn-kubernetes/pull/5874#issuecomment-3898408592
# https://github.com/FRRouting/frr/pull/20496
#
# Note: 10.5.3 is aligned with current metallb trunk:
# https://github.com/metallb/metallb/pull/2993
# Note: 10.6.0 carries the bfdd coredump fix:
# https://github.com/FRRouting/frr/pull/19822
# https://github.com/ovn-kubernetes/ovn-kubernetes/issues/6299
replace_in_file_or_exit \
hack/demo/demo.sh \
"${FRR_K8S_UPSTREAM_FRR_IMAGE}" \
Expand Down
4 changes: 2 additions & 2 deletions go-controller/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ require (
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.10 // indirect
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
github.com/go-openapi/jsonpointer v0.21.1 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.1 // indirect
Expand All @@ -115,7 +115,7 @@ require (
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 // indirect
github.com/mdlayher/packet v1.1.2 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/spdystream v0.5.0 // indirect
github.com/moby/spdystream v0.5.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
Expand Down
8 changes: 4 additions & 4 deletions go-controller/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,8 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
Expand Down Expand Up @@ -570,8 +570,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y=
github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
Expand Down
45 changes: 25 additions & 20 deletions go-controller/pkg/clustermanager/clustermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
udntemplate "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/clustermanager/userdefinednetwork/template"
vtepcontroller "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/clustermanager/vtep"
"github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/config"
nodecontroller "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/controllers/node"
networkconnectclientset "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/crd/clusternetworkconnect/v1/apis/clientset/versioned"
rainformer "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/crd/routeadvertisements/v1/apis/informers/externalversions/routeadvertisements/v1"
vtepinformer "github.com/ovn-kubernetes/ovn-kubernetes/go-controller/pkg/crd/vtep/v1/apis/informers/externalversions/vtep/v1"
Expand All @@ -46,7 +47,7 @@ import (
type ClusterManager struct {
client clientset.Interface
defaultNetClusterController *networkClusterController
nodeController *clusterManagerNodeController
nodeController *nodecontroller.NodeController
zoneClusterController *zoneClusterController
wf *factory.WatchFactory
udnClusterManager *userDefinedNetworkClusterManager
Expand Down Expand Up @@ -87,27 +88,18 @@ func NewClusterManager(
) (*ClusterManager, error) {

wf = wf.ShallowClone()
nodeController := newClusterManagerNodeController(wf)
defaultNetClusterController := newDefaultNetworkClusterController(&util.DefaultNetInfo{}, ovnClient, wf, recorder, nodeController)

zoneClusterController, err := newZoneClusterController(ovnClient, wf)
if err != nil {
return nil, fmt.Errorf("failed to create zone cluster controller, err : %w", err)
cm := &ClusterManager{
client: ovnClient.KubeClient,
wf: wf,
recorder: recorder,
identity: identity,
networkManager: networkmanager.Default(),
}

cm := &ClusterManager{
client: ovnClient.KubeClient,
defaultNetClusterController: defaultNetClusterController,
nodeController: nodeController,
zoneClusterController: zoneClusterController,
wf: wf,
recorder: recorder,
identity: identity,
statusManager: status_manager.NewStatusManager(wf, ovnClient),
}

cm.networkManager = networkmanager.Default()
var tunnelKeysAllocator *id.TunnelKeysAllocator
var (
err error
tunnelKeysAllocator *id.TunnelKeysAllocator
)
if config.OVNKubernetesFeature.EnableMultiNetwork {
// tunnelKeysAllocator is now only used for NAD tunnel keys allocation, but will be reused
// for Connecting UDNs. So we initialize it here and pass it to the networkManager.
Expand All @@ -122,7 +114,20 @@ func NewClusterManager(
if err != nil {
return nil, err
}
}
cm.statusManager = status_manager.NewStatusManager(wf, ovnClient, cm.networkManager.Interface())

nodeController := nodecontroller.NewController(wf, "clustermanager-node", cm.networkManager.Interface())
defaultNetClusterController := newDefaultNetworkClusterController(&util.DefaultNetInfo{}, ovnClient, wf, recorder, nodeController)
zoneClusterController, err := newZoneClusterController(ovnClient, wf)
if err != nil {
return nil, fmt.Errorf("failed to create zone cluster controller, err : %w", err)
}
cm.defaultNetClusterController = defaultNetClusterController
cm.nodeController = nodeController
cm.zoneClusterController = zoneClusterController

if config.OVNKubernetesFeature.EnableMultiNetwork {
cm.udnClusterManager, err = newUserDefinedNetworkClusterManager(ovnClient, wf, cm.networkManager.Interface(), recorder, nodeController)
if err != nil {
return nil, err
Expand Down
9 changes: 9 additions & 0 deletions go-controller/pkg/clustermanager/clustermanager_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,21 @@
package clustermanager

import (
"os"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

func init() {
// Disable WatchListClient feature gate for tests.
// Fake clientsets from third-party libraries don't yet support WatchList semantics
// introduced in K8s 1.35, causing informers to hang waiting for bookmark events.
// See: https://github.com/kubernetes/kubernetes/issues/135895
os.Setenv("KUBE_FEATURE_WatchListClient", "false")
}

func TestClusterManager(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Cluster Manager Operations Suite")
Expand Down
13 changes: 0 additions & 13 deletions go-controller/pkg/clustermanager/clustermanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -167,7 +166,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -259,7 +257,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -331,7 +328,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -442,7 +438,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -515,7 +510,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -627,7 +621,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -754,7 +747,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -1110,7 +1102,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""
config.OVNKubernetesFeature.EnableMultiNetwork = true
config.OVNKubernetesFeature.EnableNetworkSegmentation = true
config.OVNKubernetesFeature.EnableNetworkConnect = true
Expand Down Expand Up @@ -1248,7 +1239,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -1324,7 +1314,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -1421,7 +1410,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -1535,7 +1523,6 @@ var _ = ginkgo.Describe("Cluster Manager", func() {

_, err := config.InitConfig(ctx, nil, nil)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
config.Kubernetes.HostNetworkNamespace = ""

f, err = factory.NewClusterManagerWatchFactory(fakeClient)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down
Loading