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

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