hs-test: experimental support for multiple test instances

- 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 <avillin@cisco.com>
This commit is contained in:
adrianvillin
2024-02-13 06:00:02 -05:00
committed by Florin Coras
parent 7a2961523e
commit 28bd8f07d3
16 changed files with 164 additions and 63 deletions

View 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)

View 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
}

View 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",

View 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 {

View 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

View 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)

View 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)

View 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"

View 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
}{

View 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")

View 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)

View 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")
}

View 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)

View 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)

View 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)
})

View 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")