@@ -36,6 +36,7 @@ import (
3636 cnofake "github.com/openshift/cluster-network-operator/pkg/client/fake"
3737 "github.com/openshift/cluster-network-operator/pkg/hypershift"
3838 "github.com/openshift/cluster-network-operator/pkg/names"
39+ "github.com/openshift/cluster-network-operator/pkg/render"
3940)
4041
4142var (
@@ -4245,3 +4246,95 @@ func TestRenderOVNKubernetes_AdvertisedUDNIsolationModeOverride(t *testing.T) {
42454246 g .Expect (ovnkubeScriptLib ).To (ContainSubstring (`--advertised-udn-isolation-mode="` ))
42464247 })
42474248}
4249+
4250+ func TestOVNKubernetesScriptLibGatewayInterface (t * testing.T ) {
4251+ g := NewGomegaWithT (t )
4252+
4253+ testCases := []struct {
4254+ name string
4255+ ovnNodeMode string
4256+ expectedGatewayInterface string
4257+ }{
4258+ {
4259+ name : "dpu-host mode uses derive-from-mgmt-port" ,
4260+ ovnNodeMode : "dpu-host" ,
4261+ expectedGatewayInterface : "derive-from-mgmt-port" ,
4262+ },
4263+ {
4264+ name : "non-dpu-host mode uses br-ex" ,
4265+ ovnNodeMode : "full" ,
4266+ expectedGatewayInterface : "br-ex" ,
4267+ },
4268+ }
4269+
4270+ for _ , tc := range testCases {
4271+ t .Run (tc .name , func (t * testing.T ) {
4272+ // Create render data
4273+ data := render .MakeRenderData ()
4274+ data .Data ["OVN_NODE_MODE" ] = tc .ovnNodeMode
4275+ data .Data ["OVN_GATEWAY_MODE" ] = "shared"
4276+
4277+ // Set all required template variables for 008-script-lib.yaml
4278+ data .Data ["ReleaseVersion" ] = "4.15.0"
4279+ data .Data ["OVNPolicyAuditDestination" ] = "null"
4280+ data .Data ["OVNPolicyAuditSyslogFacility" ] = "local0"
4281+ data .Data ["OVN_LOG_PATTERN_CONSOLE" ] = "%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m"
4282+ data .Data ["NorthdThreads" ] = "1"
4283+ data .Data ["OVNPolicyAuditMaxFileSize" ] = "50"
4284+ data .Data ["OVNPolicyAuditMaxLogFiles" ] = "5"
4285+ data .Data ["OVN_NB_INACTIVITY_PROBE" ] = "60000"
4286+ data .Data ["OVN_NORTHD_BACKOFF_MS" ] = "300"
4287+ data .Data ["PlatformType" ] = "AWS"
4288+ data .Data ["OVN_CONTROLLER_INACTIVITY_PROBE" ] = "30000"
4289+ data .Data ["GenevePort" ] = "8061"
4290+ data .Data ["OVNHybridOverlayVXLANPort" ] = ""
4291+ data .Data ["OVN_MULTI_NETWORK_ENABLE" ] = "false"
4292+ data .Data ["OVN_NETWORK_SEGMENTATION_ENABLE" ] = "false"
4293+ data .Data ["OVN_ROUTE_ADVERTISEMENTS_ENABLE" ] = "false"
4294+ data .Data ["OVN_OBSERVABILITY_ENABLE" ] = "false"
4295+ data .Data ["OVN_MULTI_NETWORK_POLICY_ENABLE" ] = "false"
4296+ data .Data ["OVN_ADMIN_NETWORK_POLICY_ENABLE" ] = "false"
4297+ data .Data ["DNS_NAME_RESOLVER_ENABLE" ] = "false"
4298+ data .Data ["IP_FORWARDING_MODE" ] = "Restricted"
4299+ data .Data ["NETWORK_NODE_IDENTITY_ENABLE" ] = "false"
4300+ data .Data ["NodeIdentityCertDuration" ] = "24h"
4301+ data .Data ["V4JoinSubnet" ] = ""
4302+ data .Data ["V6JoinSubnet" ] = ""
4303+ data .Data ["V4MasqueradeSubnet" ] = ""
4304+ data .Data ["V6MasqueradeSubnet" ] = ""
4305+ data .Data ["V4TransitSwitchSubnet" ] = ""
4306+ data .Data ["V6TransitSwitchSubnet" ] = ""
4307+ data .Data ["OVNPolicyAuditRateLimit" ] = "20"
4308+ data .Data ["IsNetworkTypeLiveMigration" ] = false
4309+ data .Data ["OVNIPsecEnable" ] = false
4310+ data .Data ["OVNIPsecEncap" ] = "Auto"
4311+ data .Data ["OVN_PRE_CONF_UDN_ADDR_ENABLE" ] = false
4312+ data .Data ["AdvertisedUDNIsolationMode" ] = ""
4313+
4314+ // Render the script-lib template
4315+ scriptLibPath := "../../bindata/network/ovn-kubernetes/common/008-script-lib.yaml"
4316+ objs , err := render .RenderTemplate (scriptLibPath , & data )
4317+ g .Expect (err ).NotTo (HaveOccurred (), "Template rendering should succeed for %s" , tc .name )
4318+ g .Expect (objs ).To (HaveLen (1 ), "Should render exactly one object" )
4319+
4320+ // Verify it's a ConfigMap with the expected name
4321+ obj := objs [0 ]
4322+ g .Expect (obj .GetKind ()).To (Equal ("ConfigMap" ))
4323+ g .Expect (obj .GetName ()).To (Equal ("ovnkube-script-lib" ))
4324+
4325+ // Extract the script content from the ConfigMap
4326+ scriptData , found , err := uns .NestedString (obj .Object , "data" , "ovnkube-lib.sh" )
4327+ g .Expect (err ).NotTo (HaveOccurred ())
4328+ g .Expect (found ).To (BeTrue (), "Should find ovnkube-lib.sh in ConfigMap data" )
4329+
4330+ // Validate gateway interface assignment
4331+ expectedGatewayAssignment := fmt .Sprintf ("gateway_interface=%s" , tc .expectedGatewayInterface )
4332+ g .Expect (scriptData ).To (ContainSubstring (expectedGatewayAssignment ),
4333+ "Script should contain correct gateway interface assignment for %s mode" , tc .ovnNodeMode )
4334+
4335+ // Validate that gateway_mode_flags uses the variable
4336+ g .Expect (scriptData ).To (ContainSubstring ("--gateway-interface ${gateway_interface}" ),
4337+ "Script should use gateway_interface variable in gateway_mode_flags" )
4338+ })
4339+ }
4340+ }
0 commit comments