hs-test: use docker sdk 98/41198/5
authorAdrian Villin <[email protected]>
Tue, 9 Jul 2024 13:31:36 +0000 (15:31 +0200)
committerAdrian Villin <[email protected]>
Wed, 17 Jul 2024 16:20:54 +0000 (18:20 +0200)
Type: test

Change-Id: I9d6b15ca6a9aac3343e10f480dec43c4c538f1b7
Signed-off-by: Adrian Villin <[email protected]>
extras/hs-test/framework_test.go
extras/hs-test/go.mod
extras/hs-test/go.sum
extras/hs-test/infra/container.go
extras/hs-test/infra/hst_suite.go
extras/hs-test/infra/suite_nginx.go
extras/hs-test/nginx_test.go
extras/hs-test/proxy_test.go

index 7c8c564..91cb103 100644 (file)
@@ -3,8 +3,6 @@ package main
 import (
        "fmt"
        "os"
-       "path/filepath"
-       "runtime"
        "strings"
        "testing"
        "time"
@@ -14,11 +12,6 @@ import (
        . "github.com/onsi/gomega"
 )
 
-func getTestFilename() string {
-       _, filename, _, _ := runtime.Caller(2)
-       return filepath.Base(filename)
-}
-
 func TestHst(t *testing.T) {
        if *IsVppDebug {
                // 30 minute timeout so that the framework won't timeout while debugging
@@ -28,7 +21,6 @@ func TestHst(t *testing.T) {
        }
 
        output, err := os.ReadFile("/sys/devices/system/node/online")
-       fmt.Println(string(output))
        if err == nil && strings.Contains(string(output), "-") {
                NumaAwareCpuAlloc = true
        }
index 3be9ba2..f2659a7 100644 (file)
@@ -3,31 +3,52 @@ module fd.io/hs-test
 go 1.21
 
 require (
+       github.com/docker/docker v27.0.3+incompatible
+       github.com/docker/go-units v0.5.0
        github.com/edwarnicke/exechelper v1.0.3
        go.fd.io/govpp v0.10.0
        gopkg.in/yaml.v3 v3.0.1
 )
 
 require (
-       github.com/go-logr/logr v1.4.1 // indirect
+       github.com/Microsoft/go-winio v0.4.14 // indirect
+       github.com/containerd/log v0.1.0 // indirect
+       github.com/distribution/reference v0.6.0 // indirect
+       github.com/docker/go-connections v0.5.0 // indirect
+       github.com/felixge/httpsnoop v1.0.4 // indirect
+       github.com/go-logr/logr v1.4.2 // indirect
+       github.com/go-logr/stdr v1.2.2 // indirect
        github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
+       github.com/gogo/protobuf v1.3.2 // indirect
        github.com/google/go-cmp v0.6.0 // indirect
        github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
-       golang.org/x/net v0.20.0 // indirect
-       golang.org/x/text v0.14.0 // indirect
-       golang.org/x/tools v0.17.0 // indirect
+       github.com/moby/docker-image-spec v1.3.1 // indirect
+       github.com/morikuni/aec v1.0.0 // indirect
+       github.com/opencontainers/go-digest v1.0.0 // indirect
+       github.com/opencontainers/image-spec v1.1.0 // indirect
+       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
+       go.opentelemetry.io/otel v1.28.0 // indirect
+       go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
+       go.opentelemetry.io/otel/metric v1.28.0 // indirect
+       go.opentelemetry.io/otel/sdk v1.28.0 // indirect
+       go.opentelemetry.io/otel/trace v1.28.0 // indirect
+       golang.org/x/net v0.26.0 // indirect
+       golang.org/x/text v0.16.0 // indirect
+       golang.org/x/time v0.5.0 // indirect
+       golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
+       google.golang.org/protobuf v1.34.2 // indirect
+       gotest.tools/v3 v3.5.1 // indirect
 )
 
 require (
        github.com/fsnotify/fsnotify v1.7.0 // indirect
        github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
-       github.com/kr/text v0.2.0 // indirect
        github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect
        github.com/onsi/ginkgo/v2 v2.16.0
        github.com/onsi/gomega v1.32.0
        github.com/pkg/errors v0.9.1 // indirect
        github.com/sirupsen/logrus v1.9.3
        github.com/vishvananda/netns v0.0.4 // indirect
-       golang.org/x/sys v0.16.0 // indirect
+       golang.org/x/sys v0.21.0 // indirect
        gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )
index 479b028..6444f38 100644 (file)
@@ -1,25 +1,54 @@
+github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
+github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU=
+github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
+github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
+github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
+github.com/docker/docker v27.0.3+incompatible h1:aBGI9TeQ4MPlhquTQKq9XbK79rKFVwXNUAYz9aXyEBE=
+github.com/docker/docker v27.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
+github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/edwarnicke/exechelper v1.0.3 h1:OY2ocGAITTqnEDvZk0dRQSeMIQvyH0SyL/4ncz+5GeQ=
 github.com/edwarnicke/exechelper v1.0.3/go.mod h1:R65OUPKns4bgeHkCmfSHbmqLBU8aHZxTgLmEyUBUk4U=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
 github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
 github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -28,39 +57,107 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc=
 github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
+github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
 github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
 github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk=
 github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg=
+github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
+github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
+github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
 github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
 github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 go.fd.io/govpp v0.10.0 h1:lL93SbqOILjON2pMvazrlHRekGYTRy0Qmj57RuAkxR0=
 go.fd.io/govpp v0.10.0/go.mod h1:5m3bZM9ck+2EGC2O3ASmSSJAaoouyOlVWtiwj5BdCv0=
-golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
-golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0=
+go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
+go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
+go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
+go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
+go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
+go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
+go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
+golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
-golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
-google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
-google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
+golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0=
+google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
+google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
+google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -68,3 +165,5 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
+gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
index 3e8ccb4..d71761b 100644 (file)
@@ -1,13 +1,21 @@
 package hst
 
 import (
+       "bytes"
+       "context"
        "fmt"
        "os"
        "os/exec"
+       "slices"
+       "strconv"
        "strings"
        "text/template"
        "time"
 
+       containerTypes "github.com/docker/docker/api/types/container"
+       "github.com/docker/docker/api/types/image"
+       "github.com/docker/docker/pkg/stdcopy"
+       "github.com/docker/go-units"
        "github.com/edwarnicke/exechelper"
        . "github.com/onsi/ginkgo/v2"
 )
@@ -32,12 +40,14 @@ type Container struct {
        IsOptional       bool
        RunDetached      bool
        Name             string
+       ID               string
        Image            string
        ExtraRunningArgs string
        Volumes          map[string]Volume
        EnvVars          map[string]string
        VppInstance      *VppInstance
        AllocatedCpus    []int
+       ctx              context.Context
 }
 
 func newContainer(suite *HstSuite, yamlInput ContainerConfig) (*Container, error) {
@@ -52,6 +62,7 @@ func newContainer(suite *HstSuite, yamlInput ContainerConfig) (*Container, error
        container.EnvVars = make(map[string]string)
        container.Name = containerName
        container.Suite = suite
+       container.ctx = context.Background()
 
        if Image, ok := yamlInput["image"]; ok {
                container.Image = Image.(string)
@@ -133,8 +144,6 @@ func (c *Container) GetContainerWorkDir() (res string) {
 
 func (c *Container) getContainerArguments() string {
        args := "--ulimit nofile=90000:90000 --cap-add=all --privileged --network host"
-       c.allocateCpus()
-       args += fmt.Sprintf(" --cpuset-cpus=\"%d-%d\"", c.AllocatedCpus[0], c.AllocatedCpus[len(c.AllocatedCpus)-1])
        args += c.getVolumesAsCliOption()
        args += c.getEnvVarsAsCliOption()
        if *VppSourceFileDir != "" {
@@ -145,22 +154,57 @@ func (c *Container) getContainerArguments() string {
        return args
 }
 
-func (c *Container) runWithRetry(cmd string) error {
-       nTries := 5
-       for i := 0; i < nTries; i++ {
-               err := exechelper.Run(cmd)
-               if err == nil {
-                       return nil
-               }
-               time.Sleep(1 * time.Second)
-       }
-       return fmt.Errorf("failed to run container command")
+func (c *Container) PullDockerImage(name string, ctx context.Context) {
+       // "func (*Client) ImagePull" doesn't work, returns "No such image"
+       c.Suite.Log("Pulling image: " + name)
+       _, err := exechelper.CombinedOutput("docker pull " + name)
+       c.Suite.AssertNil(err)
 }
 
+// Creates a container
 func (c *Container) Create() error {
-       cmd := "docker create " + c.getContainerArguments()
-       c.Suite.Log(cmd)
-       return exechelper.Run(cmd)
+       var sliceOfImageNames []string
+       images, err := c.Suite.Docker.ImageList(c.ctx, image.ListOptions{})
+       c.Suite.AssertNil(err)
+
+       for _, image := range images {
+               sliceOfImageNames = append(sliceOfImageNames, strings.Split(image.RepoTags[0], ":")[0])
+       }
+       if !slices.Contains(sliceOfImageNames, c.Image) {
+               c.PullDockerImage(c.Image, c.ctx)
+       }
+
+       c.allocateCpus()
+       cpuSet := fmt.Sprintf("%d-%d", c.AllocatedCpus[0], c.AllocatedCpus[len(c.AllocatedCpus)-1])
+       resp, err := c.Suite.Docker.ContainerCreate(
+               c.ctx,
+               &containerTypes.Config{
+                       Image: c.Image,
+                       Env:   c.getEnvVars(),
+                       Cmd:   strings.Split(c.ExtraRunningArgs, " "),
+               },
+               &containerTypes.HostConfig{
+                       Resources: containerTypes.Resources{
+                               Ulimits: []*units.Ulimit{
+                                       {
+                                               Name: "nofile",
+                                               Soft: 90000,
+                                               Hard: 90000,
+                                       },
+                               },
+                               CpusetCpus: cpuSet,
+                       },
+                       CapAdd:      []string{"ALL"},
+                       Privileged:  true,
+                       NetworkMode: "host",
+                       Binds:       c.getVolumesAsSlice(),
+               },
+               nil,
+               nil,
+               c.Name,
+       )
+       c.ID = resp.ID
+       return err
 }
 
 func (c *Container) allocateCpus() {
@@ -169,10 +213,45 @@ func (c *Container) allocateCpus() {
        c.Suite.Log("Allocated CPUs " + fmt.Sprint(c.AllocatedCpus) + " to container " + c.Name)
 }
 
+// Starts a container
 func (c *Container) Start() error {
-       cmd := "docker start " + c.Name
-       c.Suite.Log(cmd)
-       return c.runWithRetry(cmd)
+       var err error
+       for nTries := 0; nTries < 5; nTries++ {
+               err = c.Suite.Docker.ContainerStart(c.ctx, c.ID, containerTypes.StartOptions{})
+               if err == nil {
+                       continue
+               }
+               c.Suite.Log("Error while starting " + c.Name + ". Retrying...")
+               time.Sleep(1 * time.Second)
+       }
+
+       return err
+}
+
+func (c *Container) GetOutput() (string, string) {
+       // Wait for the container to finish executing
+       statusCh, errCh := c.Suite.Docker.ContainerWait(c.ctx, c.ID, containerTypes.WaitConditionNotRunning)
+       select {
+       case err := <-errCh:
+               c.Suite.AssertNil(err)
+       case <-statusCh:
+       }
+
+       // Get the logs from the container
+       logOptions := containerTypes.LogsOptions{ShowStdout: true, ShowStderr: true}
+       logReader, err := c.Suite.Docker.ContainerLogs(c.ctx, c.ID, logOptions)
+       c.Suite.AssertNil(err)
+       defer logReader.Close()
+
+       var stdoutBuf, stderrBuf bytes.Buffer
+
+       // Use stdcopy.StdCopy to demultiplex the multiplexed stream
+       _, err = stdcopy.StdCopy(&stdoutBuf, &stderrBuf, logReader)
+       c.Suite.AssertNil(err)
+
+       stdout := stdoutBuf.String()
+       stderr := stderrBuf.String()
+       return stdout, stderr
 }
 
 func (c *Container) prepareCommand() (string, error) {
@@ -180,7 +259,7 @@ func (c *Container) prepareCommand() (string, error) {
                return "", fmt.Errorf("run container failed: name is blank")
        }
 
-       cmd := "docker run "
+       cmd := "docker exec "
        if c.RunDetached {
                cmd += " -d"
        }
@@ -201,12 +280,10 @@ func (c *Container) CombinedOutput() (string, error) {
        return string(byteOutput), err
 }
 
-func (c *Container) Run() error {
-       cmd, err := c.prepareCommand()
-       if err != nil {
-               return err
-       }
-       return c.runWithRetry(cmd)
+// Creates and starts a container
+func (c *Container) Run() {
+       c.Suite.AssertNil(c.Create())
+       c.Suite.AssertNil(c.Start())
 }
 
 func (c *Container) addVolume(hostDir string, containerDir string, isDefaultWorkDir bool) {
@@ -217,6 +294,22 @@ func (c *Container) addVolume(hostDir string, containerDir string, isDefaultWork
        c.Volumes[hostDir] = volume
 }
 
+func (c *Container) getVolumesAsSlice() []string {
+       var volumeSlice []string
+
+       if *VppSourceFileDir != "" {
+               volumeSlice = append(volumeSlice, fmt.Sprintf("%s:%s", *VppSourceFileDir, *VppSourceFileDir))
+       }
+
+       if len(c.Volumes) > 0 {
+               for _, volume := range c.Volumes {
+                       volumeSlice = append(volumeSlice, fmt.Sprintf("%s:%s", volume.HostDir, volume.ContainerDir))
+               }
+       }
+
+       return volumeSlice
+}
+
 func (c *Container) getVolumesAsCliOption() string {
        cliOption := ""
 
@@ -245,6 +338,18 @@ func (c *Container) getEnvVarsAsCliOption() string {
        return cliOption
 }
 
+func (c *Container) getEnvVars() []string {
+       var envVars []string
+       if len(c.EnvVars) == 0 {
+               return envVars
+       }
+
+       for name, value := range c.EnvVars {
+               envVars = append(envVars, fmt.Sprintf("%s=%s", name, value))
+       }
+       return envVars
+}
+
 func (c *Container) newVppInstance(cpus []int, additionalConfigs ...Stanza) (*VppInstance, error) {
        vpp := new(VppInstance)
        vpp.Container = c
@@ -317,33 +422,48 @@ func (c *Container) getLogDirPath() string {
 func (c *Container) saveLogs() {
        testLogFilePath := c.getLogDirPath() + "container-" + c.Name + ".log"
 
-       cmd := exec.Command("docker", "logs", "--details", "-t", c.Name)
-       c.Suite.Log(cmd)
-       output, err := cmd.CombinedOutput()
+       logs, err := c.log(0)
        if err != nil {
                c.Suite.Log(err)
+               return
        }
 
        f, err := os.Create(testLogFilePath)
        if err != nil {
-               Fail("file create error: " + fmt.Sprint(err))
+               c.Suite.Log(err)
+               return
        }
-       fmt.Fprint(f, string(output))
-       f.Close()
+       defer f.Close()
+       fmt.Fprint(f, logs)
 }
 
-// Outputs logs from docker containers. Set 'maxLines' to 0 to output the full log.
+// Returns logs from docker containers. Set 'maxLines' to 0 to output the full log.
 func (c *Container) log(maxLines int) (string, error) {
-       var cmd string
+       var logOptions containerTypes.LogsOptions
        if maxLines == 0 {
-               cmd = "docker logs " + c.Name
+               logOptions = containerTypes.LogsOptions{ShowStdout: true, ShowStderr: true, Details: true}
        } else {
-               cmd = fmt.Sprintf("docker logs --tail %d %s", maxLines, c.Name)
+               logOptions = containerTypes.LogsOptions{ShowStdout: true, ShowStderr: true, Details: true, Tail: strconv.Itoa(maxLines)}
        }
 
-       c.Suite.Log(cmd)
-       o, err := exechelper.CombinedOutput(cmd)
-       return string(o), err
+       out, err := c.Suite.Docker.ContainerLogs(c.ctx, c.ID, logOptions)
+       if err != nil {
+               c.Suite.Log(err)
+               return "", err
+       }
+       defer out.Close()
+
+       var stdoutBuf, stderrBuf bytes.Buffer
+
+       _, err = stdcopy.StdCopy(&stdoutBuf, &stderrBuf, out)
+       if err != nil {
+               c.Suite.Log(err)
+       }
+
+       stdout := stdoutBuf.String()
+       stderr := stderrBuf.String()
+
+       return stdout + " " + stderr, err
 }
 
 func (c *Container) stop() error {
@@ -353,8 +473,13 @@ func (c *Container) stop() error {
        }
        c.VppInstance = nil
        c.saveLogs()
-       c.Suite.Log("docker stop " + c.Name + " -t 0")
-       return exechelper.Run("docker stop " + c.Name + " -t 0")
+
+       c.Suite.Log("Stopping container " + c.Name)
+       timeout := 0
+       if err := c.Suite.Docker.ContainerStop(c.ctx, c.ID, containerTypes.StopOptions{Timeout: &timeout}); err != nil {
+               return err
+       }
+       return nil
 }
 
 func (c *Container) CreateConfig(targetConfigName string, templateName string, values any) {
index ac255b9..975e01d 100644 (file)
@@ -14,10 +14,11 @@ import (
        "strings"
        "time"
 
+       containerTypes "github.com/docker/docker/api/types/container"
+       "github.com/docker/docker/client"
        "github.com/onsi/gomega/gmeasure"
        "gopkg.in/yaml.v3"
 
-       "github.com/edwarnicke/exechelper"
        . "github.com/onsi/ginkgo/v2"
        . "github.com/onsi/gomega"
 )
@@ -52,6 +53,7 @@ type HstSuite struct {
        ProcessIndex      string
        Logger            *log.Logger
        LogFile           *os.File
+       Docker            *client.Client
 }
 
 func getTestFilename() string {
@@ -59,8 +61,16 @@ func getTestFilename() string {
        return filepath.Base(filename)
 }
 
+func (s *HstSuite) newDockerClient() {
+       var err error
+       s.Docker, err = client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
+       s.AssertNil(err)
+       s.Log("docker client created")
+}
+
 func (s *HstSuite) SetupSuite() {
        s.CreateLogger()
+       s.newDockerClient()
        s.Log("Suite Setup")
        RegisterFailHandler(func(message string, callerSkip ...int) {
                s.HstFail()
@@ -94,6 +104,7 @@ func (s *HstSuite) AddCpuContext(cpuCtx *CpuContext) {
 
 func (s *HstSuite) TearDownSuite() {
        defer s.LogFile.Close()
+       defer s.Docker.Close()
        s.Log("Suite Teardown")
        s.UnconfigureNetworkTopology()
 }
@@ -104,7 +115,6 @@ func (s *HstSuite) TearDownTest() {
                return
        }
        s.ResetContainers()
-       s.RemoveVolumes()
 
        if s.Ip4AddrAllocator != nil {
                s.Ip4AddrAllocator.DeleteIpAddresses()
@@ -121,18 +131,9 @@ func (s *HstSuite) SetupTest() {
        s.Log("Test Setup")
        s.StartedContainers = s.StartedContainers[:0]
        s.SkipIfUnconfiguring()
-       s.SetupVolumes()
        s.SetupContainers()
 }
 
-func (s *HstSuite) SetupVolumes() {
-       for _, volume := range s.Volumes {
-               cmd := "docker volume create --name=" + volume
-               s.Log(cmd)
-               exechelper.Run(cmd)
-       }
-}
-
 func (s *HstSuite) SetupContainers() {
        for _, container := range s.Containers {
                if !container.IsOptional {
@@ -214,6 +215,10 @@ func (s *HstSuite) AssertNotContains(testString, contains interface{}, msgAndArg
        Expect(testString).ToNot(ContainSubstring(fmt.Sprint(contains)), msgAndArgs...)
 }
 
+func (s *HstSuite) AssertEmpty(object interface{}, msgAndArgs ...interface{}) {
+       Expect(object).To(BeEmpty(), msgAndArgs...)
+}
+
 func (s *HstSuite) AssertNotEmpty(object interface{}, msgAndArgs ...interface{}) {
        Expect(object).ToNot(BeEmpty(), msgAndArgs...)
 }
@@ -283,15 +288,10 @@ func (s *HstSuite) SkipUnlessExtendedTestsBuilt() {
 func (s *HstSuite) ResetContainers() {
        for _, container := range s.StartedContainers {
                container.stop()
-               exechelper.Run("docker rm " + container.Name)
-       }
-}
-
-func (s *HstSuite) RemoveVolumes() {
-       for _, volumeName := range s.Volumes {
-               cmd := "docker volume rm " + volumeName
-               exechelper.Run(cmd)
-               os.RemoveAll(volumeName)
+               s.Log("Removing container " + container.Name)
+               if err := s.Docker.ContainerRemove(container.ctx, container.ID, containerTypes.RemoveOptions{RemoveVolumes: true}); err != nil {
+                       s.Log(err)
+               }
        }
 }
 
index bb1bdb0..3a8b28e 100644 (file)
@@ -66,7 +66,7 @@ func (s *NginxSuite) SetupTest() {
        s.AssertNil(proxyVpp.createTap(serverInterface, 2))
 
        nginxContainer := s.GetTransientContainerByName(NginxProxyContainerName)
-       nginxContainer.Create()
+       s.AssertNil(nginxContainer.Create())
 
        values := struct {
                Proxy  string
index 00869b0..4535843 100644 (file)
@@ -37,7 +37,7 @@ func NginxHttp3Test(s *NoTopoSuite) {
 
        query := "index.html"
        nginxCont := s.GetContainerByName("nginx-http3")
-       s.AssertNil(nginxCont.Run())
+       nginxCont.Run()
 
        vpp := s.GetContainerByName("vpp").VppInstance
        vpp.WaitForApp("nginx-", 5)
@@ -47,9 +47,10 @@ func NginxHttp3Test(s *NoTopoSuite) {
        curlCont := s.GetContainerByName("curl")
        args := fmt.Sprintf("curl --noproxy '*' --local-port 55444 --http3-only -k https://%s:8443/%s", serverAddress, query)
        curlCont.ExtraRunningArgs = args
-       o, err := curlCont.CombinedOutput()
+       curlCont.Run()
+       o, err := curlCont.GetOutput()
        s.Log(o)
-       s.AssertNil(err, fmt.Sprint(err))
+       s.AssertEmpty(err)
        s.AssertContains(o, "<http>", "<http> not found in the result!")
 }
 func NginxAsServerTest(s *NoTopoSuite) {
@@ -57,7 +58,7 @@ func NginxAsServerTest(s *NoTopoSuite) {
        finished := make(chan error, 1)
 
        nginxCont := s.GetContainerByName("nginx")
-       s.AssertNil(nginxCont.Run())
+       nginxCont.Run()
 
        vpp := s.GetContainerByName("vpp").VppInstance
        vpp.WaitForApp("nginx-", 5)
@@ -91,7 +92,7 @@ func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
        vpp := s.GetContainerByName("vpp").VppInstance
 
        nginxCont := s.GetContainerByName(SingleTopoContainerNginx)
-       s.AssertNil(nginxCont.Run())
+       nginxCont.Run()
        vpp.WaitForApp("nginx-", 5)
 
        if ab_or_wrk == "ab" {
@@ -106,21 +107,23 @@ func runNginxPerf(s *NoTopoSuite, mode, ab_or_wrk string) error {
                args += " -r"
                args += " http://" + serverAddress + ":80/64B.json"
                abCont.ExtraRunningArgs = args
-               o, err := abCont.CombinedOutput()
+               abCont.Run()
+               o, err := abCont.GetOutput()
                rps := parseString(o, "Requests per second:")
                s.Log(rps)
-               s.Log(err)
-               s.AssertNil(err, "err: '%s', output: '%s'", err, o)
+               s.AssertContains(err, "Finished "+fmt.Sprint(nRequests))
        } else {
                wrkCont := s.GetContainerByName("wrk")
                args := fmt.Sprintf("-c %d -t 2 -d 30 http://%s:80/64B.json", nClients,
                        serverAddress)
                wrkCont.ExtraRunningArgs = args
-               o, err := wrkCont.CombinedOutput()
+               wrkCont.Run()
+               s.Log("Please wait for 30s, test is running.")
+               o, err := wrkCont.GetOutput()
                rps := parseString(o, "requests")
                s.Log(rps)
                s.Log(err)
-               s.AssertNil(err, "err: '%s', output: '%s'", err, o)
+               s.AssertEmpty(err, "err: '%s', output: '%s'", err, o)
        }
        return nil
 }
index 5f7eb45..e646a96 100644 (file)
@@ -91,8 +91,7 @@ func VppProxyHttpTlsTest(s *NsSuite) {
 
 func configureEnvoyProxy(s *NsSuite) {
        envoyContainer := s.GetContainerByName("envoy")
-       err := envoyContainer.Create()
-       s.AssertNil(err, "Error creating envoy container: %s", err)
+       s.AssertNil(envoyContainer.Create())
 
        serverVeth := s.GetInterfaceByName(ServerInterface)
        address := struct {