aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Wallace <dwallacelf@gmail.com>2019-08-06 22:26:00 +0000
committerVratko Polak <vrpolak@cisco.com>2019-08-14 16:25:19 +0000
commit6da7266754c28754c04cf37d1974e39766a261f6 (patch)
tree3fbbe99fd1e797946a888293d302d0f50ffbb96a
parent669d320bc64e41f879c047a39a66b8ec99bf4b1e (diff)
VAT-to-PAPI: Fix HTTP/TCP tests
Change-Id: Ie728bc73eb7429d246e82dd195fc63191c3ac51d Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
-rw-r--r--resources/libraries/bash/entry/check/tc_naming.sh4
-rw-r--r--resources/libraries/python/Constants.py3
-rw-r--r--resources/libraries/python/tcp.py61
-rw-r--r--resources/libraries/robot/tcp/tcp_setup.robot22
-rw-r--r--resources/libraries/robot/wrk/wrk_utils.robot3
-rw-r--r--resources/templates/vat/start_http_server.vat1
-rw-r--r--resources/templates/vat/start_http_server_params.vat1
-rw-r--r--resources/tools/wrk/wrk.py2
-rwxr-xr-xresources/tools/wrk/wrk_utils.sh6
-rw-r--r--resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-cps.yaml19
-rw-r--r--resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-rps.yaml19
-rw-r--r--resources/traffic_profiles/wrk/www/empty.html0
-rw-r--r--tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-cps.robot (renamed from tests/vpp/perf/tcp/10ge2p1x520-ethip4tcphttp-httpserver.robot)83
-rw-r--r--tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-rps.robot93
14 files changed, 190 insertions, 127 deletions
diff --git a/resources/libraries/bash/entry/check/tc_naming.sh b/resources/libraries/bash/entry/check/tc_naming.sh
index 1101fa5a16..b8a2775035 100644
--- a/resources/libraries/bash/entry/check/tc_naming.sh
+++ b/resources/libraries/bash/entry/check/tc_naming.sh
@@ -66,7 +66,7 @@ r_testc_rules=(
#'(ipsec[[:digit:]]+tnlhw|ipsec[[:digit:]]+tnlsw|'
#'srhip6|tcp|udp|lispip6|lispip4|vxlan){0,1}'
#'(http){0,1}-'
- '(.*)-(dev|ndrpdr|cps)$'
+ '(.*)-(dev|ndrpdr|cps|rps)$'
)
s_suite_rules=(
'number of SUT nodes'
@@ -85,7 +85,7 @@ r_suite_rules=(
#'(ipsec[[:digit:]]+tnlhw|ipsec[[:digit:]]+tnlsw|'
#'srhip6|tcp|udp|lispip6|lispip4|vxlan){0,1}'
#'(http){0,1}-'
- '(.*)-(dev|ndrpdr|cps)$'
+ '(.*)-(dev|ndrpdr|cps|rps)$'
)
rm -f "tc_naming.log" || die
diff --git a/resources/libraries/python/Constants.py b/resources/libraries/python/Constants.py
index c970d19027..e8209544e8 100644
--- a/resources/libraries/python/Constants.py
+++ b/resources/libraries/python/Constants.py
@@ -43,6 +43,9 @@ class Constants(object):
# Container templates location
RESOURCES_TPL_CONTAINER = 'resources/templates/container'
+ # HTTP Server www root directory
+ RESOURCES_TP_WRK_WWW = 'resources/traffic_profiles/wrk/www'
+
# OpenVPP VAT binary name
VAT_BIN_NAME = 'vpp_api_test'
diff --git a/resources/libraries/python/tcp.py b/resources/libraries/python/tcp.py
index e013a65539..1b08912b7e 100644
--- a/resources/libraries/python/tcp.py
+++ b/resources/libraries/python/tcp.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
@@ -14,36 +14,35 @@
"""TCP util library.
"""
-from resources.libraries.python.VatExecutor import VatTerminal
+from resources.libraries.python.PapiExecutor import PapiSocketExecutor
+from resources.libraries.python.Constants import Constants
class TCPUtils(object):
"""Implementation of the TCP utilities.
"""
+ www_root_dir = '{rmt_fw_dir}/{wrk_www}'\
+ .format(rmt_fw_dir=Constants.REMOTE_FW_DIR,
+ wrk_www=Constants.RESOURCES_TP_WRK_WWW)
def __init__(self):
pass
- @staticmethod
- def start_http_server(node):
- """Start HTTP server on the given node.
-
- :param node: Node to start HTTP server on.
- :type node: dict
- """
-
- with VatTerminal(node) as vat:
- vat.vat_terminal_exec_cmd_from_template(
- "start_http_server.vat")
-
- @staticmethod
- def start_http_server_params(node, prealloc_fifos, fifo_size,
- private_segment_size):
- """Start HTTP server on the given node.
+ @classmethod
+ def start_vpp_http_server_params(cls, node, http_static_plugin,
+ prealloc_fifos, fifo_size,
+ private_segment_size):
+ """Start the test HTTP server internal application or
+ the HTTP static server plugin internal applicatoin on the given node.
+ http static server www-root <www-root-dir> prealloc-fifos <N>
+ fifo-size <size in kB>
+ private-segment-size <seg_size expressed as number + unit, e.g. 100m>
+ -- or --
test http server static prealloc-fifos <N> fifo-size <size in kB>
private-segment-size <seg_size expressed as number + unit, e.g. 100m>
+
Where N is the max number of connections you expect to handle at one
time and <size> should be small if you test for CPS and exchange few
bytes, say 4, if each connection just exchanges few packets. Or it
@@ -55,28 +54,36 @@ class TCPUtils(object):
Example:
For CPS
- test http server static prealloc-fifos 10000 fifo-size 64
- private-segment-size 4000m
+ http static server www-root <www-root-dir> prealloc-fifos 10000
+ fifo-size 64 private-segment-size 4000m
For RPS
test http server static prealloc-fifos 500000 fifo-size 4
- test http server static prealloc-fifos 500000 fifo-size 4
private-segment-size 4000m
:param node: Node to start HTTP server on.
+ :param http_static_plugin: Run HTTP static server plugin
:param prealloc_fifos: Max number of connections you expect to handle at
one time.
:param fifo_size: FIFO size in kB.
:param private_segment_size: Private segment size. Number + unit.
:type node: dict
+ :type http_static_plugin: boolean
:type prealloc_fifos: str
:type fifo_size: str
:type private_segment_size: str
"""
+ if http_static_plugin == True:
+ cmd='http static server www-root {www_root} '\
+ 'prealloc-fifos {prealloc_fifos} fifo-size {fifo_size}'\
+ ' private-segment-size {pvt_seg_size}'\
+ .format(www_root=cls.www_root_dir,
+ prealloc_fifos=prealloc_fifos, fifo_size=fifo_size,
+ pvt_seg_size=private_segment_size)
+ else:
+ cmd='test http server static prealloc-fifos {prealloc_fifos} '\
+ 'fifo-size {fifo_size} private-segment-size {pvt_seg_size}'\
+ .format(prealloc_fifos=prealloc_fifos, fifo_size=fifo_size,
+ pvt_seg_size=private_segment_size)
+ PapiSocketExecutor.run_cli_cmd(node, cmd)
- with VatTerminal(node, json_param=False) as vat:
- vat.vat_terminal_exec_cmd_from_template(
- "start_http_server_params.vat",
- prealloc_fifos=prealloc_fifos,
- fifo_size=fifo_size,
- private_segment_size=private_segment_size)
diff --git a/resources/libraries/robot/tcp/tcp_setup.robot b/resources/libraries/robot/tcp/tcp_setup.robot
index 39a570c20a..91192639c1 100644
--- a/resources/libraries/robot/tcp/tcp_setup.robot
+++ b/resources/libraries/robot/tcp/tcp_setup.robot
@@ -21,24 +21,27 @@
| Documentation | L2 keywords to set up VPP to test tcp.
*** Keywords ***
-| Set up HTTP server with paramters on the VPP node
+| Set up HTTP server with parameters on the VPP node
| | [Documentation]
| | ... | Configure IP address on the port, set it up and start HTTP server on
| | ... | the VPP.
| | ...
| | ... | *Arguments:*
-| | ... | - ${prealloc_fifos} - Max number of connections you expect to handle
+| | ... | - http_static_plugin - Use the HTTP static plugin http server.
+| | ... | Type: boolean
+| | ... | - prealloc_fifos - Max number of connections you expect to handle
| | ... | at one time. Type: string
-| | ... | - ${fifo_size} - FIFO size in kB. Type: string
-| | ... | - ${private_segment_size} - Private segment size. Number + unit.
+| | ... | - fifo_size - FIFO size in kB. Type: string
+| | ... | - private_segment_size - Private segment size. Number + unit.
| | ... | Type: string
| | ...
| | ... | *Example:*
| | ...
-| | ... | \| Set up HTTP server with paramters on the VPP node \| 400 \| 4096\
-| | ... | \| 2g \|
+| | ... | \| Set up HTTP server with paramters on the VPP node \| ${true}\
+| | ... | \| 400 \| 4096 \| 2g \|
| | ...
-| | [Arguments] | ${prealloc_fifos} | ${fifo_size} | ${private_segment_size}
+| | [Arguments] | ${http_static_plugin} | ${prealloc_fifos} | ${fifo_size}
+| | ... | ${private_segment_size}
| | ...
| | Set Interface State | ${dut1} | ${dut1_if1} | up
| | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 192.168.10.2 | 24
@@ -50,6 +53,5 @@
| | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 192.168.70.2 | 24
| | VPP Interface Set IP Address | ${dut1} | ${dut1_if1} | 192.168.80.2 | 24
| | Vpp Node Interfaces Ready Wait | ${dut1}
-| | Start HTTP server params | ${dut1} | ${prealloc_fifos} | ${fifo_size}
-| | ... | ${private_segment_size}
-| | Sleep | 30
+| | Start VPP HTTP server params | ${dut1} | ${http_static_plugin}
+| | ... | ${prealloc_fifos} | ${fifo_size} | ${private_segment_size}
diff --git a/resources/libraries/robot/wrk/wrk_utils.robot b/resources/libraries/robot/wrk/wrk_utils.robot
index fd18a5d686..1c65228130 100644
--- a/resources/libraries/robot/wrk/wrk_utils.robot
+++ b/resources/libraries/robot/wrk/wrk_utils.robot
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
@@ -17,7 +17,6 @@
| Library | resources.libraries.python.DUTSetup
| Library | resources.libraries.python.TrafficGenerator
| Library | resources.libraries.python.topology.Topology
-| Resource | resources/libraries/robot/performance/performance_setup.robot
| ...
| Documentation | L2 keywords to set up wrk and to measure performance
| ... | parameters using wrk.
diff --git a/resources/templates/vat/start_http_server.vat b/resources/templates/vat/start_http_server.vat
deleted file mode 100644
index 1d00285a91..0000000000
--- a/resources/templates/vat/start_http_server.vat
+++ /dev/null
@@ -1 +0,0 @@
-exec test http server static \ No newline at end of file
diff --git a/resources/templates/vat/start_http_server_params.vat b/resources/templates/vat/start_http_server_params.vat
deleted file mode 100644
index 28c4403079..0000000000
--- a/resources/templates/vat/start_http_server_params.vat
+++ /dev/null
@@ -1 +0,0 @@
-exec test http server static prealloc-fifos {prealloc_fifos} fifo-size {fifo_size} private-segment-size {private_segment_size} \ No newline at end of file
diff --git a/resources/tools/wrk/wrk.py b/resources/tools/wrk/wrk.py
index b7989b8852..84d17ee7a1 100644
--- a/resources/tools/wrk/wrk.py
+++ b/resources/tools/wrk/wrk.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
diff --git a/resources/tools/wrk/wrk_utils.sh b/resources/tools/wrk/wrk_utils.sh
index 1c77fea731..16af61416b 100755
--- a/resources/tools/wrk/wrk_utils.sh
+++ b/resources/tools/wrk/wrk_utils.sh
@@ -74,7 +74,7 @@ function wrk_utils.traffic_1_url_1_core {
if [ "${header}" != "None" ]; then
header="${header}"
else
- header=""
+ header="''"
fi
taskset --cpu-list ${cpu} \
@@ -134,7 +134,7 @@ function wrk_utils.traffic_n_urls_n_cores {
if [ "${header}" != "None" ]; then
header="${header}"
else
- header=""
+ header="''"
fi
urls=$(echo ${urls} | tr ";" "\n")
@@ -204,7 +204,7 @@ function wrk_utils.traffic_n_urls_m_cores {
if [ "${header}" != "None" ]; then
header="${header}"
else
- header=""
+ header="''"
fi
urls=$(echo ${urls} | tr ";" "\n")
diff --git a/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-cps.yaml b/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-cps.yaml
index 706cda01b5..2d059e7b6e 100644
--- a/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-cps.yaml
+++ b/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-cps.yaml
@@ -1,18 +1,17 @@
-# This is an example wrk traffic profile.
+# wrk-sf-2n-ethip4tcphttp-8u8c50con-cps traffic profile.
# List of urls for requests. Each url is requested in a separate instance of
# wrk.
# Type: list
urls:
- # There must be an empty file (0B) requested but vpp does not support it.
- - "http://192.168.10.2"
- - "http://192.168.20.2"
- - "http://192.168.30.2"
- - "http://192.168.40.2"
- - "http://192.168.50.2"
- - "http://192.168.60.2"
- - "http://192.168.70.2"
- - "http://192.168.80.2"
+ - "http://192.168.10.2/empty.html"
+ - "http://192.168.20.2/empty.html"
+ - "http://192.168.30.2/empty.html"
+ - "http://192.168.40.2/empty.html"
+ - "http://192.168.50.2/empty.html"
+ - "http://192.168.60.2/empty.html"
+ - "http://192.168.70.2/empty.html"
+ - "http://192.168.80.2/empty.html"
# Index of the first CPU on the numa used to run wrk.
# Type: integer
diff --git a/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-rps.yaml b/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-rps.yaml
index c1ad9e4217..d997e16ed2 100644
--- a/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-rps.yaml
+++ b/resources/traffic_profiles/wrk/wrk-sf-2n-ethip4tcphttp-8u8c50con-rps.yaml
@@ -1,18 +1,17 @@
-# This is an example wrk traffic profile.
+# wrk-sf-2n-ethip4tcphttp-8u8c50con-rps traffic profile.
# List of urls for requests. Each url is requested in a separate instance of
# wrk.
# Type: list
urls:
- # There must be a file (1kB - 1MB) requested but vpp does not support it.
- - "http://192.168.10.2"
- - "http://192.168.20.2"
- - "http://192.168.30.2"
- - "http://192.168.40.2"
- - "http://192.168.50.2"
- - "http://192.168.60.2"
- - "http://192.168.70.2"
- - "http://192.168.80.2"
+ - "http://192.168.10.2/empty.html"
+ - "http://192.168.20.2/empty.html"
+ - "http://192.168.30.2/empty.html"
+ - "http://192.168.40.2/empty.html"
+ - "http://192.168.50.2/empty.html"
+ - "http://192.168.60.2/empty.html"
+ - "http://192.168.70.2/empty.html"
+ - "http://192.168.80.2/empty.html"
# Index of the first CPU on the numa used to run wrk.
# Type: integer
diff --git a/resources/traffic_profiles/wrk/www/empty.html b/resources/traffic_profiles/wrk/www/empty.html
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/resources/traffic_profiles/wrk/www/empty.html
diff --git a/tests/vpp/perf/tcp/10ge2p1x520-ethip4tcphttp-httpserver.robot b/tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-cps.robot
index c995a586af..7dd6a5d132 100644
--- a/tests/vpp/perf/tcp/10ge2p1x520-ethip4tcphttp-httpserver.robot
+++ b/tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-cps.robot
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
@@ -18,7 +18,8 @@
| Resource | resources/libraries/robot/shared/default.robot
| Resource | resources/libraries/robot/tcp/tcp_setup.robot
| ...
-| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | HTTP | TCP
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV
+| ... | HTTP | TCP | TCP_CPS | NIC_Intel-X710
| ...
| Suite Setup | Setup suite single link | wrk
| Suite Teardown | Tear down suite
@@ -27,27 +28,28 @@
| ...
| Test Template | Local template
| ...
-| Documentation | *HTTP requests per seconds, connections per seconds and
-| ... | throughput measurement.*
+| Documentation | *HTTP connections per seconds.*
| ...
| ... | *[Top] Network Topologies:* TG-DUT-TG 2-node topology
| ... | with single link between nodes.
-| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for IPv4 routing.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-TCP-HTTP for TCP Host Stack
| ... | *[Cfg] DUT configuration:*
| ... | *[Ver] TG verification:*
| ... | *[Ref] Applicable standard specifications:*
*** Variables ***
-| @{plugins_to_enable}= | dpdk_plugin.so
+| @{plugins_to_enable}= | dpdk_plugin.so | http_static_plugin.so
+| ... | hs_apps_plugin.so
+| ${nic_name}= | Intel-X710
+| ${traffic_profile}= | wrk-sf-2n-ethip4tcphttp-8u8c50con-cps
+| ${http_static_plugin}= | ${false}
*** Keywords ***
| Local template
-| | [Arguments] | ${traffic_profile} | ${phy_cores} | ${test_type}
-| | ... | ${rxq}=${None}
+| | [Arguments] | ${phy_cores} | ${rxq}=${None}
| | ...
| | Add worker threads and rxqueues to all DUTs | ${phy_cores} | ${rxq}
| | Add PCI devices to all DUTs
-| | ${duts}= | Get Matches | ${nodes} | DUT*
| | :FOR | ${dut} | IN | @{duts}
| | | Import Library | resources.libraries.python.VppConfigGenerator
| | | ... | WITH NAME | ${dut}
@@ -64,67 +66,28 @@
| | | Run keyword | ${dut}.Add session local endpoints table buckets | 2500000
| | | Run keyword | ${dut}.Add session local endpoints table memory | 3g
| | Apply startup configuration on all VPP DUTs
-| | Run Keyword If | '${test_type}' == 'bw'
-| | ... | Run keywords
-| | ... | Set up HTTP server with paramters on the VPP node
-| | ... | 500000 | 4 | 4000m | AND
-| | ... | Measure throughput | ${traffic_profile}
-| | ... | ELSE IF | '${test_type}' == 'rps'
-| | ... | Run keywords
-| | ... | Set up HTTP server with paramters on the VPP node
-| | ... | 500000 | 4 | 4000m | AND
-| | ... | Measure requests per second | ${traffic_profile}
-| | ... | ELSE IF | '${test_type}' == 'cps'
-| | ... | Run keywords
-| | ... | Set up HTTP server with paramters on the VPP node
-| | ... | 31000 | 64 | 4000m | AND
-| | ... | Measure connections per second | ${traffic_profile}
+| | When Set up HTTP server with parameters on the VPP node
+| | ... | ${http_static_plugin} | 31000 | 64 | 4000m
+| | Then Measure connections per second | ${traffic_profile}
*** Test Cases ***
-| tc01-1t1c-ethip4tcphttp-httpserver-cps
+| tc01-IMIX-1c-eth-ip4tcphttp-wrk8u8c50con-cps
| | [Documentation]
| | ... | Measure number of connections per second using wrk.
| | ...
-| | [Tags] | 1C | TCP_CPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-cps | phy_cores=${1}
-| | ... | test_type=cps
+| | [Tags] | 1C
+| | phy_cores=${1}
-| tc02-2t2c-ethip4tcphttp-httpserver-cps
+| tc02-IMIX-2c-eth-ip4tcphttp-wrk8u8c50con-cps
| | [Documentation]
| | ... | Measure number of connections per second using wrk.
| | ...
-| | [Tags] | 2C | TCP_CPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-cps | phy_cores=${2}
-| | ... | test_type=cps
+| | [Tags] | 2C
+| | phy_cores=${2}
-| tc03-4t4c-ethip4tcphttp-httpserver-cps
+| tc03-IMIX-4c-eth-ip4tcphttp-wrk8u8c50con-cps
| | [Documentation]
| | ... | Measure number of connections per second using wrk.
| | ...
-| | [Tags] | 4C | TCP_CPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-cps | phy_cores=${4}
-| | ... | test_type=cps
-
-| tc04-1t1c-ethip4tcphttp-httpserver-rps
-| | [Documentation]
-| | ... | Measure and report number of requests per second using wrk.
-| | ...
-| | [Tags] | 1C | TCP_RPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-rps | phy_cores=${1}
-| | ... | test_type=rps
-
-| tc05-2t2c-ethip4tcphttp-httpserver-rps
-| | [Documentation]
-| | ... | Measure and report number of requests per second using wrk.
-| | ...
-| | [Tags] | 2C | TCP_RPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-rps | phy_cores=${2}
-| | ... | test_type=rps
-
-| tc06-4t4c-ethip4tcphttp-httpserver-rps
-| | [Documentation]
-| | ... | Measure and report number of requests per second using wrk.
-| | ...
-| | [Tags] | 4C | TCP_RPS
-| | traffic_profile=wrk-sf-2n-ethip4tcphttp-8u8c50con-rps | phy_cores=${4}
-| | ... | test_type=rps
+| | [Tags] | 4C
+| | phy_cores=${4}
diff --git a/tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-rps.robot b/tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-rps.robot
new file mode 100644
index 0000000000..b5f405d738
--- /dev/null
+++ b/tests/vpp/perf/tcp/2n1l-10ge2p1x710-eth-ip4tcphttp-rps.robot
@@ -0,0 +1,93 @@
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+
+| Library | resources.tools.wrk.wrk
+| Resource | resources/libraries/robot/wrk/wrk_utils.robot
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/tcp/tcp_setup.robot
+| ...
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV
+| ... | HTTP | TCP | TCP_RPS | NIC_Intel-X710
+| ...
+| Suite Setup | Setup suite single link | wrk
+| Suite Teardown | Tear down suite
+| Test Setup | Setup test
+| Test Teardown | Tear down test
+| ...
+| Test Template | Local template
+| ...
+| Documentation | *HTTP requests per seconds.*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT-TG 2-node topology
+| ... | with single link between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-TCP-HTTP for TCP Host Stack
+| ... | *[Cfg] DUT configuration:*
+| ... | *[Ver] TG verification:*
+| ... | *[Ref] Applicable standard specifications:*
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | http_static_plugin.so
+| ... | hs_apps_plugin.so
+| ${nic_name}= | Intel-X710
+| ${traffic_profile}= | wrk-sf-2n-ethip4tcphttp-8u8c50con-rps
+| ${http_static_plugin}= | ${true}
+
+*** Keywords ***
+| Local template
+| | [Arguments] | ${phy_cores} | ${rxq}=${None}
+| | ...
+| | Add worker threads and rxqueues to all DUTs | ${phy_cores} | ${rxq}
+| | Add PCI devices to all DUTs
+| | :FOR | ${dut} | IN | @{duts}
+| | | Import Library | resources.libraries.python.VppConfigGenerator
+| | | ... | WITH NAME | ${dut}
+| | | Run keyword | ${dut}.Add api segment global size | 2G
+| | | Run keyword | ${dut}.Add api segment api size | 1G
+| | | Run keyword | ${dut}.Add TCP preallocated connections | 1000000
+| | | Run keyword | ${dut}.Add TCP preallocated half open connections | 1000000
+| | | Run keyword | ${dut}.Add session event queue length | 1000000
+| | | Run keyword | ${dut}.Add session preallocated sessions | 1000000
+| | | Run keyword | ${dut}.Add session v4 session table buckets | 500000
+| | | Run keyword | ${dut}.Add session v4 session table memory | 1g
+| | | Run keyword | ${dut}.Add session v4 halfopen table buckets | 2500000
+| | | Run keyword | ${dut}.Add session v4 halfopen table memory | 3g
+| | | Run keyword | ${dut}.Add session local endpoints table buckets | 2500000
+| | | Run keyword | ${dut}.Add session local endpoints table memory | 3g
+| | Apply startup configuration on all VPP DUTs
+| | When Set up HTTP server with parameters on the VPP node
+| | ... | ${http_static_plugin} | 500000 | 4 | 4000m
+| | Then Measure requests per second | ${traffic_profile}
+
+*** Test Cases ***
+| tc01-IMIX-1c-eth-ip4tcphttp-wrk8u8c50con-rps
+| | [Documentation]
+| | ... | Measure number of requests per second using wrk.
+| | ...
+| | [Tags] | 1C
+| | phy_cores=${1}
+
+| tc02-IMIX-2c-eth-ip4tcphttp-wrk8u8c50con-rps
+| | [Documentation]
+| | ... | Measure number of requests per second using wrk.
+| | ...
+| | [Tags] | 2C
+| | phy_cores=${2}
+
+| tc03-IMIX-4c-eth-ip4tcphttp-wrk8u8c50con-rps
+| | [Documentation]
+| | ... | Measure number of requests per second using wrk.
+| | ...
+| | [Tags] | 4C
+| | phy_cores=${4}