hs-test: added a redis-benchmark test
- basically a copy of LdpIperf test - small update of LdpIperf test - new LDP suite Type: test Change-Id: I3f8653288c6fc6dfd6a061315e983c000974d3ff Signed-off-by: Adrian Villin <avillin@cisco.com>
This commit is contained in:

committed by
Florin Coras

parent
a647a83496
commit
d01a63abd4
@ -5,7 +5,7 @@ FROM ubuntu:${UBUNTU_VERSION}
|
|||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y openssl libapr1 libnuma1 libsubunit0 \
|
&& apt-get install -y openssl libapr1 libnuma1 libsubunit0 \
|
||||||
iproute2 libnl-3-dev libnl-route-3-dev python3 iputils-ping \
|
iproute2 libnl-3-dev libnl-route-3-dev python3 iputils-ping \
|
||||||
vim gdb libunwind-dev \
|
vim gdb libunwind-dev redis redis-tools iperf3 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
ENV DIR=vpp-data/lib/vpp_plugins
|
ENV DIR=vpp-data/lib/vpp_plugins
|
||||||
|
@ -2,7 +2,6 @@ package hst
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/edwarnicke/exechelper"
|
"github.com/edwarnicke/exechelper"
|
||||||
@ -607,84 +606,6 @@ func (s *HstSuite) GetPortFromPpid() string {
|
|||||||
return port[len(port)-3:] + s.ProcessIndex
|
return port[len(port)-3:] + s.ProcessIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *HstSuite) StartServerApp(running chan error, done chan struct{}, env []string) {
|
|
||||||
cmd := exec.Command("iperf3", "-4", "-s", "-p", s.GetPortFromPpid())
|
|
||||||
if env != nil {
|
|
||||||
cmd.Env = env
|
|
||||||
}
|
|
||||||
s.Log(cmd)
|
|
||||||
err := cmd.Start()
|
|
||||||
if err != nil {
|
|
||||||
msg := fmt.Errorf("failed to start iperf server: %v", err)
|
|
||||||
running <- msg
|
|
||||||
return
|
|
||||||
}
|
|
||||||
running <- nil
|
|
||||||
<-done
|
|
||||||
cmd.Process.Kill()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *HstSuite) StartClientApp(ipAddress string, env []string, clnCh chan error, clnRes chan string) {
|
|
||||||
defer func() {
|
|
||||||
clnCh <- nil
|
|
||||||
}()
|
|
||||||
|
|
||||||
nTries := 0
|
|
||||||
|
|
||||||
for {
|
|
||||||
cmd := exec.Command("iperf3", "-c", ipAddress, "-u", "-l", "1460", "-b", "10g", "-p", s.GetPortFromPpid())
|
|
||||||
if env != nil {
|
|
||||||
cmd.Env = env
|
|
||||||
}
|
|
||||||
s.Log(cmd)
|
|
||||||
o, err := cmd.CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
if nTries > 5 {
|
|
||||||
clnCh <- fmt.Errorf("failed to start client app '%s'.\n%s", err, o)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
nTries++
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
clnRes <- fmt.Sprintf("Client output: %s", o)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *HstSuite) StartHttpServer(running chan struct{}, done chan struct{}, addressPort, netNs string) {
|
|
||||||
cmd := newCommand([]string{"./http_server", addressPort, s.Ppid, s.ProcessIndex}, netNs)
|
|
||||||
err := cmd.Start()
|
|
||||||
s.Log(cmd)
|
|
||||||
if err != nil {
|
|
||||||
s.Log("Failed to start http server: " + fmt.Sprint(err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
running <- struct{}{}
|
|
||||||
<-done
|
|
||||||
cmd.Process.Kill()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *HstSuite) StartWget(finished chan error, server_ip, port, query, netNs string) {
|
|
||||||
defer func() {
|
|
||||||
finished <- errors.New("wget error")
|
|
||||||
}()
|
|
||||||
|
|
||||||
cmd := newCommand([]string{"wget", "--timeout=10", "--no-proxy", "--tries=5", "-O", "/dev/null", server_ip + ":" + port + "/" + query},
|
|
||||||
netNs)
|
|
||||||
s.Log(cmd)
|
|
||||||
o, err := cmd.CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
finished <- fmt.Errorf("wget error: '%v\n\n%s'", err, o)
|
|
||||||
return
|
|
||||||
} else if !strings.Contains(string(o), "200 OK") {
|
|
||||||
finished <- fmt.Errorf("wget error: response not 200 OK")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
finished <- nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RunBenchmark creates Gomega's experiment with the passed-in name and samples the passed-in callback repeatedly (samplesNum times),
|
RunBenchmark creates Gomega's experiment with the passed-in name and samples the passed-in callback repeatedly (samplesNum times),
|
||||||
passing in suite context, experiment and your data.
|
passing in suite context, experiment and your data.
|
||||||
|
203
extras/hs-test/infra/suite_ldp.go
Normal file
203
extras/hs-test/infra/suite_ldp.go
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
package hst
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// These correspond to names used in yaml config
|
||||||
|
const (
|
||||||
|
ServerLdpInterfaceName = "srv"
|
||||||
|
ClientLdpInterfaceName = "cln"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ldpTests = map[string][]func(s *LdpSuite){}
|
||||||
|
var ldpSoloTests = map[string][]func(s *LdpSuite){}
|
||||||
|
|
||||||
|
type LdpSuite struct {
|
||||||
|
HstSuite
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterLdpTests(tests ...func(s *LdpSuite)) {
|
||||||
|
ldpTests[getTestFilename()] = tests
|
||||||
|
}
|
||||||
|
func RegisterSoloLdpTests(tests ...func(s *LdpSuite)) {
|
||||||
|
ldpSoloTests[getTestFilename()] = tests
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *LdpSuite) SetupSuite() {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
s.HstSuite.SetupSuite()
|
||||||
|
s.ConfigureNetworkTopology("2peerVeth")
|
||||||
|
s.LoadContainerTopology("2peerVethLdp")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *LdpSuite) SetupTest() {
|
||||||
|
s.HstSuite.SetupTest()
|
||||||
|
|
||||||
|
// Setup test conditions
|
||||||
|
var sessionConfig Stanza
|
||||||
|
sessionConfig.
|
||||||
|
NewStanza("session").
|
||||||
|
Append("enable").
|
||||||
|
Append("use-app-socket-api")
|
||||||
|
|
||||||
|
if strings.Contains(CurrentSpecReport().LeafNodeText, "InterruptMode") {
|
||||||
|
sessionConfig.Append("use-private-rx-mqs").Close()
|
||||||
|
s.Log("**********************INTERRUPT MODE**********************")
|
||||||
|
} else {
|
||||||
|
sessionConfig.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... For server
|
||||||
|
serverContainer := s.GetContainerByName("server-vpp")
|
||||||
|
|
||||||
|
serverVpp, err := serverContainer.newVppInstance(serverContainer.AllocatedCpus, sessionConfig)
|
||||||
|
s.AssertNotNil(serverVpp, fmt.Sprint(err))
|
||||||
|
|
||||||
|
s.SetupServerVpp()
|
||||||
|
|
||||||
|
// ... For client
|
||||||
|
clientContainer := s.GetContainerByName("client-vpp")
|
||||||
|
|
||||||
|
clientVpp, err := clientContainer.newVppInstance(clientContainer.AllocatedCpus, sessionConfig)
|
||||||
|
s.AssertNotNil(clientVpp, fmt.Sprint(err))
|
||||||
|
|
||||||
|
s.setupClientVpp()
|
||||||
|
|
||||||
|
serverContainer.AddEnvVar("VCL_CONFIG", serverContainer.GetContainerWorkDir()+"/vcl_srv.conf")
|
||||||
|
clientContainer.AddEnvVar("VCL_CONFIG", clientContainer.GetContainerWorkDir()+"/vcl_cln.conf")
|
||||||
|
|
||||||
|
for _, container := range s.StartedContainers {
|
||||||
|
container.AddEnvVar("LD_PRELOAD", "/usr/lib/libvcl_ldpreload.so")
|
||||||
|
container.AddEnvVar("LDP_DEBUG", "0")
|
||||||
|
container.AddEnvVar("VCL_DEBUG", "0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *LdpSuite) TearDownTest() {
|
||||||
|
for _, container := range s.StartedContainers {
|
||||||
|
delete(container.EnvVars, "LD_PRELOAD")
|
||||||
|
delete(container.EnvVars, "VCL_CONFIG")
|
||||||
|
}
|
||||||
|
s.HstSuite.TearDownTest()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *LdpSuite) SetupServerVpp() {
|
||||||
|
var srvVclConf Stanza
|
||||||
|
serverContainer := s.GetContainerByName("server-vpp")
|
||||||
|
serverVclFileName := serverContainer.GetHostWorkDir() + "/vcl_srv.conf"
|
||||||
|
serverVpp := serverContainer.VppInstance
|
||||||
|
s.AssertNil(serverVpp.Start())
|
||||||
|
|
||||||
|
serverVeth := s.GetInterfaceByName(ServerInterfaceName)
|
||||||
|
idx, err := serverVpp.createAfPacket(serverVeth)
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
s.AssertNotEqual(0, idx)
|
||||||
|
|
||||||
|
serverAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
|
||||||
|
serverContainer.GetContainerWorkDir())
|
||||||
|
err = srvVclConf.
|
||||||
|
NewStanza("vcl").
|
||||||
|
Append("rx-fifo-size 4000000").
|
||||||
|
Append("tx-fifo-size 4000000").
|
||||||
|
Append("app-scope-local").
|
||||||
|
Append("app-scope-global").
|
||||||
|
Append("use-mq-eventfd").
|
||||||
|
Append(serverAppSocketApi).Close().
|
||||||
|
SaveToFile(serverVclFileName)
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *LdpSuite) setupClientVpp() {
|
||||||
|
var clnVclConf Stanza
|
||||||
|
clientContainer := s.GetContainerByName("client-vpp")
|
||||||
|
clientVclFileName := clientContainer.GetHostWorkDir() + "/vcl_cln.conf"
|
||||||
|
clientVpp := clientContainer.VppInstance
|
||||||
|
s.AssertNil(clientVpp.Start())
|
||||||
|
|
||||||
|
clientVeth := s.GetInterfaceByName(ClientInterfaceName)
|
||||||
|
idx, err := clientVpp.createAfPacket(clientVeth)
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
s.AssertNotEqual(0, idx)
|
||||||
|
|
||||||
|
clientAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
|
||||||
|
clientContainer.GetContainerWorkDir())
|
||||||
|
err = clnVclConf.
|
||||||
|
NewStanza("vcl").
|
||||||
|
Append("rx-fifo-size 4000000").
|
||||||
|
Append("tx-fifo-size 4000000").
|
||||||
|
Append("app-scope-local").
|
||||||
|
Append("app-scope-global").
|
||||||
|
Append("use-mq-eventfd").
|
||||||
|
Append(clientAppSocketApi).Close().
|
||||||
|
SaveToFile(clientVclFileName)
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = Describe("LdpSuite", Ordered, ContinueOnFailure, func() {
|
||||||
|
var s LdpSuite
|
||||||
|
BeforeAll(func() {
|
||||||
|
s.SetupSuite()
|
||||||
|
})
|
||||||
|
BeforeEach(func() {
|
||||||
|
s.SetupTest()
|
||||||
|
})
|
||||||
|
AfterAll(func() {
|
||||||
|
s.TearDownSuite()
|
||||||
|
|
||||||
|
})
|
||||||
|
AfterEach(func() {
|
||||||
|
s.TearDownTest()
|
||||||
|
})
|
||||||
|
|
||||||
|
// https://onsi.github.io/ginkgo/#dynamically-generating-specs
|
||||||
|
for filename, tests := range ldpTests {
|
||||||
|
for _, test := range tests {
|
||||||
|
test := test
|
||||||
|
pc := reflect.ValueOf(test).Pointer()
|
||||||
|
funcValue := runtime.FuncForPC(pc)
|
||||||
|
testName := filename + "/" + strings.Split(funcValue.Name(), ".")[2]
|
||||||
|
It(testName, func(ctx SpecContext) {
|
||||||
|
s.Log(testName + ": BEGIN")
|
||||||
|
test(&s)
|
||||||
|
}, SpecTimeout(SuiteTimeout))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
var _ = Describe("LdpSuiteSolo", Ordered, ContinueOnFailure, Serial, func() {
|
||||||
|
var s LdpSuite
|
||||||
|
BeforeAll(func() {
|
||||||
|
s.SetupSuite()
|
||||||
|
})
|
||||||
|
BeforeEach(func() {
|
||||||
|
s.SetupTest()
|
||||||
|
})
|
||||||
|
AfterAll(func() {
|
||||||
|
s.TearDownSuite()
|
||||||
|
})
|
||||||
|
AfterEach(func() {
|
||||||
|
s.TearDownTest()
|
||||||
|
})
|
||||||
|
|
||||||
|
// https://onsi.github.io/ginkgo/#dynamically-generating-specs
|
||||||
|
for filename, tests := range ldpSoloTests {
|
||||||
|
for _, test := range tests {
|
||||||
|
test := test
|
||||||
|
pc := reflect.ValueOf(test).Pointer()
|
||||||
|
funcValue := runtime.FuncForPC(pc)
|
||||||
|
testName := filename + "/" + strings.Split(funcValue.Name(), ".")[2]
|
||||||
|
It(testName, Label("SOLO"), func(ctx SpecContext) {
|
||||||
|
s.Log(testName + ": BEGIN")
|
||||||
|
test(&s)
|
||||||
|
}, SpecTimeout(SuiteTimeout))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
@ -1,6 +1,7 @@
|
|||||||
package hst
|
package hst
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
@ -183,3 +184,133 @@ func (s *HstSuite) CollectEnvoyLogs(containerName string) {
|
|||||||
s.Log(fmt.Sprint(err))
|
s.Log(fmt.Sprint(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *HstSuite) StartIperfServerApp(running chan error, done chan struct{}, env []string) {
|
||||||
|
cmd := exec.Command("iperf3", "-4", "-s", "-p", s.GetPortFromPpid())
|
||||||
|
if env != nil {
|
||||||
|
cmd.Env = env
|
||||||
|
}
|
||||||
|
s.Log(cmd)
|
||||||
|
err := cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
msg := fmt.Errorf("failed to start iperf server: %v", err)
|
||||||
|
running <- msg
|
||||||
|
return
|
||||||
|
}
|
||||||
|
running <- nil
|
||||||
|
<-done
|
||||||
|
cmd.Process.Kill()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HstSuite) StartIperfClientApp(ipAddress string, env []string, clnCh chan error, clnRes chan string) {
|
||||||
|
defer func() {
|
||||||
|
clnCh <- nil
|
||||||
|
}()
|
||||||
|
|
||||||
|
nTries := 0
|
||||||
|
|
||||||
|
for {
|
||||||
|
cmd := exec.Command("iperf3", "-c", ipAddress, "-u", "-l", "1460", "-b", "10g", "-p", s.GetPortFromPpid())
|
||||||
|
if env != nil {
|
||||||
|
cmd.Env = env
|
||||||
|
}
|
||||||
|
s.Log(cmd)
|
||||||
|
o, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
if nTries > 5 {
|
||||||
|
clnRes <- ""
|
||||||
|
clnCh <- fmt.Errorf("failed to start client app '%s'.\n%s", err, o)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
nTries++
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
clnRes <- fmt.Sprintf("Client output: %s", o)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HstSuite) StartHttpServer(running chan struct{}, done chan struct{}, addressPort, netNs string) {
|
||||||
|
cmd := newCommand([]string{"./http_server", addressPort, s.Ppid, s.ProcessIndex}, netNs)
|
||||||
|
err := cmd.Start()
|
||||||
|
s.Log(cmd)
|
||||||
|
if err != nil {
|
||||||
|
s.Log("Failed to start http server: " + fmt.Sprint(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
running <- struct{}{}
|
||||||
|
<-done
|
||||||
|
cmd.Process.Kill()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HstSuite) StartWget(finished chan error, server_ip, port, query, netNs string) {
|
||||||
|
defer func() {
|
||||||
|
finished <- errors.New("wget error")
|
||||||
|
}()
|
||||||
|
|
||||||
|
cmd := newCommand([]string{"wget", "--timeout=10", "--no-proxy", "--tries=5", "-O", "/dev/null", server_ip + ":" + port + "/" + query},
|
||||||
|
netNs)
|
||||||
|
s.Log(cmd)
|
||||||
|
o, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
finished <- fmt.Errorf("wget error: '%v\n\n%s'", err, o)
|
||||||
|
return
|
||||||
|
} else if !strings.Contains(string(o), "200 OK") {
|
||||||
|
finished <- fmt.Errorf("wget error: response not 200 OK")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
finished <- nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start a server app. 'processName' is used to check whether the app started correctly.
|
||||||
|
func (s *HstSuite) StartServerApp(c *Container, processName string, cmd string,
|
||||||
|
running chan error, done chan struct{}) {
|
||||||
|
|
||||||
|
s.Log("starting server")
|
||||||
|
c.ExecServer(cmd)
|
||||||
|
cmd2 := exec.Command("docker", "exec", c.Name, "pidof", processName)
|
||||||
|
err := cmd2.Run()
|
||||||
|
if err != nil {
|
||||||
|
msg := fmt.Errorf("failed to start server app: %v", err)
|
||||||
|
running <- msg
|
||||||
|
<-done
|
||||||
|
return
|
||||||
|
}
|
||||||
|
running <- nil
|
||||||
|
<-done
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HstSuite) StartClientApp(c *Container, cmd string,
|
||||||
|
clnCh chan error, clnRes chan string) {
|
||||||
|
defer func() {
|
||||||
|
close(clnCh)
|
||||||
|
close(clnRes)
|
||||||
|
}()
|
||||||
|
|
||||||
|
s.Log("starting client app, please wait")
|
||||||
|
|
||||||
|
nTries := 0
|
||||||
|
for {
|
||||||
|
// exec.Cmd can only be used once, which is why it's in the loop
|
||||||
|
cmd2 := exec.Command("/bin/sh", "-c", "docker exec "+c.getEnvVarsAsCliOption()+" "+
|
||||||
|
c.Name+" "+cmd)
|
||||||
|
s.Log(cmd2)
|
||||||
|
o, err := cmd2.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
s.Log(err)
|
||||||
|
if nTries > 5 {
|
||||||
|
clnRes <- ""
|
||||||
|
clnCh <- fmt.Errorf("failed to start client app '%s'", err)
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
nTries++
|
||||||
|
} else {
|
||||||
|
clnRes <- fmt.Sprintf("Client output: %s", o)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2,86 +2,42 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
|
|
||||||
. "fd.io/hs-test/infra"
|
. "fd.io/hs-test/infra"
|
||||||
. "github.com/onsi/ginkgo/v2"
|
. "github.com/onsi/ginkgo/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterVethTests(LDPreloadIperfVppTest, LDPreloadIperfVppInterruptModeTest)
|
RegisterLdpTests(LDPreloadIperfVppTest, LDPreloadIperfVppInterruptModeTest, RedisBenchmarkTest)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LDPreloadIperfVppInterruptModeTest(s *VethsSuite) {
|
func LDPreloadIperfVppInterruptModeTest(s *LdpSuite) {
|
||||||
LDPreloadIperfVppTest(s)
|
LDPreloadIperfVppTest(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LDPreloadIperfVppTest(s *VethsSuite) {
|
func LDPreloadIperfVppTest(s *LdpSuite) {
|
||||||
var clnVclConf, srvVclConf Stanza
|
|
||||||
var ldpreload string
|
|
||||||
|
|
||||||
serverContainer := s.GetContainerByName("server-vpp")
|
|
||||||
serverVclFileName := serverContainer.GetHostWorkDir() + "/vcl_srv.conf"
|
|
||||||
|
|
||||||
clientContainer := s.GetContainerByName("client-vpp")
|
clientContainer := s.GetContainerByName("client-vpp")
|
||||||
clientVclFileName := clientContainer.GetHostWorkDir() + "/vcl_cln.conf"
|
serverContainer := s.GetContainerByName("server-vpp")
|
||||||
|
|
||||||
if *IsDebugBuild {
|
|
||||||
ldpreload = "LD_PRELOAD=../../build-root/build-vpp_debug-native/vpp/lib/x86_64-linux-gnu/libvcl_ldpreload.so"
|
|
||||||
} else {
|
|
||||||
ldpreload = "LD_PRELOAD=../../build-root/build-vpp-native/vpp/lib/x86_64-linux-gnu/libvcl_ldpreload.so"
|
|
||||||
}
|
|
||||||
|
|
||||||
stopServerCh := make(chan struct{}, 1)
|
stopServerCh := make(chan struct{}, 1)
|
||||||
srvCh := make(chan error, 1)
|
srvCh := make(chan error, 1)
|
||||||
clnCh := make(chan error)
|
clnCh := make(chan error)
|
||||||
|
clnRes := make(chan string, 1)
|
||||||
|
|
||||||
s.Log("starting VPPs")
|
|
||||||
|
|
||||||
clientAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
|
|
||||||
clientContainer.GetHostWorkDir())
|
|
||||||
err := clnVclConf.
|
|
||||||
NewStanza("vcl").
|
|
||||||
Append("rx-fifo-size 4000000").
|
|
||||||
Append("tx-fifo-size 4000000").
|
|
||||||
Append("app-scope-local").
|
|
||||||
Append("app-scope-global").
|
|
||||||
Append("use-mq-eventfd").
|
|
||||||
Append(clientAppSocketApi).Close().
|
|
||||||
SaveToFile(clientVclFileName)
|
|
||||||
s.AssertNil(err, fmt.Sprint(err))
|
|
||||||
|
|
||||||
serverAppSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
|
|
||||||
serverContainer.GetHostWorkDir())
|
|
||||||
err = srvVclConf.
|
|
||||||
NewStanza("vcl").
|
|
||||||
Append("rx-fifo-size 4000000").
|
|
||||||
Append("tx-fifo-size 4000000").
|
|
||||||
Append("app-scope-local").
|
|
||||||
Append("app-scope-global").
|
|
||||||
Append("use-mq-eventfd").
|
|
||||||
Append(serverAppSocketApi).Close().
|
|
||||||
SaveToFile(serverVclFileName)
|
|
||||||
s.AssertNil(err, fmt.Sprint(err))
|
|
||||||
|
|
||||||
s.Log("attaching server to vpp")
|
|
||||||
|
|
||||||
srvEnv := append(os.Environ(), ldpreload, "VCL_CONFIG="+serverVclFileName)
|
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
s.StartServerApp(srvCh, stopServerCh, srvEnv)
|
cmd := "iperf3 -4 -s -p " + s.GetPortFromPpid()
|
||||||
|
s.StartServerApp(serverContainer, "iperf3", cmd, srvCh, stopServerCh)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err = <-srvCh
|
err := <-srvCh
|
||||||
s.AssertNil(err, fmt.Sprint(err))
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
|
||||||
s.Log("attaching client to vpp")
|
|
||||||
var clnRes = make(chan string, 1)
|
|
||||||
clnEnv := append(os.Environ(), ldpreload, "VCL_CONFIG="+clientVclFileName)
|
|
||||||
serverVethAddress := s.GetInterfaceByName(ServerInterfaceName).Ip4AddressString()
|
serverVethAddress := s.GetInterfaceByName(ServerInterfaceName).Ip4AddressString()
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
s.StartClientApp(serverVethAddress, clnEnv, clnCh, clnRes)
|
cmd := "iperf3 -c " + serverVethAddress + " -u -l 1460 -b 10g -p " + s.GetPortFromPpid()
|
||||||
|
s.StartClientApp(clientContainer, cmd, clnCh, clnRes)
|
||||||
}()
|
}()
|
||||||
s.Log(<-clnRes)
|
s.Log(<-clnRes)
|
||||||
|
|
||||||
@ -92,3 +48,43 @@ func LDPreloadIperfVppTest(s *VethsSuite) {
|
|||||||
// stop server
|
// stop server
|
||||||
stopServerCh <- struct{}{}
|
stopServerCh <- struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RedisBenchmarkTest(s *LdpSuite) {
|
||||||
|
s.SkipIfMultiWorker()
|
||||||
|
|
||||||
|
serverContainer := s.GetContainerByName("server-vpp")
|
||||||
|
clientContainer := s.GetContainerByName("client-vpp")
|
||||||
|
|
||||||
|
serverVethAddress := s.GetInterfaceByName(ServerInterfaceName).Ip4AddressString()
|
||||||
|
runningSrv := make(chan error)
|
||||||
|
doneSrv := make(chan struct{})
|
||||||
|
clnCh := make(chan error)
|
||||||
|
clnRes := make(chan string, 1)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer GinkgoRecover()
|
||||||
|
cmd := "redis-server --daemonize yes --protected-mode no --bind " + serverVethAddress
|
||||||
|
s.StartServerApp(serverContainer, "redis-server", cmd, runningSrv, doneSrv)
|
||||||
|
}()
|
||||||
|
|
||||||
|
err := <-runningSrv
|
||||||
|
s.AssertNil(err)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer GinkgoRecover()
|
||||||
|
var cmd string
|
||||||
|
if *NConfiguredCpus == 1 {
|
||||||
|
cmd = "redis-benchmark --threads 1 -h " + serverVethAddress
|
||||||
|
} else {
|
||||||
|
cmd = "redis-benchmark --threads " + fmt.Sprint(*NConfiguredCpus) + "-h " + serverVethAddress
|
||||||
|
}
|
||||||
|
s.StartClientApp(clientContainer, cmd, clnCh, clnRes)
|
||||||
|
}()
|
||||||
|
|
||||||
|
s.Log(<-clnRes)
|
||||||
|
// wait for client's result
|
||||||
|
err = <-clnCh
|
||||||
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
|
// stop server
|
||||||
|
doneSrv <- struct{}{}
|
||||||
|
}
|
||||||
|
@ -21,7 +21,7 @@ func LinuxIperfTest(s *TapSuite) {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
s.StartServerApp(srvCh, stopServerCh, nil)
|
s.StartIperfServerApp(srvCh, stopServerCh, nil)
|
||||||
}()
|
}()
|
||||||
err := <-srvCh
|
err := <-srvCh
|
||||||
s.AssertNil(err, fmt.Sprint(err))
|
s.AssertNil(err, fmt.Sprint(err))
|
||||||
@ -30,7 +30,7 @@ func LinuxIperfTest(s *TapSuite) {
|
|||||||
ipAddress := s.GetInterfaceByName(TapInterfaceName).Ip4AddressString()
|
ipAddress := s.GetInterfaceByName(TapInterfaceName).Ip4AddressString()
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
s.StartClientApp(ipAddress, nil, clnCh, clnRes)
|
s.StartIperfClientApp(ipAddress, nil, clnCh, clnRes)
|
||||||
}()
|
}()
|
||||||
s.Log("client running")
|
s.Log("client running")
|
||||||
s.Log(<-clnRes)
|
s.Log(<-clnRes)
|
||||||
|
18
extras/hs-test/topo-containers/2peerVethLdp.yaml
Normal file
18
extras/hs-test/topo-containers/2peerVethLdp.yaml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
volumes:
|
||||||
|
- volume: &server-vol
|
||||||
|
host-dir: "$HST_VOLUME_DIR/server-share"
|
||||||
|
container-dir: "/tmp/server-share"
|
||||||
|
is-default-work-dir: true
|
||||||
|
- volume: &client-vol
|
||||||
|
host-dir: "$HST_VOLUME_DIR/client-share"
|
||||||
|
container-dir: "/tmp/client-share"
|
||||||
|
is-default-work-dir: true
|
||||||
|
|
||||||
|
containers:
|
||||||
|
- name: "server-vpp"
|
||||||
|
volumes:
|
||||||
|
- <<: *server-vol
|
||||||
|
- name: "client-vpp"
|
||||||
|
volumes:
|
||||||
|
- <<: *client-vol
|
Reference in New Issue
Block a user