hs-test: experimental support for multiple test instances 88/39988/11
authoradrianvillin <[email protected]>
Tue, 13 Feb 2024 11:00:02 +0000 (06:00 -0500)
committerFlorin Coras <[email protected]>
Tue, 12 Mar 2024 16:48:46 +0000 (16:48 +0000)
- appending PID to interface and container names
- added a check for used IP addresses
- TestEnvoyProxyHttpTcp and TestTcpWithLoss are broken when running multiple instances

Type: test

Change-Id: Ib917079ec7cf851dee59ff9c67e74f48c7c5e3c6
Signed-off-by: adrianvillin <[email protected]>
16 files changed:
extras/hs-test/address_allocator.go
extras/hs-test/container.go
extras/hs-test/echo_test.go
extras/hs-test/hst_suite.go
extras/hs-test/http_test.go
extras/hs-test/ldp_test.go
extras/hs-test/linux_iperf_test.go
extras/hs-test/mirroring_test.go
extras/hs-test/proxy_test.go
extras/hs-test/raw_session_test.go
extras/hs-test/suite_nginx_test.go
extras/hs-test/suite_no_topo_test.go
extras/hs-test/suite_ns_test.go
extras/hs-test/suite_veth_test.go
extras/hs-test/tools/http_server/http_server.go
extras/hs-test/vcl_test.go

index c08f889..72bc298 100644 (file)
@@ -1,11 +1,20 @@
 package main
 
-import "fmt"
+import (
+       "errors"
+       "fmt"
+       "os"
+       "strings"
+
+       "github.com/edwarnicke/exechelper"
+)
 
 type AddressCounter = int
 
 type Ip4AddressAllocator struct {
        networks map[int]AddressCounter
+       chosenOctet int
+       assignedIps []string
 }
 
 func (a *Ip4AddressAllocator) AddNetwork(networkNumber int) {
@@ -28,12 +37,59 @@ func (a *Ip4AddressAllocator) NewIp4InterfaceAddress(inputNetworkNumber ...int)
                return "", fmt.Errorf("no available IPv4 addresses")
        }
 
-       address := fmt.Sprintf("10.10.%v.%v/24", networkNumber, numberOfAddresses)
+       address, err := a.createIpAddress(networkNumber, numberOfAddresses)
+
        a.networks[networkNumber] = numberOfAddresses + 1
 
+       return address + "/24", err
+}
+
+// Creates a file every time an IP is assigned: used to keep track of addresses in use.
+// If an address is not in use, 'counter' is then copied to 'chosenOctet' and it is used for the remaining tests.
+// Also checks host IP addresses.
+func (a *Ip4AddressAllocator) createIpAddress(networkNumber int, numberOfAddresses int) (string, error){
+       hostIps, _ := exechelper.CombinedOutput("ip a")
+       counter := 10
+       var address string
+
+       for {
+               if a.chosenOctet != 0 {
+                       address = fmt.Sprintf("10.%v.%v.%v", a.chosenOctet, networkNumber, numberOfAddresses)
+                       file, err := os.Create(address)
+                       if err != nil{
+                               return "", errors.New("unable to create file: " + fmt.Sprint(err))
+                       }
+                       file.Close()
+                       break
+               } else {
+                       address = fmt.Sprintf("10.%v.%v.%v", counter, networkNumber, numberOfAddresses)
+                       _, err := os.Stat(address)
+                       if err == nil || strings.Contains(string(hostIps), address) {
+                               counter++
+                       } else if os.IsNotExist(err) {
+                               file, err := os.Create(address)
+                                       if err != nil{
+                                       return "", errors.New("unable to create file: " + fmt.Sprint(err))
+                                       }
+                               file.Close()
+                               a.chosenOctet = counter
+                               break
+                       } else {
+                               return "", errors.New("an error occured while checking if a file exists: " + fmt.Sprint(err))
+                       }
+               }
+       }
+
+       a.assignedIps = append(a.assignedIps, address)
        return address, nil
 }
 
+func (a *Ip4AddressAllocator) deleteIpAddresses(){
+       for ip := range a.assignedIps{
+               os.Remove(a.assignedIps[ip])
+       }
+}
+
 func NewIp4AddressAllocator() *Ip4AddressAllocator {
        var ip4AddrAllocator = new(Ip4AddressAllocator)
        ip4AddrAllocator.networks = make(map[int]AddressCounter)
index 10b5933..87e8aa3 100644 (file)
@@ -38,7 +38,7 @@ type Container struct {
        vppInstance      *VppInstance
 }
 
-func newContainer(suite *HstSuite, yamlInput ContainerConfig) (*Container, error) {
+func newContainer(suite *HstSuite, yamlInput ContainerConfig, pid string) (*Container, error) {
        containerName := yamlInput["name"].(string)
        if len(containerName) == 0 {
                err := fmt.Errorf("container name must not be blank")
@@ -48,7 +48,7 @@ func newContainer(suite *HstSuite, yamlInput ContainerConfig) (*Container, error
        var container = new(Container)
        container.volumes = make(map[string]Volume)
        container.envVars = make(map[string]string)
-       container.name = containerName
+       container.name = containerName + pid
        container.suite = suite
 
        if image, ok := yamlInput["image"]; ok {
@@ -76,7 +76,7 @@ func newContainer(suite *HstSuite, yamlInput ContainerConfig) (*Container, error
        }
 
        if _, ok := yamlInput["volumes"]; ok {
-               workingVolumeDir := logDir + container.suite.T().Name() + volumeDir
+               workingVolumeDir := logDir + container.suite.T().Name() + pid + volumeDir
                workDirReplacer := strings.NewReplacer("$HST_DIR", workDir)
                volDirReplacer := strings.NewReplacer("$HST_VOLUME_DIR", workingVolumeDir)
                for _, volu := range yamlInput["volumes"].([]interface{}) {
@@ -249,7 +249,7 @@ func (c *Container) copy(sourceFileName string, targetFileName string) error {
 }
 
 func (c *Container) createFile(destFileName string, content string) error {
-       f, err := os.CreateTemp("/tmp", "hst-config")
+       f, err := os.CreateTemp("/tmp", "hst-config" + c.suite.pid)
        if err != nil {
                return err
        }
index 8dd620a..690f6d1 100644 (file)
@@ -2,7 +2,7 @@ package main
 
 func (s *VethsSuite) TestEchoBuiltin() {
        serverVpp := s.getContainerByName("server-vpp").vppInstance
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
 
        serverVpp.vppctl("test echo server " +
                " uri tcp://" + serverVeth.ip4AddressString() + "/1234")
@@ -19,7 +19,7 @@ func (s *VethsSuite) TestEchoBuiltin() {
 func (s *VethsSuite) TestTcpWithLoss() {
        serverVpp := s.getContainerByName("server-vpp").vppInstance
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        serverVpp.vppctl("test echo server uri tcp://%s/20022",
                serverVeth.ip4AddressString())
 
@@ -33,7 +33,7 @@ func (s *VethsSuite) TestTcpWithLoss() {
        clientVpp.vppctl("set nsim poll-main-thread delay 0.01 ms bandwidth 40 gbit" +
                " packet-size 1400 packets-per-drop 1000")
 
-       clientVpp.vppctl("nsim output-feature enable-disable " + s.netInterfaces[clientInterfaceName].name)
+       clientVpp.vppctl("nsim output-feature enable-disable " + s.getInterfaceByName(clientInterfaceName).name)
 
        // Do echo test from client-vpp container
        output := clientVpp.vppctl("test echo client uri tcp://%s/20022 verbose echo-bytes mbytes 50",
index 908c046..c5c8edb 100644 (file)
@@ -38,10 +38,12 @@ type HstSuite struct {
        cpuAllocator     *CpuAllocatorT
        cpuContexts      []*CpuContext
        cpuPerVpp        int
+       pid                              string
 }
 
 func (s *HstSuite) SetupSuite() {
        var err error
+       s.pid = fmt.Sprint(os.Getpid())
        s.cpuAllocator, err = CpuAllocator()
        if err != nil {
                s.FailNow("failed to init cpu allocator: %v", err)
@@ -73,6 +75,7 @@ func (s *HstSuite) TearDownTest() {
        }
        s.resetContainers()
        s.removeVolumes()
+       s.ip4AddrAllocator.deleteIpAddresses()
 }
 
 func (s *HstSuite) skipIfUnconfiguring() {
@@ -134,7 +137,6 @@ func logVppInstance(container *Container, maxLines int){
                fmt.Println(line)
        }
        fmt.Printf("^^^^^^^^^^^^^^^\n\n")
-
 }
 
 func (s *HstSuite) hstFail() {
@@ -242,8 +244,16 @@ func (s *HstSuite) removeVolumes() {
        }
 }
 
+func (s *HstSuite) getNetNamespaceByName(name string) string {
+       return name + s.pid
+}
+
+func (s *HstSuite) getInterfaceByName(name string) *NetInterface {
+       return s.netInterfaces[name + s.pid]
+}
+
 func (s *HstSuite) getContainerByName(name string) *Container {
-       return s.containers[name]
+       return s.containers[name + s.pid]
 }
 
 /*
@@ -251,7 +261,7 @@ func (s *HstSuite) getContainerByName(name string) *Container {
  * are not able to modify the original container and affect other tests by doing that
  */
 func (s *HstSuite) getTransientContainerByName(name string) *Container {
-       containerCopy := *s.containers[name]
+       containerCopy := *s.containers[name + s.pid]
        return &containerCopy
 }
 
@@ -269,7 +279,7 @@ func (s *HstSuite) loadContainerTopology(topologyName string) {
        for _, elem := range yamlTopo.Volumes {
                volumeMap := elem["volume"].(VolumeConfig)
                hostDir := volumeMap["host-dir"].(string)
-               workingVolumeDir := logDir + s.T().Name() + volumeDir
+               workingVolumeDir := logDir + s.T().Name() + s.pid + volumeDir
                volDirReplacer := strings.NewReplacer("$HST_VOLUME_DIR", workingVolumeDir)
                hostDir = volDirReplacer.Replace(hostDir)
                s.volumes = append(s.volumes, hostDir)
@@ -277,7 +287,8 @@ func (s *HstSuite) loadContainerTopology(topologyName string) {
 
        s.containers = make(map[string]*Container)
        for _, elem := range yamlTopo.Containers {
-               newContainer, err := newContainer(s, elem)
+               newContainer, err := newContainer(s, elem, s.pid)
+               newContainer.suite = s
                if err != nil {
                        s.T().Fatalf("container config error: %v", err)
                }
@@ -298,7 +309,32 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) {
 
        s.ip4AddrAllocator = NewIp4AddressAllocator()
        s.netInterfaces = make(map[string]*NetInterface)
+
        for _, elem := range yamlTopo.Devices {
+               if _, ok := elem["name"]; ok {
+                       elem["name"] = elem["name"].(string) + s.pid
+               }
+
+               if peer, ok := elem["peer"].(NetDevConfig); ok {
+                       if peer["name"].(string) != ""{
+                               peer["name"] = peer["name"].(string) + s.pid
+                       }
+                       if _, ok := peer["netns"]; ok{
+                               peer["netns"] = peer["netns"].(string) + s.pid
+                       }
+               }
+
+               if _, ok := elem["netns"]; ok {
+                       elem["netns"] = elem["netns"].(string) + s.pid
+               }
+
+               if _, ok := elem["interfaces"]; ok {
+                       interfaceCount := len(elem["interfaces"].([]interface{}))
+                       for i := 0; i < interfaceCount; i++ {
+                               elem["interfaces"].([]interface{})[i] = elem["interfaces"].([]interface{})[i].(string) + s.pid
+                       }
+               }
+
                switch elem["type"].(string) {
                case NetNs:
                        {
@@ -366,8 +402,17 @@ func (s *HstSuite) getTestId() string {
        return s.testIds[testName]
 }
 
+// Returns last 4 digits of PID
+func (s *HstSuite) getPortFromPid() string {
+       port := s.pid
+       for len(port) < 4 {
+               port += "0"
+       }
+       return port[len(port)-4:]
+}
+
 func (s *HstSuite) startServerApp(running chan error, done chan struct{}, env []string) {
-       cmd := exec.Command("iperf3", "-4", "-s")
+       cmd := exec.Command("iperf3", "-4", "-s", "-p", s.getPortFromPid())
        if env != nil {
                cmd.Env = env
        }
@@ -391,7 +436,7 @@ func (s *HstSuite) startClientApp(ipAddress string, env []string, clnCh chan err
        nTries := 0
 
        for {
-               cmd := exec.Command("iperf3", "-c", ipAddress, "-u", "-l", "1460", "-b", "10g")
+               cmd := exec.Command("iperf3", "-c", ipAddress, "-u", "-l", "1460", "-b", "10g", "-p", s.getPortFromPid())
                if env != nil {
                        cmd.Env = env
                }
@@ -413,7 +458,7 @@ func (s *HstSuite) startClientApp(ipAddress string, env []string, clnCh chan err
 }
 
 func (s *HstSuite) startHttpServer(running chan struct{}, done chan struct{}, addressPort, netNs string) {
-       cmd := newCommand([]string{"./http_server", addressPort}, netNs)
+       cmd := newCommand([]string{"./http_server", addressPort, s.pid}, netNs)
        err := cmd.Start()
        s.log(cmd)
        if err != nil {
index 068d042..943c8a5 100644 (file)
@@ -7,11 +7,11 @@ import (
 )
 
 func (s *NsSuite) TestHttpTps() {
-       iface := s.netInterfaces[clientInterface]
+       iface := s.getInterfaceByName(clientInterface)
        client_ip := iface.ip4AddressString()
        port := "8080"
        finished := make(chan error, 1)
-       clientNetns := "cln"
+       clientNetns := s.getNetNamespaceByName("cln")
 
        container := s.getContainerByName("vpp")
 
@@ -28,7 +28,7 @@ func (s *VethsSuite) TestHttpCli() {
        serverContainer := s.getContainerByName("server-vpp")
        clientContainer := s.getContainerByName("client-vpp")
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
 
        serverContainer.vppInstance.vppctl("http cli server")
 
@@ -50,7 +50,7 @@ func (s *NoTopoSuite) TestNginxHttp3() {
 
        vpp := s.getContainerByName("vpp").vppInstance
        vpp.waitForApp("nginx-", 5)
-       serverAddress := s.netInterfaces[tapInterfaceName].peer.ip4AddressString()
+       serverAddress := s.getInterfaceByName(tapInterfaceName).peer.ip4AddressString()
 
        defer func() { os.Remove(query) }()
        curlCont := s.getContainerByName("curl")
@@ -65,7 +65,7 @@ func (s *NoTopoSuite) TestHttpStaticProm() {
        finished := make(chan error, 1)
        query := "stats.prom"
        vpp := s.getContainerByName("vpp").vppInstance
-       serverAddress := s.netInterfaces[tapInterfaceName].peer.ip4AddressString()
+       serverAddress := s.getInterfaceByName(tapInterfaceName).peer.ip4AddressString()
        s.log(vpp.vppctl("http static server uri tcp://" + serverAddress + "/80 url-handlers"))
        s.log(vpp.vppctl("prom enable"))
        go s.startWget(finished, serverAddress, "80", query, "")
@@ -83,7 +83,7 @@ func (s *NoTopoSuite) TestNginxAsServer() {
        vpp := s.getContainerByName("vpp").vppInstance
        vpp.waitForApp("nginx-", 5)
 
-       serverAddress := s.netInterfaces[tapInterfaceName].peer.ip4AddressString()
+       serverAddress := s.getInterfaceByName(tapInterfaceName).peer.ip4AddressString()
 
        defer func() { os.Remove(query) }()
        go s.startWget(finished, serverAddress, "80", query, "")
@@ -104,7 +104,7 @@ func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
        nRequests := 1000000
        nClients := 1000
 
-       serverAddress := s.netInterfaces[tapInterfaceName].peer.ip4AddressString()
+       serverAddress := s.getInterfaceByName(tapInterfaceName).peer.ip4AddressString()
 
        vpp := s.getContainerByName("vpp").vppInstance
 
index 1ccf859..8d9168d 100644 (file)
@@ -62,7 +62,7 @@ func (s *VethsSuite) TestLDPreloadIperfVpp() {
        s.log("attaching client to vpp")
        var clnRes = make(chan string, 1)
        clnEnv := append(os.Environ(), ldpreload, "VCL_CONFIG="+clientVclFileName)
-       serverVethAddress := s.netInterfaces[serverInterfaceName].ip4AddressString()
+       serverVethAddress := s.getInterfaceByName(serverInterfaceName).ip4AddressString()
        go s.startClientApp(serverVethAddress, clnEnv, clnCh, clnRes)
        s.log(<-clnRes)
 
index 47ebd03..06247e4 100644 (file)
@@ -14,7 +14,7 @@ func (s *TapSuite) TestLinuxIperf() {
        s.assertNil(err, err)
        s.log("server running")
 
-       ipAddress := s.netInterfaces[tapInterfaceName].ip4AddressString()
+       ipAddress := s.getInterfaceByName(tapInterfaceName).ip4AddressString()
        go s.startClientApp(ipAddress, nil, clnCh, clnRes)
        s.log("client running")
        s.log(<-clnRes)
index 03e9c03..91f43f4 100644 (file)
@@ -5,7 +5,7 @@ import (
 )
 
 func (s *NginxSuite) TestMirroring() {
-       proxyAddress := s.netInterfaces[mirroringClientInterfaceName].peer.ip4AddressString()
+       proxyAddress := s.getInterfaceByName(mirroringClientInterfaceName).peer.ip4AddressString()
 
        path := "/64B.json"
 
index 748e48b..c2f9b6f 100644 (file)
@@ -8,18 +8,19 @@ import (
 )
 
 func testProxyHttpTcp(s *NsSuite, proto string) error {
-       const outputFile = "test.data"
-       const srcFile = "httpTestFile"
-       const fileSize = "10M"
+       var outputFile string = "test" + s.pid + ".data"
+       var srcFilePid string = "httpTestFile" + s.pid
+       const srcFileNoPid = "httpTestFile"
+       const fileSize string = "10M"
        stopServer := make(chan struct{}, 1)
        serverRunning := make(chan struct{}, 1)
-       serverNetns := "srv"
-       clientNetns := "cln"
+       serverNetns := s.getNetNamespaceByName("srv")
+       clientNetns := s.getNetNamespaceByName("cln")
 
        // create test file
-       err := exechelper.Run(fmt.Sprintf("ip netns exec %s truncate -s %s %s", serverNetns, fileSize, srcFile))
+       err := exechelper.Run(fmt.Sprintf("ip netns exec %s truncate -s %s %s", serverNetns, fileSize, srcFilePid))
        s.assertNil(err, "failed to run truncate command: " + fmt.Sprint(err))
-       defer func() { os.Remove(srcFile) }()
+       defer func() { os.Remove(srcFilePid) }()
 
        s.log("test file created...")
 
@@ -33,13 +34,13 @@ func testProxyHttpTcp(s *NsSuite, proto string) error {
 
        s.log("http server started...")
 
-       clientVeth := s.netInterfaces[clientInterface]
+       clientVeth := s.getInterfaceByName(clientInterface)
        c := fmt.Sprintf("ip netns exec %s wget --no-proxy --retry-connrefused"+
                " --retry-on-http-error=503 --tries=10 -O %s ", clientNetns, outputFile)
        if proto == "tls" {
                c += " --secure-protocol=TLSv1_3 --no-check-certificate https://"
        }
-       c += fmt.Sprintf("%s:555/%s", clientVeth.ip4AddressString(), srcFile)
+       c += fmt.Sprintf("%s:555/%s", clientVeth.ip4AddressString(), srcFileNoPid)
        s.log(c)
        _, err = exechelper.CombinedOutput(c)
 
@@ -48,13 +49,13 @@ func testProxyHttpTcp(s *NsSuite, proto string) error {
        s.assertNil(err, "failed to run wget: '%s', cmd: %s", err, c)
        stopServer <- struct{}{}
 
-       s.assertNil(assertFileSize(outputFile, srcFile))
+       s.assertNil(assertFileSize(outputFile, srcFilePid))
        return nil
 }
 
 func configureVppProxy(s *NsSuite, proto string) {
-       serverVeth := s.netInterfaces[serverInterface]
-       clientVeth := s.netInterfaces[clientInterface]
+       serverVeth := s.getInterfaceByName(serverInterface)
+       clientVeth := s.getInterfaceByName(clientInterface)
 
        testVppProxy := s.getContainerByName("vpp").vppInstance
        output := testVppProxy.vppctl(
@@ -85,7 +86,7 @@ func configureEnvoyProxy(s *NsSuite) {
        err := envoyContainer.create()
        s.assertNil(err, "Error creating envoy container: %s", err)
 
-       serverVeth := s.netInterfaces[serverInterface]
+       serverVeth := s.getInterfaceByName(serverInterface)
        address := struct {
                Server string
        }{
index 386f9bc..670ed58 100644 (file)
@@ -14,7 +14,7 @@ func (s *VethsSuite) TestVppEchoTcp() {
 }
 
 func (s *VethsSuite) testVppEcho(proto string) {
-       serverVethAddress := s.netInterfaces[serverInterfaceName].ip4AddressString()
+       serverVethAddress := s.getInterfaceByName(serverInterfaceName).ip4AddressString()
        uri := proto + "://" + serverVethAddress + "/12344"
 
        echoSrvContainer := s.getContainerByName("server-app")
index 94fd010..8f40590 100644 (file)
@@ -1,12 +1,12 @@
 package main
 
+// These correspond to names used in yaml config
 const (
-       // These correspond to names used in yaml config
-       mirroringClientInterfaceName = "hstcln"
-       mirroringServerInterfaceName = "hstsrv"
        vppProxyContainerName            = "vpp-proxy"
        nginxProxyContainerName          = "nginx-proxy"
        nginxServerContainerName         = "nginx-server"
+       mirroringClientInterfaceName = "hstcln"
+       mirroringServerInterfaceName = "hstsrv"
 )
 
 type NginxSuite struct {
@@ -35,10 +35,10 @@ func (s *NginxSuite) SetupTest() {
        proxyVpp, _ := vppProxyContainer.newVppInstance(cpus, sessionConfig)
        s.assertNil(proxyVpp.start())
 
-       clientInterface := s.netInterfaces[mirroringClientInterfaceName]
+       clientInterface := s.getInterfaceByName(mirroringClientInterfaceName)
        s.assertNil(proxyVpp.createTap(clientInterface, 1))
 
-       serverInterface := s.netInterfaces[mirroringServerInterfaceName]
+       serverInterface := s.getInterfaceByName(mirroringServerInterfaceName)
        s.assertNil(proxyVpp.createTap(serverInterface, 2))
 
        nginxContainer := s.getTransientContainerByName(nginxProxyContainerName)
index 97e5ca4..bbf0cfd 100644 (file)
@@ -1,9 +1,9 @@
 package main
 
 const (
-       singleTopoContainerVpp = "vpp"
-       singleTopoContainerNginx = "nginx"
-       tapInterfaceName = "htaphost"
+       singleTopoContainerVpp          = "vpp"
+       singleTopoContainerNginx        = "nginx"
+       tapInterfaceName                        = "htaphost"
 )
 
 type NoTopoSuite struct {
@@ -31,7 +31,7 @@ func (s *NoTopoSuite) SetupTest() {
        vpp, _ := container.newVppInstance(cpus, sessionConfig)
        s.assertNil(vpp.start())
 
-       tapInterface := s.netInterfaces[tapInterfaceName]
+       tapInterface := s.getInterfaceByName(tapInterfaceName)
 
        s.assertNil(vpp.createTap(tapInterface), "failed to create tap interface")
 }
index b32fec7..46d5bef 100644 (file)
@@ -1,7 +1,7 @@
 package main
 
+// These correspond to names used in yaml config
 const (
-       // These correspond to names used in yaml config
        clientInterface = "hclnvpp"
        serverInterface = "hsrvvpp"
 )
@@ -33,11 +33,11 @@ func (s *NsSuite) SetupTest() {
        vpp, _ := container.newVppInstance(cpus, sessionConfig)
        s.assertNil(vpp.start())
 
-       idx, err := vpp.createAfPacket(s.netInterfaces[serverInterface])
+       idx, err := vpp.createAfPacket(s.getInterfaceByName(serverInterface))
        s.assertNil(err, err)
        s.assertNotEqual(0, idx)
 
-       idx, err = vpp.createAfPacket(s.netInterfaces[clientInterface])
+       idx, err = vpp.createAfPacket(s.getInterfaceByName(clientInterface))
        s.assertNil(err, err)
        s.assertNotEqual(0, idx)
 
index 4158c76..061eee0 100644 (file)
@@ -4,8 +4,8 @@ import (
        "time"
 )
 
+// These correspond to names used in yaml config
 const (
-       // These correspond to names used in yaml config
        serverInterfaceName = "srv"
        clientInterfaceName = "cln"
 )
@@ -25,7 +25,6 @@ func (s *VethsSuite) SetupTest() {
        s.HstSuite.SetupTest()
 
        // Setup test conditions
-
        var sessionConfig Stanza
        sessionConfig.
                newStanza("session").
@@ -55,7 +54,7 @@ func (s *VethsSuite) setupServerVpp() {
        serverVpp := s.getContainerByName("server-vpp").vppInstance
        s.assertNil(serverVpp.start())
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        idx, err := serverVpp.createAfPacket(serverVeth)
        s.assertNil(err, err)
        s.assertNotEqual(0, idx)
@@ -65,7 +64,7 @@ func (s *VethsSuite) setupClientVpp() {
        clientVpp := s.getContainerByName("client-vpp").vppInstance
        s.assertNil(clientVpp.start())
 
-       clientVeth := s.netInterfaces[clientInterfaceName]
+       clientVeth := s.getInterfaceByName(clientInterfaceName)
        idx, err := clientVpp.createAfPacket(clientVeth)
        s.assertNil(err, err)
        s.assertNotEqual(0, idx)
index 8edbb14..d2ab385 100644 (file)
@@ -8,13 +8,13 @@ import (
 )
 
 func main() {
-       if len(os.Args) < 2 {
+       if len(os.Args) < 3 {
                fmt.Println("arg expected")
                os.Exit(1)
        }
 
        http.HandleFunc("/httpTestFile", func(w http.ResponseWriter, r *http.Request) {
-               file, _ := os.Open("httpTestFile")
+               file, _ := os.Open("httpTestFile" + os.Args[2])
                defer file.Close()
                io.Copy(w, file)
        })
index 281b916..cb6aaa4 100644 (file)
@@ -35,7 +35,7 @@ func (s *VethsSuite) testXEchoVclClient(proto string) {
        port := "12345"
        serverVpp := s.getContainerByName("server-vpp").vppInstance
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        serverVpp.vppctl("test echo server uri %s://%s/%s fifo-size 64k", proto, serverVeth.ip4AddressString(), port)
 
        echoClnContainer := s.getTransientContainerByName("client-app")
@@ -67,7 +67,7 @@ func (s *VethsSuite) testXEchoVclServer(proto string) {
        vclSrvCmd := fmt.Sprintf("vcl_test_server -p %s %s", proto, port)
        srvAppCont.execServer(vclSrvCmd)
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        serverVethAddress := serverVeth.ip4AddressString()
 
        clientVpp := s.getContainerByName("client-vpp").vppInstance
@@ -85,7 +85,7 @@ func (s *VethsSuite) testVclEcho(proto string) {
        srvAppCont.addEnvVar("VCL_CONFIG", "/vcl.conf")
        srvAppCont.execServer("vcl_test_server " + port)
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        serverVethAddress := serverVeth.ip4AddressString()
 
        echoClnContainer := s.getTransientContainerByName("client-app")
@@ -123,7 +123,7 @@ func (s *VethsSuite) testRetryAttach(proto string) {
        s.log("This whole test case can take around 3 minutes to run. Please be patient.")
        s.log("... Running first echo client test, before disconnect.")
 
-       serverVeth := s.netInterfaces[serverInterfaceName]
+       serverVeth := s.getInterfaceByName(serverInterfaceName)
        serverVethAddress := serverVeth.ip4AddressString()
 
        echoClnContainer := s.getTransientContainerByName("client-app")