@@ -13,10 +13,12 @@ import (
1313
1414 "github.com/onsi/ginkgo/v2"
1515 "github.com/ovn-org/ovn-kubernetes/test/e2e/containerengine"
16+ "github.com/ovn-org/ovn-kubernetes/test/e2e/deploymentconfig"
1617 "github.com/ovn-org/ovn-kubernetes/test/e2e/images"
1718 "github.com/ovn-org/ovn-kubernetes/test/e2e/infraprovider/api"
1819 "github.com/ovn-org/ovn-kubernetes/test/e2e/infraprovider/portalloc"
1920
21+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2022 "k8s.io/apimachinery/pkg/util/wait"
2123 "k8s.io/kubernetes/test/e2e/framework"
2224 utilnet "k8s.io/utils/net"
@@ -145,6 +147,9 @@ func (c *contextKind) createExternalContainer(container api.ExternalContainer) (
145147 return container , fmt .Errorf ("container %s already exists" , container .Name )
146148 }
147149 cmd := []string {"run" , "-itd" , "--privileged" , "--name" , container .Name , "--network" , container .Network .Name (), "--hostname" , container .Name }
150+ if container .Entrypoint != "" {
151+ cmd = append (cmd , "--entrypoint" , container .Entrypoint )
152+ }
148153 cmd = append (cmd , container .Image )
149154 if len (container .Args ) > 0 {
150155 cmd = append (cmd , container .Args ... )
@@ -359,6 +364,83 @@ func (c *contextKind) getAttachedNetworks() (api.Networks, error) {
359364 return attachedNetworks , nil
360365}
361366
367+ func (c * contextKind ) SetupUnderlay (f * framework.Framework , underlay api.Underlay ) error {
368+ if underlay .LogicalNetworkName == "" {
369+ return fmt .Errorf ("underlay logical network name must be set" )
370+ }
371+
372+ if underlay .PhysicalNetworkName == "" {
373+ underlay .PhysicalNetworkName = "underlay"
374+ }
375+
376+ if underlay .BridgeName == "" {
377+ underlay .BridgeName = secondaryBridge
378+ }
379+
380+ const (
381+ ovsKubeNodeLabel = "app=ovnkube-node"
382+ )
383+
384+ ovsPodList , err := f .ClientSet .CoreV1 ().Pods (deploymentconfig .Get ().OVNKubernetesNamespace ()).List (
385+ context .Background (),
386+ metav1.ListOptions {LabelSelector : ovsKubeNodeLabel },
387+ )
388+ if err != nil {
389+ return fmt .Errorf ("failed to list OVS pods with label %q at namespace %q: %w" , ovsKubeNodeLabel , deploymentconfig .Get ().OVNKubernetesNamespace (), err )
390+ }
391+
392+ if len (ovsPodList .Items ) == 0 {
393+ return fmt .Errorf ("no pods with label %q in namespace %q" , ovsKubeNodeLabel , deploymentconfig .Get ().OVNKubernetesNamespace ())
394+ }
395+ for _ , ovsPod := range ovsPodList .Items {
396+ if underlay .BridgeName != deploymentconfig .Get ().ExternalBridgeName () {
397+ underlayInterface , err := getNetworkInterface (ovsPod .Spec .NodeName , underlay .PhysicalNetworkName )
398+ if err != nil {
399+ return fmt .Errorf ("failed to get underlay interface for network %s on node %s: %w" , underlay .PhysicalNetworkName , ovsPod .Spec .NodeName , err )
400+ }
401+ c .AddCleanUpFn (func () error {
402+ if err := removeOVSBridge (ovsPod .Namespace , ovsPod .Name , underlay .BridgeName ); err != nil {
403+ return fmt .Errorf ("failed to remove OVS bridge %s for pod %s/%s during cleanup: %w" , underlay .BridgeName , ovsPod .Namespace , ovsPod .Name , err )
404+ }
405+ return nil
406+ })
407+ if err := ensureOVSBridge (ovsPod .Namespace , ovsPod .Name , underlay .BridgeName ); err != nil {
408+ return fmt .Errorf ("failed to add OVS bridge %s for pod %s/%s: %w" , underlay .BridgeName , ovsPod .Namespace , ovsPod .Name , err )
409+ }
410+
411+ if err := ovsAttachPortToBridge (ovsPod .Namespace , ovsPod .Name , underlay .BridgeName , underlayInterface .InfName ); err != nil {
412+ return fmt .Errorf ("failed to attach port %s to bridge %s for pod %s/%s: %w" , underlayInterface .InfName , underlay .BridgeName , ovsPod .Namespace , ovsPod .Name , err )
413+ }
414+ if underlay .VlanID > 0 {
415+ if err := ovsEnableVLANAccessPort (ovsPod .Namespace , ovsPod .Name , underlay .BridgeName , underlayInterface .InfName , underlay .VlanID ); err != nil {
416+ return fmt .Errorf ("failed to enable VLAN %d on port %s for bridge %s for pod %s/%s: %w" , underlay .VlanID , underlayInterface .InfName , underlay .BridgeName , ovsPod .Namespace , ovsPod .Name , err )
417+ }
418+ }
419+ }
420+ c .AddCleanUpFn (func () error {
421+ if err := configureBridgeMappings (
422+ ovsPod .Namespace ,
423+ ovsPod .Name ,
424+ defaultNetworkBridgeMapping (),
425+ ); err != nil {
426+ return fmt .Errorf ("failed to restore default bridge mappings for pod %s/%s during cleanup: %w" , ovsPod .Namespace , ovsPod .Name , err )
427+ }
428+ return nil
429+ })
430+
431+ if err := configureBridgeMappings (
432+ ovsPod .Namespace ,
433+ ovsPod .Name ,
434+ defaultNetworkBridgeMapping (),
435+ bridgeMapping (underlay .LogicalNetworkName , underlay .BridgeName ),
436+ ); err != nil {
437+ return fmt .Errorf ("failed to configure bridge mappings for pod %s/%s for logical network %s to bridge %s: %w" , ovsPod .Namespace , ovsPod .Name , underlay .LogicalNetworkName , underlay .BridgeName , err )
438+ }
439+ }
440+ return nil
441+
442+ }
443+
362444func (c * contextKind ) AddCleanUpFn (cleanUpFn func () error ) {
363445 c .Lock ()
364446 defer c .Unlock ()
0 commit comments