55 "errors"
66 "fmt"
77 "net/netip"
8- "os"
9- "os/exec"
10- "strconv"
118 "strings"
129 "time"
1310
@@ -16,7 +13,6 @@ import (
1613 . "github.com/onsi/gomega"
1714 "github.com/ovn-org/ovn-kubernetes/test/e2e/feature"
1815
19- "github.com/docker/docker/client"
2016 v1 "k8s.io/api/core/v1"
2117 apierrors "k8s.io/apimachinery/pkg/api/errors"
2218 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -32,6 +28,7 @@ import (
3228 ipgenerator "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/generator/ip"
3329 util "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
3430 "github.com/ovn-org/ovn-kubernetes/test/e2e/deploymentconfig"
31+ "github.com/ovn-org/ovn-kubernetes/test/e2e/images"
3532 "github.com/ovn-org/ovn-kubernetes/test/e2e/infraprovider"
3633 infraapi "github.com/ovn-org/ovn-kubernetes/test/e2e/infraprovider/api"
3734)
@@ -907,9 +904,9 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
907904 expectedOriginalMTU = 1200
908905 )
909906
910- var netConfig networkAttachmentConfig
911- var underlayBridgeName string
912- var cmdWebServer * exec. Cmd
907+ var (
908+ netConfig networkAttachmentConfig
909+ )
913910
914911 underlayIP := underlayServiceIP + "/24"
915912 Context ("with a service running on the underlay" , func () {
@@ -932,28 +929,23 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
932929 })).To (Succeed ())
933930 })
934931
935- BeforeEach (func () {
936- By ("adding IP to the underlay docker bridge" )
937- cli , err := client .NewClientWithOpts (client .FromEnv )
938- Expect (err ).NotTo (HaveOccurred ())
939-
940- gatewayIP , err := getNetworkGateway (cli , dockerNetworkName )
941- Expect (err ).NotTo (HaveOccurred ())
942-
943- underlayBridgeName , err = findInterfaceByIP (gatewayIP )
944- Expect (err ).NotTo (HaveOccurred ())
945-
946- cmd := exec .Command ("sudo" , "ip" , "addr" , "add" , underlayIP , "dev" , underlayBridgeName )
947- cmd .Stderr = os .Stderr
948- err = cmd .Run ()
949- Expect (err ).NotTo (HaveOccurred ())
950- })
951-
952932 BeforeEach (func () {
953933 By ("starting a service, connected to the underlay" )
954- cmdWebServer = exec .Command ("python3" , "-m" , "http.server" , "--bind" , underlayServiceIP , strconv .Itoa (int (servicePort )))
955- cmdWebServer .Stderr = os .Stderr
956- Expect (cmdWebServer .Start ()).NotTo (HaveOccurred (), "failed to create web server, port might be busy" )
934+ providerCtx = infraprovider .Get ().NewTestContext ()
935+
936+ underlayNetwork , err := infraprovider .Get ().GetNetwork (dockerNetworkName )
937+ Expect (err ).NotTo (HaveOccurred (), "must get underlay network" )
938+ externalContainerName := f .Namespace .Name + "-web-server"
939+ serviceContainerSpec := infraapi.ExternalContainer {
940+ Name : externalContainerName ,
941+ Image : images .AgnHost (),
942+ Network : underlayNetwork ,
943+ Entrypoint : "bash" ,
944+ Args : []string {"-c" , fmt .Sprintf ("ip a add %s/24 dev eth0 && ./agnhost netexec --http-port=%d" , underlayServiceIP , servicePort )},
945+ ExtPort : servicePort ,
946+ }
947+ _ , err = providerCtx .CreateExternalContainer (serviceContainerSpec )
948+ Expect (err ).NotTo (HaveOccurred (), "must create external container 1" )
957949 })
958950
959951 BeforeEach (func () {
@@ -966,18 +958,6 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
966958 Expect (err ).NotTo (HaveOccurred ())
967959 })
968960
969- AfterEach (func () {
970- err := cmdWebServer .Process .Kill ()
971- Expect (err ).NotTo (HaveOccurred ())
972- })
973-
974- AfterEach (func () {
975- cmd := exec .Command ("sudo" , "ip" , "addr" , "del" , underlayIP , "dev" , underlayBridgeName )
976- cmd .Stderr = os .Stderr
977- err := cmd .Run ()
978- Expect (err ).NotTo (HaveOccurred ())
979- })
980-
981961 It ("correctly sets the MTU on the pod" , func () {
982962 Eventually (func () error {
983963 clientPodConfig := podConfiguration {
@@ -1008,6 +988,7 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
1008988
1009989 By ("asserting the *client* pod can contact the underlay service" )
1010990 Expect (connectToServer (clientPodConfig , underlayServiceIP , servicePort )).To (Succeed ())
991+
1011992 })
1012993
1013994 Context ("and networkAttachmentDefinition is modified" , func () {
@@ -1315,29 +1296,30 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
13151296 VlanID : netConfig .vlanID ,
13161297 })).To (Succeed (), "configuring the OVS bridge" )
13171298
1318- By (fmt .Sprintf ("creating a VLAN interface on top of the bridge connecting the cluster nodes with IP: %s" , underlayIP ))
1319- cli , err := client .NewClientWithOpts (client .FromEnv )
1320- Expect (err ).NotTo (HaveOccurred ())
1321-
1322- gatewayIP , err := getNetworkGateway (cli , dockerNetworkName )
1323- Expect (err ).NotTo (HaveOccurred ())
1324-
1325- underlayBridgeName , err = findInterfaceByIP (gatewayIP )
1326- Expect (err ).NotTo (HaveOccurred ())
1327- Expect (createVLANInterface (underlayBridgeName , strconv .Itoa (vlanID ), & underlayIP )).To (
1328- Succeed (),
1329- "create a VLAN interface on the bridge interconnecting the cluster nodes" ,
1330- )
1331-
1332- By ("starting a service, connected to the underlay" )
1333- cmdWebServer = exec .Command ("python3" , "-m" , "http.server" , "--bind" , underlayServiceIP , strconv .Itoa (port ))
1334- cmdWebServer .Stderr = os .Stderr
1335- Expect (cmdWebServer .Start ()).NotTo (HaveOccurred (), "failed to create web server, port might be busy" )
1336- })
1299+ By ("starting a service, connected to the underlay over a VLAN" )
1300+ providerCtx = infraprovider .Get ().NewTestContext ()
1301+
1302+ ifName := "eth0"
1303+ vlanName := fmt .Sprintf ("%s.%d" , ifName , vlanID )
1304+ underlayNetwork , err := infraprovider .Get ().GetNetwork (dockerNetworkName )
1305+ Expect (err ).NotTo (HaveOccurred (), "must get underlay network" )
1306+ externalContainerName := f .Namespace .Name + "-web-server"
1307+ serviceContainerSpec := infraapi.ExternalContainer {
1308+ Name : externalContainerName ,
1309+ Image : images .AgnHost (),
1310+ Network : underlayNetwork ,
1311+ Entrypoint : "bash" ,
1312+ ExtPort : servicePort ,
1313+ Args : []string {"-c" , fmt .Sprintf (`
1314+ ip link add link %[1]s name %[2]s type vlan id %[3]d
1315+ ip link set dev %[2]s up
1316+ ip a add %[4]s/24 dev %[2]s
1317+ ./agnhost netexec --http-port=%[5]d
1318+ ` , ifName , vlanName , vlanID , underlayServiceIP , servicePort )},
1319+ }
1320+ _ , err = providerCtx .CreateExternalContainer (serviceContainerSpec )
1321+ Expect (err ).NotTo (HaveOccurred (), "must create external container 1" )
13371322
1338- AfterEach (func () {
1339- Expect (cmdWebServer .Process .Kill ()).NotTo (HaveOccurred (), "kill the python webserver" )
1340- Expect (deleteVLANInterface (underlayBridgeName , strconv .Itoa (vlanID ))).NotTo (HaveOccurred (), "remove the underlay physical configuration" )
13411323 })
13421324
13431325 It ("the same bridge mapping can be shared by a separate VLAN by using the physical network name attribute" , func () {
@@ -1370,6 +1352,7 @@ var _ = Describe("Multi Homing", feature.MultiHoming, func() {
13701352
13711353 By (fmt .Sprintf ("asserting the *client* pod can contact the underlay service with IP %q on the separate vlan" , underlayIP ))
13721354 Expect (connectToServer (clientPodConfig , underlayServiceIP , servicePort )).To (Succeed ())
1355+
13731356 })
13741357 })
13751358 })
0 commit comments