diff --git a/bindata/network/ovn-kubernetes/common/008-script-lib.yaml b/bindata/network/ovn-kubernetes/common/008-script-lib.yaml index 4eb3ad4b40..df3c9b1c7c 100644 --- a/bindata/network/ovn-kubernetes/common/008-script-lib.yaml +++ b/bindata/network/ovn-kubernetes/common/008-script-lib.yaml @@ -510,6 +510,9 @@ data: # Ensure ovn_advertised_udn_isolation_mode_flag is always defined ovn_advertised_udn_isolation_mode_flag= + # Ensure openflow_probe_flag is always defined + openflow_probe_flag= + if [[ $# -ne 3 ]]; then echo "Expected three arguments but got $#" exit 1 @@ -672,6 +675,10 @@ data: ovn_advertised_udn_isolation_mode_flag="--advertised-udn-isolation-mode={{.AdvertisedUDNIsolationMode}}" fi + if [[ "{{.OpenFlowProbe}}" != "" ]]; then + openflow_probe_flag="--openflow-probe={{.OpenFlowProbe}}" + fi + NETWORK_NODE_IDENTITY_ENABLE= if [[ "{{.NETWORK_NODE_IDENTITY_ENABLE}}" == "true" ]]; then NETWORK_NODE_IDENTITY_ENABLE=" @@ -740,6 +747,7 @@ data: ${gw_interface_flag} \ ${ip_forwarding_flag} \ ${ovn_advertised_udn_isolation_mode_flag} \ + ${openflow_probe_flag} \ ${NETWORK_NODE_IDENTITY_ENABLE} \ ${ovn_v4_join_subnet_opt} \ ${ovn_v6_join_subnet_opt} \ diff --git a/pkg/network/ovn_kubernetes.go b/pkg/network/ovn_kubernetes.go index f5d51de5cd..748dac1994 100644 --- a/pkg/network/ovn_kubernetes.go +++ b/pkg/network/ovn_kubernetes.go @@ -184,6 +184,17 @@ func renderOVNKubernetes(conf *operv1.NetworkSpec, bootstrapResult *bootstrap.Bo data.Data["NodeIdentityCertDuration"] = OVN_NODE_IDENTITY_CERT_DURATION data.Data["IsNetworkTypeLiveMigration"] = false data.Data["AdvertisedUDNIsolationMode"] = bootstrapResult.OVN.OVNKubernetesConfig.ConfigOverrides["advertised-udn-isolation-mode"] + data.Data["OpenFlowProbe"] = "" + if raw, ok := bootstrapResult.OVN.OVNKubernetesConfig.ConfigOverrides["openflow-probe"]; ok { + probe := strings.TrimSpace(raw) + if probe != "" { + if _, err := strconv.ParseUint(probe, 10, 32); err != nil { + klog.Warningf("Ignoring invalid openflow-probe override %q: expected non-negative integer", raw) + } else { + data.Data["OpenFlowProbe"] = probe + } + } + } if conf.Migration != nil { if conf.Migration.MTU != nil && conf.Migration.Mode != operv1.LiveNetworkMigrationMode { diff --git a/pkg/network/ovn_kubernetes_test.go b/pkg/network/ovn_kubernetes_test.go index 8109ab1166..e1b494f5ac 100644 --- a/pkg/network/ovn_kubernetes_test.go +++ b/pkg/network/ovn_kubernetes_test.go @@ -4248,6 +4248,52 @@ func TestRenderOVNKubernetes_AdvertisedUDNIsolationModeOverride(t *testing.T) { }) } +func TestRenderOVNKubernetes_OpenFlowProbeOverride(t *testing.T) { + g := NewGomegaWithT(t) + + crd := OVNKubernetesConfig.DeepCopy() + config := &crd.Spec + fillDefaults(config, nil) + + renderWithOverrides := func(overrides map[string]string) string { + bootstrapResult := fakeBootstrapResult() + bootstrapResult.OVN = bootstrap.OVNBootstrapResult{ + ControlPlaneReplicaCount: 3, + OVNKubernetesConfig: &bootstrap.OVNConfigBoostrapResult{ + DpuHostModeLabel: OVN_NODE_SELECTOR_DEFAULT_DPU_HOST, + DpuModeLabel: OVN_NODE_SELECTOR_DEFAULT_DPU, + SmartNicModeLabel: OVN_NODE_SELECTOR_DEFAULT_SMART_NIC, + MgmtPortResourceName: "", + HyperShiftConfig: &bootstrap.OVNHyperShiftBootstrapResult{ + Enabled: false, + }, + ConfigOverrides: overrides, + }, + } + featureGatesCNO := getDefaultFeatureGates() + fakeClient := cnofake.NewFakeClient() + + objs, _, err := renderOVNKubernetes(config, bootstrapResult, manifestDirOvn, fakeClient, featureGatesCNO) + g.Expect(err).NotTo(HaveOccurred()) + return extractOVNScriptLib(g, objs) + } + + t.Run("with openflow-probe override", func(t *testing.T) { + ovnkubeScriptLib := renderWithOverrides(map[string]string{"openflow-probe": "60"}) + g.Expect(ovnkubeScriptLib).To(ContainSubstring(`--openflow-probe=60"`)) + }) + + t.Run("without openflow-probe override", func(t *testing.T) { + ovnkubeScriptLib := renderWithOverrides(nil) + g.Expect(ovnkubeScriptLib).To(ContainSubstring(`--openflow-probe="`)) + }) + + t.Run("with invalid openflow-probe override", func(t *testing.T) { + ovnkubeScriptLib := renderWithOverrides(map[string]string{"openflow-probe": "-60"}) + g.Expect(ovnkubeScriptLib).To(ContainSubstring(`--openflow-probe="`)) + }) +} + func TestOVNKubernetesControlPlaneFlags(t *testing.T) { g := NewGomegaWithT(t)