summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/hs-test/docker/Dockerfile.envoy6
-rw-r--r--extras/hs-test/docker/Dockerfile.nginx3
-rw-r--r--extras/hs-test/infra/hst_suite.go21
-rw-r--r--extras/hs-test/infra/suite_envoy_proxy.go1
-rw-r--r--extras/hs-test/infra/suite_nginx_proxy.go75
-rw-r--r--extras/hs-test/infra/suite_no_topo.go47
-rw-r--r--extras/hs-test/infra/suite_ns.go127
-rw-r--r--extras/hs-test/infra/utils.go1
-rw-r--r--extras/hs-test/nginx_test.go33
-rw-r--r--extras/hs-test/proxy_test.go18
-rw-r--r--extras/hs-test/resources/nginx/nginx.conf2
-rw-r--r--extras/hs-test/resources/nginx/nginx_proxy_mirroring.conf2
-rw-r--r--extras/hs-test/resources/nginx/vcl.conf1
-rwxr-xr-xextras/hs-test/script/build_hst.sh1
-rw-r--r--extras/hs-test/topo-containers/envoyProxy.yaml5
-rw-r--r--extras/hs-test/topo-containers/ns.yaml27
16 files changed, 168 insertions, 202 deletions
diff --git a/extras/hs-test/docker/Dockerfile.envoy b/extras/hs-test/docker/Dockerfile.envoy
new file mode 100644
index 00000000000..cadb9b14a76
--- /dev/null
+++ b/extras/hs-test/docker/Dockerfile.envoy
@@ -0,0 +1,6 @@
+FROM envoyproxy/envoy-contrib:v1.31-latest
+
+RUN chmod go+r /etc/envoy/envoy.yaml
+RUN chown envoy:envoy /dev/stdout /dev/stderr
+
+ENTRYPOINT ["/bin/sh", "-c", "envoy --log-format [%t][%l][%g:%#]%_ --concurrency 2 -c /etc/envoy/envoy.yaml"] \ No newline at end of file
diff --git a/extras/hs-test/docker/Dockerfile.nginx b/extras/hs-test/docker/Dockerfile.nginx
index 386f8e90016..78a75d44a31 100644
--- a/extras/hs-test/docker/Dockerfile.nginx
+++ b/extras/hs-test/docker/Dockerfile.nginx
@@ -7,11 +7,10 @@ RUN apt-get update \
&& rm -rf /var/lib/apt/lists/*
COPY vpp-data/lib/* /usr/lib/
-COPY resources/nginx/vcl.conf /vcl.conf
COPY resources/nginx/nginx.conf /nginx.conf
COPY script/nginx_ldp.sh /usr/bin/nginx_ldp.sh
-ENV VCL_CONFIG=/vcl.conf
+ENV VCL_CONFIG=/tmp/nginx/vcl.conf
ENV LDP=/usr/lib/libvcl_ldpreload.so
ENV LDP_DEBUG=0
ENV VCL_DEBUG=0
diff --git a/extras/hs-test/infra/hst_suite.go b/extras/hs-test/infra/hst_suite.go
index 07c0d935e04..8785fbf63d4 100644
--- a/extras/hs-test/infra/hst_suite.go
+++ b/extras/hs-test/infra/hst_suite.go
@@ -322,20 +322,25 @@ func (s *HstSuite) SkipIfMultiWorker(args ...any) {
}
}
-func (s *HstSuite) SkipIfNotEnoughAvailableCpus() bool {
- var MaxRequestedCpu int
+func (s *HstSuite) SkipIfNotEnoughAvailableCpus() {
+ var maxRequestedCpu int
+ availableCpus := len(s.CpuAllocator.cpus) - 1
+
+ if *UseCpu0 {
+ availableCpus++
+ }
if s.CpuAllocator.runningInCi {
- MaxRequestedCpu = ((s.CpuAllocator.buildNumber + 1) * s.CpuAllocator.maxContainerCount * s.CpuCount)
+ maxRequestedCpu = ((s.CpuAllocator.buildNumber + 1) * s.CpuAllocator.maxContainerCount * s.CpuCount)
} else {
- MaxRequestedCpu = (GinkgoParallelProcess() * s.CpuAllocator.maxContainerCount * s.CpuCount)
+ maxRequestedCpu = (GinkgoParallelProcess() * s.CpuAllocator.maxContainerCount * s.CpuCount)
}
- if len(s.CpuAllocator.cpus)-1 < MaxRequestedCpu {
- s.Skip(fmt.Sprintf("test case cannot allocate requested cpus (%d cpus * %d containers)", s.CpuCount, s.CpuAllocator.maxContainerCount))
+ if availableCpus < maxRequestedCpu {
+ s.Skip(fmt.Sprintf("Test case cannot allocate requested cpus "+
+ "(%d cpus * %d containers, %d available). Try using 'CPU0=true'",
+ s.CpuCount, s.CpuAllocator.maxContainerCount, availableCpus))
}
-
- return true
}
func (s *HstSuite) SkipUnlessLeakCheck() {
diff --git a/extras/hs-test/infra/suite_envoy_proxy.go b/extras/hs-test/infra/suite_envoy_proxy.go
index e34a7d74225..b7f37a9ace7 100644
--- a/extras/hs-test/infra/suite_envoy_proxy.go
+++ b/extras/hs-test/infra/suite_envoy_proxy.go
@@ -96,6 +96,7 @@ func (s *EnvoyProxySuite) SetupTest() {
// Envoy
envoyContainer := s.GetContainerByName(EnvoyProxyContainerName)
s.AssertNil(envoyContainer.Create())
+
s.proxyPort = 8080
envoySettings := struct {
LogPrefix string
diff --git a/extras/hs-test/infra/suite_nginx_proxy.go b/extras/hs-test/infra/suite_nginx_proxy.go
index 75215cfc78d..93a9635f938 100644
--- a/extras/hs-test/infra/suite_nginx_proxy.go
+++ b/extras/hs-test/infra/suite_nginx_proxy.go
@@ -65,26 +65,9 @@ func (s *NginxProxySuite) SetupTest() {
s.AssertNil(vpp.createTap(serverInterface, 2))
// nginx proxy
- nginxProxyContainer := s.GetTransientContainerByName(NginxProxyContainerName)
+ nginxProxyContainer := s.GetContainerByName(NginxProxyContainerName)
s.AssertNil(nginxProxyContainer.Create())
s.proxyPort = 80
- values := struct {
- LogPrefix string
- Proxy string
- Server string
- Port uint16
- }{
- LogPrefix: nginxProxyContainer.Name,
- Proxy: clientInterface.Peer.Ip4AddressString(),
- Server: serverInterface.Ip4AddressString(),
- Port: s.proxyPort,
- }
- nginxProxyContainer.CreateConfig(
- "/nginx.conf",
- "./resources/nginx/nginx_proxy_mirroring.conf",
- values,
- )
- s.AssertNil(nginxProxyContainer.Start())
// nginx HTTP server
nginxServerContainer := s.GetTransientContainerByName(NginxServerContainerName)
@@ -104,8 +87,6 @@ func (s *NginxProxySuite) SetupTest() {
nginxSettings,
)
s.AssertNil(nginxServerContainer.Start())
-
- vpp.WaitForApp("nginx-", 5)
}
func (s *NginxProxySuite) TearDownTest() {
@@ -116,6 +97,35 @@ func (s *NginxProxySuite) TearDownTest() {
s.HstSuite.TearDownTest()
}
+func (s *NginxProxySuite) CreateNginxProxyConfig(container *Container, multiThreadWorkers bool) {
+ clientInterface := s.GetInterfaceByName(MirroringClientInterfaceName)
+ serverInterface := s.GetInterfaceByName(MirroringServerInterfaceName)
+ var workers uint8
+ if multiThreadWorkers {
+ workers = 2
+ } else {
+ workers = 1
+ }
+ values := struct {
+ Workers uint8
+ LogPrefix string
+ Proxy string
+ Server string
+ Port uint16
+ }{
+ Workers: workers,
+ LogPrefix: container.Name,
+ Proxy: clientInterface.Peer.Ip4AddressString(),
+ Server: serverInterface.Ip4AddressString(),
+ Port: s.proxyPort,
+ }
+ container.CreateConfig(
+ "/nginx.conf",
+ "./resources/nginx/nginx_proxy_mirroring.conf",
+ values,
+ )
+}
+
func (s *NginxProxySuite) ProxyPort() uint16 {
return s.proxyPort
}
@@ -132,6 +142,31 @@ func (s *NginxProxySuite) CurlDownloadResource(uri string) {
s.AssertNotContains(log, "Operation timed out")
}
+func (s *NginxProxySuite) AddVclConfig(container *Container, multiThreadWorkers bool) {
+ var vclConf Stanza
+ vclFileName := container.GetHostWorkDir() + "/vcl.conf"
+
+ appSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
+ container.GetContainerWorkDir())
+
+ vclConf.
+ NewStanza("vcl").
+ Append("heapsize 64M").
+ Append("rx-fifo-size 4000000").
+ Append("tx-fifo-size 4000000").
+ Append("segment-size 4000000000").
+ Append("add-segment-size 4000000000").
+ Append("event-queue-size 100000").
+ Append("use-mq-eventfd").
+ Append(appSocketApi)
+ if multiThreadWorkers {
+ vclConf.Append("multi-thread-workers")
+ }
+
+ err := vclConf.Close().SaveToFile(vclFileName)
+ s.AssertNil(err, fmt.Sprint(err))
+}
+
var _ = Describe("NginxProxySuite", Ordered, ContinueOnFailure, func() {
var s NginxProxySuite
BeforeAll(func() {
diff --git a/extras/hs-test/infra/suite_no_topo.go b/extras/hs-test/infra/suite_no_topo.go
index a4abf40d07a..f518ba7c5e1 100644
--- a/extras/hs-test/infra/suite_no_topo.go
+++ b/extras/hs-test/infra/suite_no_topo.go
@@ -1,6 +1,7 @@
package hst
import (
+ "fmt"
"reflect"
"runtime"
"strings"
@@ -68,6 +69,50 @@ func (s *NoTopoSuite) TearDownTest() {
s.HstSuite.TearDownTest()
}
+func (s *NoTopoSuite) CreateNginxConfig(container *Container, multiThreadWorkers bool) {
+ var workers uint8
+ if multiThreadWorkers {
+ workers = 2
+ } else {
+ workers = 1
+ }
+ values := struct {
+ Workers uint8
+ }{
+ Workers: workers,
+ }
+ container.CreateConfig(
+ "/nginx.conf",
+ "./resources/nginx/nginx.conf",
+ values,
+ )
+}
+
+func (s *NoTopoSuite) AddNginxVclConfig(multiThreadWorkers bool) {
+ nginxCont := s.GetContainerByName(SingleTopoContainerNginx)
+ vclFileName := nginxCont.GetHostWorkDir() + "/vcl.conf"
+ appSocketApi := fmt.Sprintf("app-socket-api %s/var/run/app_ns_sockets/default",
+ nginxCont.GetContainerWorkDir())
+
+ var vclConf Stanza
+ vclConf.
+ NewStanza("vcl").
+ Append("heapsize 64M").
+ Append("rx-fifo-size 4000000").
+ Append("tx-fifo-size 4000000").
+ Append("segment-size 4000000000").
+ Append("add-segment-size 4000000000").
+ Append("event-queue-size 100000").
+ Append("use-mq-eventfd").
+ Append(appSocketApi)
+ if multiThreadWorkers {
+ vclConf.Append("multi-thread-workers")
+ }
+
+ err := vclConf.Close().SaveToFile(vclFileName)
+ s.AssertNil(err, fmt.Sprint(err))
+}
+
func (s *NoTopoSuite) VppAddr() string {
return s.GetInterfaceByName(TapInterfaceName).Peer.Ip4AddressString()
}
@@ -80,7 +125,7 @@ func (s *NoTopoSuite) HostAddr() string {
return s.GetInterfaceByName(TapInterfaceName).Ip4AddressString()
}
-func (s *NoTopoSuite) CreateNginxConfig(container *Container) {
+func (s *NoTopoSuite) CreateNginxHttp3Config(container *Container) {
nginxSettings := struct {
LogPrefix string
}{
diff --git a/extras/hs-test/infra/suite_ns.go b/extras/hs-test/infra/suite_ns.go
deleted file mode 100644
index 601ec22a8a9..00000000000
--- a/extras/hs-test/infra/suite_ns.go
+++ /dev/null
@@ -1,127 +0,0 @@
-package hst
-
-import (
- "fmt"
- "reflect"
- "runtime"
- "strings"
-
- . "github.com/onsi/ginkgo/v2"
-)
-
-// These correspond to names used in yaml config
-const (
- ClientInterface = "hclnvpp"
- ServerInterface = "hsrvvpp"
-)
-
-var nsTests = map[string][]func(s *NsSuite){}
-var nsSoloTests = map[string][]func(s *NsSuite){}
-
-type NsSuite struct {
- HstSuite
-}
-
-func RegisterNsTests(tests ...func(s *NsSuite)) {
- nsTests[getTestFilename()] = tests
-}
-func RegisterNsSoloTests(tests ...func(s *NsSuite)) {
- nsSoloTests[getTestFilename()] = tests
-}
-
-func (s *NsSuite) SetupSuite() {
- s.HstSuite.SetupSuite()
- s.ConfigureNetworkTopology("ns")
- s.LoadContainerTopology("ns")
-}
-
-func (s *NsSuite) SetupTest() {
- s.HstSuite.SetupTest()
-
- // Setup test conditions
- var sessionConfig Stanza
- sessionConfig.
- NewStanza("session").
- Append("enable").
- Append("use-app-socket-api").
- Append("evt_qs_memfd_seg").
- Append("event-queue-length 100000")
-
- if strings.Contains(CurrentSpecReport().LeafNodeText, "InterruptMode") {
- sessionConfig.Append("use-private-rx-mqs").Close()
- } else {
- sessionConfig.Close()
- }
-
- container := s.GetContainerByName("vpp")
- vpp, _ := container.newVppInstance(container.AllocatedCpus, sessionConfig)
- s.AssertNil(vpp.Start())
-
- idx, err := vpp.createAfPacket(s.GetInterfaceByName(ServerInterface))
- s.AssertNil(err, fmt.Sprint(err))
- s.AssertNotEqual(0, idx)
-
- idx, err = vpp.createAfPacket(s.GetInterfaceByName(ClientInterface))
- s.AssertNil(err, fmt.Sprint(err))
- s.AssertNotEqual(0, idx)
-
- container.Exec("chmod 777 -R %s", container.GetContainerWorkDir())
-}
-
-var _ = Describe("NsSuite", Ordered, ContinueOnFailure, func() {
- var s NsSuite
- BeforeAll(func() {
- s.SetupSuite()
- })
- BeforeEach(func() {
- s.SetupTest()
- })
- AfterAll(func() {
- s.TearDownSuite()
- })
- AfterEach(func() {
- s.TearDownTest()
- })
-
- for filename, tests := range nsTests {
- 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("NsSuiteSolo", Ordered, ContinueOnFailure, Serial, func() {
- var s NsSuite
- BeforeAll(func() {
- s.SetupSuite()
- })
- BeforeEach(func() {
- s.SetupTest()
- })
- AfterAll(func() {
- s.TearDownSuite()
- })
- AfterEach(func() {
- s.TearDownTest()
- })
-
- for filename, tests := range nsSoloTests {
- 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))
- }
- }
-})
diff --git a/extras/hs-test/infra/utils.go b/extras/hs-test/infra/utils.go
index 25d8519cb8a..ee528370280 100644
--- a/extras/hs-test/infra/utils.go
+++ b/extras/hs-test/infra/utils.go
@@ -254,6 +254,7 @@ func (s *HstSuite) StartWget(finished chan error, server_ip, port, query, netNs
netNs)
s.Log(cmd)
o, err := cmd.CombinedOutput()
+ s.Log(string(o))
if err != nil {
finished <- fmt.Errorf("wget error: '%v\n\n%s'", err, o)
return
diff --git a/extras/hs-test/nginx_test.go b/extras/hs-test/nginx_test.go
index 07faf2a3262..7a6f5b3c182 100644
--- a/extras/hs-test/nginx_test.go
+++ b/extras/hs-test/nginx_test.go
@@ -12,13 +12,15 @@ import (
func init() {
RegisterNoTopoTests(NginxHttp3Test, NginxAsServerTest, NginxPerfCpsTest, NginxPerfRpsTest, NginxPerfWrkTest,
NginxPerfCpsInterruptModeTest, NginxPerfRpsInterruptModeTest, NginxPerfWrkInterruptModeTest)
+ RegisterNoTopoSoloTests(NginxPerfRpsMultiThreadTest, NginxPerfCpsMultiThreadTest)
}
func NginxHttp3Test(s *NoTopoSuite) {
query := "index.html"
nginxCont := s.GetContainerByName(NginxHttp3ContainerName)
+
nginxCont.Create()
- s.CreateNginxConfig(nginxCont)
+ s.CreateNginxHttp3Config(nginxCont)
nginxCont.Start()
vpp := s.GetContainerByName("vpp").VppInstance
@@ -43,7 +45,10 @@ func NginxAsServerTest(s *NoTopoSuite) {
finished := make(chan error, 1)
nginxCont := s.GetContainerByName("nginx")
- nginxCont.Run()
+ nginxCont.Create()
+ s.CreateNginxConfig(nginxCont, false)
+ s.AddNginxVclConfig(false)
+ nginxCont.Start()
vpp := s.GetContainerByName("vpp").VppInstance
vpp.WaitForApp("nginx-", 5)
@@ -68,7 +73,7 @@ func parseString(s, pattern string) string {
return ""
}
-func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
+func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string, multiThreadWorkers bool) error {
nRequests := 1000000
nClients := 1000
@@ -77,7 +82,10 @@ func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
vpp := s.GetContainerByName("vpp").VppInstance
nginxCont := s.GetContainerByName(SingleTopoContainerNginx)
- nginxCont.Run()
+ nginxCont.Create()
+ s.AddNginxVclConfig(multiThreadWorkers)
+ s.CreateNginxConfig(nginxCont, multiThreadWorkers)
+ nginxCont.Start()
vpp.WaitForApp("nginx-", 5)
if ab_or_wrk == "ab" {
@@ -92,6 +100,7 @@ func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
args += " -r"
args += " http://" + serverAddress + ":80/64B.json"
abCont.ExtraRunningArgs = args
+ s.Log("Test might take up to 2 minutes to finish. Please wait")
abCont.Run()
o, err := abCont.GetOutput()
rps := parseString(o, "Requests per second:")
@@ -117,18 +126,24 @@ func NginxPerfCpsInterruptModeTest(s *NoTopoSuite) {
NginxPerfCpsTest(s)
}
-// unstable with multiple workers
+func NginxPerfCpsMultiThreadTest(s *NoTopoSuite) {
+ s.AssertNil(runNginxPerf(s, "cps", "ab", true))
+}
+
func NginxPerfCpsTest(s *NoTopoSuite) {
- s.SkipIfMultiWorker()
- s.AssertNil(runNginxPerf(s, "cps", "ab"))
+ s.AssertNil(runNginxPerf(s, "cps", "ab", false))
}
func NginxPerfRpsInterruptModeTest(s *NoTopoSuite) {
NginxPerfRpsTest(s)
}
+func NginxPerfRpsMultiThreadTest(s *NoTopoSuite) {
+ s.AssertNil(runNginxPerf(s, "rps", "ab", true))
+}
+
func NginxPerfRpsTest(s *NoTopoSuite) {
- s.AssertNil(runNginxPerf(s, "rps", "ab"))
+ s.AssertNil(runNginxPerf(s, "rps", "ab", false))
}
func NginxPerfWrkInterruptModeTest(s *NoTopoSuite) {
@@ -136,5 +151,5 @@ func NginxPerfWrkInterruptModeTest(s *NoTopoSuite) {
}
func NginxPerfWrkTest(s *NoTopoSuite) {
- s.AssertNil(runNginxPerf(s, "", "wrk"))
+ s.AssertNil(runNginxPerf(s, "", "wrk", false))
}
diff --git a/extras/hs-test/proxy_test.go b/extras/hs-test/proxy_test.go
index 758064424a8..b914242d34f 100644
--- a/extras/hs-test/proxy_test.go
+++ b/extras/hs-test/proxy_test.go
@@ -10,6 +10,7 @@ func init() {
RegisterVppProxyTests(VppProxyHttpGetTcpTest, VppProxyHttpGetTlsTest, VppProxyHttpPutTcpTest, VppProxyHttpPutTlsTest)
RegisterEnvoyProxyTests(EnvoyProxyHttpGetTcpTest, EnvoyProxyHttpPutTcpTest)
RegisterNginxProxyTests(NginxMirroringTest)
+ RegisterNginxProxySoloTests(MirrorMultiThreadTest)
}
func configureVppProxy(s *VppProxySuite, proto string, proxyPort uint16) {
@@ -63,9 +64,22 @@ func EnvoyProxyHttpPutTcpTest(s *EnvoyProxySuite) {
s.CurlUploadResource(uri, CurlContainerTestFile)
}
-// broken when CPUS > 1
+func MirrorMultiThreadTest(s *NginxProxySuite) {
+ nginxMirroring(s, true)
+}
+
func NginxMirroringTest(s *NginxProxySuite) {
- s.SkipIfMultiWorker()
+ nginxMirroring(s, false)
+}
+
+func nginxMirroring(s *NginxProxySuite, multiThreadWorkers bool) {
+ nginxProxyContainer := s.GetContainerByName(NginxProxyContainerName)
+ vpp := s.GetContainerByName(VppContainerName).VppInstance
+
+ s.AddVclConfig(nginxProxyContainer, multiThreadWorkers)
+ s.CreateNginxProxyConfig(nginxProxyContainer, multiThreadWorkers)
+ nginxProxyContainer.Start()
+ vpp.WaitForApp("nginx-", 5)
uri := fmt.Sprintf("http://%s:%d/httpTestFile", s.ProxyAddr(), s.ProxyPort())
s.CurlDownloadResource(uri)
}
diff --git a/extras/hs-test/resources/nginx/nginx.conf b/extras/hs-test/resources/nginx/nginx.conf
index 99073aab1ab..956a13138eb 100644
--- a/extras/hs-test/resources/nginx/nginx.conf
+++ b/extras/hs-test/resources/nginx/nginx.conf
@@ -1,6 +1,6 @@
master_process on;
worker_rlimit_nofile 10240;
-worker_processes 2;
+worker_processes {{.Workers}};
daemon off;
events {
diff --git a/extras/hs-test/resources/nginx/nginx_proxy_mirroring.conf b/extras/hs-test/resources/nginx/nginx_proxy_mirroring.conf
index 7f6b09c6050..d834a27288a 100644
--- a/extras/hs-test/resources/nginx/nginx_proxy_mirroring.conf
+++ b/extras/hs-test/resources/nginx/nginx_proxy_mirroring.conf
@@ -1,5 +1,5 @@
master_process on;
-worker_processes 4;
+worker_processes {{.Workers}};
worker_rlimit_nofile 102400;
daemon off;
diff --git a/extras/hs-test/resources/nginx/vcl.conf b/extras/hs-test/resources/nginx/vcl.conf
index cfcd5d2e959..27699248bcf 100644
--- a/extras/hs-test/resources/nginx/vcl.conf
+++ b/extras/hs-test/resources/nginx/vcl.conf
@@ -5,7 +5,6 @@ vcl {
rx-fifo-size 4000000
tx-fifo-size 4000000
event-queue-size 100000
-
use-mq-eventfd
app-socket-api /tmp/nginx/var/run/app_ns_sockets/default
}
diff --git a/extras/hs-test/script/build_hst.sh b/extras/hs-test/script/build_hst.sh
index 861eca5eb5f..a072abdb29d 100755
--- a/extras/hs-test/script/build_hst.sh
+++ b/extras/hs-test/script/build_hst.sh
@@ -85,6 +85,7 @@ docker_build hs-test/vpp vpp
docker_build hs-test/nginx-ldp nginx
docker_build hs-test/nginx-server nginx-server
docker_build hs-test/curl curl
+docker_build hs-test/envoy envoy
docker_build hs-test/nginx-http3 nginx-http3
# cleanup detached images
diff --git a/extras/hs-test/topo-containers/envoyProxy.yaml b/extras/hs-test/topo-containers/envoyProxy.yaml
index 92dd9b93c47..cbb00d868db 100644
--- a/extras/hs-test/topo-containers/envoyProxy.yaml
+++ b/extras/hs-test/topo-containers/envoyProxy.yaml
@@ -20,9 +20,8 @@ containers:
- name: "ENVOY_UID"
value: "0"
- name: "VCL_CONFIG"
- value: "/tmp/vcl.conf"
- image: "envoyproxy/envoy-contrib:v1.30-latest"
- extra-args: "--log-format [%t][%l][%g:%#]%_ --concurrency 2 -c /etc/envoy/envoy.yaml"
+ value: /tmp/vcl.conf
+ image: "hs-test/envoy"
is-optional: true
- name: "nginx-server"
volumes:
diff --git a/extras/hs-test/topo-containers/ns.yaml b/extras/hs-test/topo-containers/ns.yaml
deleted file mode 100644
index 3de5af59569..00000000000
--- a/extras/hs-test/topo-containers/ns.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-volumes:
- - volume: &shared-vol
- host-dir: "$HST_VOLUME_DIR/shared-vol"
-
-# $HST_DIR will be replaced during runtime by path to hs-test directory
-containers:
- - name: "vpp"
- volumes:
- - <<: *shared-vol
- container-dir: "/tmp/vpp"
- is-default-work-dir: true
- - name: "envoy"
- volumes:
- - <<: *shared-vol
- container-dir: "/tmp/vpp-envoy"
- is-default-work-dir: true
- - host-dir: "$HST_DIR/resources/envoy"
- container-dir: "/tmp"
- vars:
- - name: "ENVOY_UID"
- value: "0"
- - name: "VCL_CONFIG"
- value: "/tmp/vcl.conf"
- image: "envoyproxy/envoy-contrib:v1.30-latest"
- extra-args: "--concurrency 2 -c /etc/envoy/envoy.yaml"
- is-optional: true