Skip to content

Commit 115b25a

Browse files
committed
e2e: Move http servers to external container
Signed-off-by: Enrique Llorente <[email protected]>
1 parent ae5b638 commit 115b25a

File tree

4 files changed

+55
-119
lines changed

4 files changed

+55
-119
lines changed

test/e2e/infraprovider/api/api.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,14 @@ func (n NetworkInterface) GetMAC() string {
182182
}
183183

184184
type ExternalContainer struct {
185-
Name string
186-
Image string
187-
Network Network
188-
Args []string
189-
ExtPort uint16
190-
IPv4 string
191-
IPv6 string
185+
Name string
186+
Image string
187+
Network Network
188+
Entrypoint string
189+
Args []string
190+
ExtPort uint16
191+
IPv4 string
192+
IPv6 string
192193
}
193194

194195
func (ec ExternalContainer) GetName() string {

test/e2e/infraprovider/providers/kind/kind.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ func (c *contextKind) createExternalContainer(container api.ExternalContainer) (
147147
return container, fmt.Errorf("container %s already exists", container.Name)
148148
}
149149
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+
}
150153
cmd = append(cmd, container.Image)
151154
if len(container.Args) > 0 {
152155
cmd = append(cmd, container.Args...)

test/e2e/localnet-underlay.go

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1 @@
11
package e2e
2-
3-
import (
4-
"fmt"
5-
"os"
6-
"os/exec"
7-
)
8-
9-
// TODO: make this function idempotent; use golang netlink instead
10-
func createVLANInterface(deviceName string, vlanID string, ipAddress *string) error {
11-
vlan := vlanName(deviceName, vlanID)
12-
cmd := exec.Command("sudo", "ip", "link", "add", "link", deviceName, "name", vlan, "type", "vlan", "id", vlanID)
13-
cmd.Stderr = os.Stderr
14-
if err := cmd.Run(); err != nil {
15-
return fmt.Errorf("failed to create vlan interface %s: %v", vlan, err)
16-
}
17-
18-
cmd = exec.Command("sudo", "ip", "link", "set", "dev", vlan, "up")
19-
cmd.Stderr = os.Stderr
20-
if err := cmd.Run(); err != nil {
21-
return fmt.Errorf("failed to enable vlan interface %s: %v", vlan, err)
22-
}
23-
24-
if ipAddress != nil {
25-
cmd = exec.Command("sudo", "ip", "addr", "add", *ipAddress, "dev", vlan)
26-
cmd.Stderr = os.Stderr
27-
28-
if err := cmd.Run(); err != nil {
29-
return fmt.Errorf("failed to define the vlan interface %q IP Address %s: %v", vlan, *ipAddress, err)
30-
}
31-
}
32-
return nil
33-
}
34-
35-
// TODO: make this function idempotent; use golang netlink instead
36-
func deleteVLANInterface(deviceName string, vlanID string) error {
37-
vlan := vlanName(deviceName, vlanID)
38-
cmd := exec.Command("sudo", "ip", "link", "del", vlan)
39-
cmd.Stderr = os.Stderr
40-
if err := cmd.Run(); err != nil {
41-
return fmt.Errorf("failed to delete vlan interface %s: %v", vlan, err)
42-
}
43-
return nil
44-
}
45-
46-
func vlanName(deviceName string, vlanID string) string {
47-
// MAX IFSIZE 16; got to truncate it to add the vlan suffix
48-
if len(deviceName)+len(vlanID)+1 > 16 {
49-
deviceName = deviceName[:len(deviceName)-len(vlanID)-1]
50-
}
51-
return fmt.Sprintf("%s.%s", deviceName, vlanID)
52-
}

test/e2e/multihoming.go

Lines changed: 44 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import (
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

Comments
 (0)