hs-test: add nginx test 49/37849/2
authorFilip Tehlar <ftehlar@cisco.com>
Wed, 21 Dec 2022 07:59:16 +0000 (08:59 +0100)
committerFilip Tehlar <ftehlar@cisco.com>
Mon, 9 Jan 2023 10:39:06 +0000 (11:39 +0100)
Type: test

Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: Idd5352f254df0d1f36c1270e73440c9287247b81

extras/hs-test/Dockerfile.nginx [new file with mode: 0644]
extras/hs-test/actions.go
extras/hs-test/framework_test.go
extras/hs-test/http_test.go
extras/hs-test/resources/nginx/nginx.conf [new file with mode: 0644]
extras/hs-test/resources/nginx/start.sh [new file with mode: 0755]
extras/hs-test/resources/nginx/vcl.conf [new file with mode: 0644]
extras/hs-test/script/build.sh
extras/hs-test/suite_no_topo_test.go [new file with mode: 0644]
extras/hs-test/topo-containers/single.yaml [new file with mode: 0644]
extras/hs-test/utils.go

diff --git a/extras/hs-test/Dockerfile.nginx b/extras/hs-test/Dockerfile.nginx
new file mode 100644 (file)
index 0000000..ece7376
--- /dev/null
@@ -0,0 +1,8 @@
+FROM nginx:1.22.1
+
+COPY vpp-data/lib/* /usr/lib/
+COPY resources/nginx/vcl.conf /vcl.conf
+COPY resources/nginx/nginx.conf /nginx.conf
+COPY resources/nginx/start.sh /start.sh
+
+ENTRYPOINT ["/start.sh"]
index 34096df..279589b 100755 (executable)
@@ -15,6 +15,7 @@ import (
        "github.com/edwarnicke/govpp/binapi/interface_types"
        ip_types "github.com/edwarnicke/govpp/binapi/ip_types"
        "github.com/edwarnicke/govpp/binapi/session"
+       "github.com/edwarnicke/govpp/binapi/tapv2"
        "github.com/edwarnicke/govpp/binapi/vlib"
        "github.com/edwarnicke/vpphelper"
 )
@@ -347,3 +348,62 @@ func (a *Actions) ConfigureHttpTps(args []string) *ActionResult {
        <-ctx.Done()
        return nil
 }
+
+func (a *Actions) ConfigureTap(args []string) *ActionResult {
+       var startup Stanza
+       startup.
+               NewStanza("session").
+               Append("enable").
+               Append("use-app-socket-api").Close()
+
+       ctx, cancel := newVppContext()
+       defer cancel()
+       con, vppErrCh := vpphelper.StartAndDialContext(ctx,
+               vpphelper.WithRootDir(workDir),
+               vpphelper.WithVppConfig(configTemplate+startup.ToString()))
+       exitOnErrCh(ctx, cancel, vppErrCh)
+       ifaceClient := interfaces.NewServiceClient(con)
+
+       pref, err := ip_types.ParseIP4Prefix("10.10.10.2/24")
+       if err != nil {
+               return NewActionResult(err, ActionResultWithDesc("failed to parse ip4 address"))
+       }
+       createTapReply, err := tapv2.NewServiceClient(con).TapCreateV2(ctx, &tapv2.TapCreateV2{
+               HostIfNameSet:    true,
+               HostIfName:       "tap0",
+               HostIP4PrefixSet: true,
+               HostIP4Prefix:    ip_types.IP4AddressWithPrefix(pref),
+       })
+       if err != nil {
+               return NewActionResult(err, ActionResultWithDesc("failed to configure tap"))
+       }
+       ipPrefix, err := ip_types.ParseAddressWithPrefix("10.10.10.1/24")
+       if err != nil {
+               return NewActionResult(err, ActionResultWithDesc("parsing ip address failed"))
+       }
+       ipAddress := &interfaces.SwInterfaceAddDelAddress{
+               IsAdd:     true,
+               SwIfIndex: createTapReply.SwIfIndex,
+               Prefix:    ipPrefix,
+       }
+       _, errx := ifaceClient.SwInterfaceAddDelAddress(ctx, ipAddress)
+       if errx != nil {
+               return NewActionResult(err, ActionResultWithDesc("configuring ip address failed"))
+       }
+       _, err = ifaceClient.SwInterfaceSetFlags(ctx, &interfaces.SwInterfaceSetFlags{
+               SwIfIndex: createTapReply.SwIfIndex,
+               Flags:     interface_types.IF_STATUS_API_FLAG_ADMIN_UP,
+       })
+       if err != nil {
+               return NewActionResult(err, ActionResultWithDesc("failed to set interface state"))
+       }
+       _, err = session.NewServiceClient(con).SessionEnableDisable(ctx, &session.SessionEnableDisable{
+               IsEnable: true,
+       })
+       if err != nil {
+               return NewActionResult(err, ActionResultWithDesc("configuration failed"))
+       }
+       writeSyncFile(OkResult())
+       <-ctx.Done()
+       return nil
+}
index cd43cfe..056be13 100755 (executable)
@@ -178,3 +178,8 @@ func TestVeths(t *testing.T) {
        var m VethsSuite
        suite.Run(t, &m)
 }
+
+func TestNoTopo(t *testing.T) {
+       var m NoTopoSuite
+       suite.Run(t, &m)
+}
index ae1c8b8..665a3e4 100755 (executable)
@@ -1,5 +1,10 @@
 package main
 
+import (
+       "os"
+       "time"
+)
+
 func (s *NsSuite) TestHttpTps() {
        finished := make(chan error, 1)
        server_ip := "10.0.0.2"
@@ -13,7 +18,7 @@ func (s *NsSuite) TestHttpTps() {
        _, err := container.execAction("ConfigureHttpTps")
        s.assertNil(err)
 
-       go startWget(finished, server_ip, port, "client")
+       go startWget(finished, server_ip, port, "test_file_10M", "client")
        // wait for client
        err = <-finished
        s.assertNil(err)
@@ -41,3 +46,21 @@ func (s *VethsSuite) TestHttpCli() {
 
        s.assertContains(o, "<html>", "<html> not found in the result!")
 }
+
+func (s *NoTopoSuite) TestNginx() {
+       query := "return_ok"
+       finished := make(chan error, 1)
+       vppCont := s.getContainerByName("vpp")
+       vppInst := NewVppInstance(vppCont)
+       vppInst.actionFuncName = "ConfigureTap"
+       s.assertNil(vppInst.start(), "failed to start vpp")
+
+       nginxCont := s.getContainerByName("nginx")
+       s.assertNil(nginxCont.run())
+
+       time.Sleep(3 * time.Second)
+
+       defer func() { os.Remove(query) }()
+       go startWget(finished, "10.10.10.1", "80", query, "")
+       s.assertNil(<-finished)
+}
diff --git a/extras/hs-test/resources/nginx/nginx.conf b/extras/hs-test/resources/nginx/nginx.conf
new file mode 100644 (file)
index 0000000..ec83aa9
--- /dev/null
@@ -0,0 +1,26 @@
+master_process on;
+worker_rlimit_nofile 10240;
+worker_processes 2;
+daemon off;
+
+events {
+  use epoll;
+  worker_connections  10240;
+  accept_mutex       off;
+  multi_accept       off;
+}
+
+http {
+  keepalive_timeout 300s;
+  keepalive_requests 1000000;
+  sendfile on;
+  server {
+    listen 80;
+    root /usr/share/nginx;
+    index index.html index.htm;
+    location /return_ok
+    {
+      return 200 '';
+    }
+  }
+}
diff --git a/extras/hs-test/resources/nginx/start.sh b/extras/hs-test/resources/nginx/start.sh
new file mode 100755 (executable)
index 0000000..29e4902
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+LDP_PATH=/usr/lib/libvcl_ldpreload.so
+VCL_CFG=/vcl.conf
+LD_PRELOAD=$LDP_PATH VCL_CONFIG=$VCL_CFG nginx -c /nginx.conf
+tail -f /dev/null
diff --git a/extras/hs-test/resources/nginx/vcl.conf b/extras/hs-test/resources/nginx/vcl.conf
new file mode 100644 (file)
index 0000000..737b8a8
--- /dev/null
@@ -0,0 +1,10 @@
+vcl {
+  heapsize 64M
+  segment-size 4000000000
+  add-segment-size 4000000000
+  rx-fifo-size 4000000
+  tx-fifo-size 4000000
+
+  use-mq-eventfd
+  app-socket-api /tmp/nginx/var/run/app_ns_sockets/default
+}
index d80823b..b8962ec 100755 (executable)
@@ -11,3 +11,4 @@ cp ${VPP_WS}/build-root/build-vpp_debug-native/vpp/bin/* ${bin}
 cp -r ${VPP_WS}/build-root/build-vpp_debug-native/vpp/lib/x86_64-linux-gnu/* ${lib}
 
 docker build -t hs-test/vpp -f Dockerfile.vpp .
+docker build -t hs-test/nginx-ldp -f Dockerfile.nginx .
diff --git a/extras/hs-test/suite_no_topo_test.go b/extras/hs-test/suite_no_topo_test.go
new file mode 100644 (file)
index 0000000..421decc
--- /dev/null
@@ -0,0 +1,10 @@
+package main
+
+type NoTopoSuite struct {
+       HstSuite
+}
+
+func (s *NoTopoSuite) SetupSuite() {
+       s.teardownSuite = func() {}
+       s.loadContainerTopology("single")
+}
diff --git a/extras/hs-test/topo-containers/single.yaml b/extras/hs-test/topo-containers/single.yaml
new file mode 100644 (file)
index 0000000..e0fea70
--- /dev/null
@@ -0,0 +1,17 @@
+---
+volumes:
+  - shared-vol
+
+containers:
+  - name: "vpp"
+    volumes:
+      - host-dir: "shared-vol"
+        container-dir: "/tmp/vpp"
+        is-default-work-dir: true
+  - name: "nginx"
+    volumes:
+      - host-dir: "shared-vol"
+        container-dir: "/tmp/nginx"
+        is-default-work-dir: true
+    image: "hs-test/nginx-ldp"
+    is-optional: true
\ No newline at end of file
index 583dc4a..e23ea81 100755 (executable)
@@ -176,17 +176,16 @@ func startHttpServer(running chan struct{}, done chan struct{}, addressPort, net
        cmd.Process.Kill()
 }
 
-func startWget(finished chan error, server_ip, port string, netNs string) {
-       fname := "test_file_10M"
+func startWget(finished chan error, server_ip, port, query, netNs string) {
        defer func() {
                finished <- errors.New("wget error")
        }()
 
-       cmd := NewCommand([]string{"wget", "--tries=5", "-q", "-O", "/dev/null", server_ip + ":" + port + "/" + fname},
+       cmd := NewCommand([]string{"wget", "--tries=5", "-q", "-O", "/dev/null", server_ip + ":" + port + "/" + query},
                netNs)
        o, err := cmd.CombinedOutput()
        if err != nil {
-               finished <- errors.New(fmt.Sprintf("wget error: '%s'.\n%s", err, o))
+               finished <- fmt.Errorf("wget error: '%v\n\n%s'", err, o)
                return
        }
        finished <- nil