aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INFO.yaml26
-rw-r--r--conf/12_k8s.conf4
-rw-r--r--conf/kubernetes/01_testcases.conf59
-rw-r--r--core/pod_controller.py10
-rw-r--r--docs/release/release-notes/release-notes.rst30
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Bidirectional Test with PROX.md226
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-OvS-DPDK.yaml68
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-VPP.yaml68
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-OvS-DPDK.yaml68
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml68
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/TRex-pod/userspace-trex-pod-2-interfaces-VPP.yaml64
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-ovs-netAttach.yaml47
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-vpp-netAttach-memif.yaml46
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/README.md9
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/parameters.lua11
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/prox.cfg61
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/parameters.lua17
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/prox.cfg102
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/parameters.lua11
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/prox.cfg69
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/parameters.lua7
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/prox.cfg35
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/parameters.lua8
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/prox.cfg51
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/parameters.lua7
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/prox.cfg43
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.env36
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.tst43
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.env33
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.tst43
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Configurations/TRex/vsperf-trex.conf36
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Limitations.md10
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Requirements.md116
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Test with PROX and OVS.md372
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Test with PROX and VPP.md375
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Test with TRex and VPP.md228
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/Topologies-EastWest.md34
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen-swap.pngbin0 -> 27990 bytes
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen.pngbin0 -> 31489 bytes
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/images/topologies.pngbin0 -> 79037 bytes
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/images/topology1.pngbin0 -> 17692 bytes
-rw-r--r--docs/testing/user/userguide/east-west-benchmarking/images/trex-screen.pngbin0 -> 26692 bytes
-rwxr-xr-xsrc/qemu/Makefile6
-rw-r--r--src/vpp/Makefile1
-rw-r--r--testcases/testcase.py35
-rw-r--r--tools/cloudinfo.py94
-rw-r--r--tools/k8s/load-generator/Dockerfile27
-rwxr-xr-xtools/k8s/load-generator/README.md24
-rwxr-xr-xtools/k8s/load-generator/config.zpl52
-rw-r--r--tools/k8s/load-generator/csdeployment.yaml39
-rw-r--r--tools/pkt_gen/trex/trex_client.py6
51 files changed, 2791 insertions, 34 deletions
diff --git a/INFO.yaml b/INFO.yaml
index 25273afc..5ff75d22 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -4,11 +4,11 @@ project_creation_date: ''
project_category: 'Integration & Testing'
lifecycle_state: 'Mature'
project_lead: &opnfv_vswitchperf_ptl
- name: 'Sridhar Rao'
- email: 'Sridhar.Rao@spirent.com'
- company: 'spirent.com'
- id: 'sridharkn'
- timezone: 'IST'
+ name: 'Al Morton'
+ email: 'acmorton@att.com'
+ company: 'att.com'
+ id: 'acm'
+ timezone: 'CDT'
primary_contact: *opnfv_vswitchperf_ptl
issue_tracking:
type: 'jira'
@@ -25,23 +25,23 @@ realtime_discussion:
meetings:
- type: 'gotomeeting+irc'
agenda: # eg: 'https://wiki.opnfv.org/display/'
- url: # eg: 'https://global.gotomeeting.com/join/819733085'
+ url: https://zoom.us/j/2362828999 # eg: 'https://global.gotomeeting.com/join/819733085'
server: 'freenode.net'
channel: '#opnfv-meeting'
repeats: 'weekly'
- time: '15:00 UTC' # eg: '16:00 UTC'
+ time: '09:00 US-ET' # eg: '15:00 UTC'
repositories:
- 'vineperf'
committers:
- <<: *opnfv_vswitchperf_ptl
- name: 'Maryam Tahhan'
- email: 'maryam.tahhan@intel.com'
- company: 'intel.com'
+ email: 'mtahhan@redhat.com'
+ company: 'redhat.com'
id: 'maryamtahhan'
- - name: 'Al Morton'
- email: 'acmorton@att.com'
- company: 'att.com'
- id: 'acm'
+ - name: 'Sridhar Rao'
+ email: 'srao@linuxfoundation.org'
+ company: 'linuxfoundation.org'
+ id: 'sridharkn'
- name: 'Martin Klozik'
email: 'martin.klozik@tieto.com'
company: 'tieto.com'
diff --git a/conf/12_k8s.conf b/conf/12_k8s.conf
index 04e70de4..1b51f687 100644
--- a/conf/12_k8s.conf
+++ b/conf/12_k8s.conf
@@ -1,3 +1,4 @@
+# Copyright 2022 The Linux Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -45,3 +46,6 @@ APP_NAME = 'l2fwd'
EXT_VSWITCH = True
EXT_VSWITCH_TYPE = 'VPP'
EXT_OVS_BRIDGE = 'br0'
+
+# Flow Control
+USCNI_INTERFACE_PAIRS = 1
diff --git a/conf/kubernetes/01_testcases.conf b/conf/kubernetes/01_testcases.conf
index 9e238557..a6bb8d35 100644
--- a/conf/kubernetes/01_testcases.conf
+++ b/conf/kubernetes/01_testcases.conf
@@ -1,3 +1,22 @@
+# Copyright 2022 Spirent Communications, The Linux Foundation, and others.
+#
+# 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.
+
+#
+# Generic test configuration options are described at conf/01_testcases.conf
+#
+
+
K8SPERFORMANCE_TESTS = [
{
"Name": "pcp_tput",
@@ -31,4 +50,44 @@ K8SPERFORMANCE_TESTS = [
},
},
},
+ {
+ "Name": "c2c_tput",
+ "Deployment": "pcp",
+ "Description": "LTD.Throughput.RFC2544.Throughput",
+ "Parameters" : {
+ "TRAFFIC" : {
+ "traffic_type" : "rfc2544_throughput",
+ },
+ },
+ },
+ {
+ "Name": "c2c_2inf_tput",
+ "Deployment": "pcp",
+ "Description": "LTD.Throughput.RFC2544.Throughput",
+ "Parameters" : {
+ "TRAFFIC" : {
+ "traffic_type" : "rfc2544_throughput",
+ },
+ },
+ },
+ {
+ "Name": "c2c2c_tput",
+ "Deployment": "pcp",
+ "Description": "LTD.Throughput.RFC2544.Throughput",
+ "Parameters" : {
+ "TRAFFIC" : {
+ "traffic_type" : "rfc2544_throughput",
+ },
+ },
+ },
+ {
+ "Name": "c2c2c_2inf_tput",
+ "Deployment": "pcp",
+ "Description": "LTD.Throughput.RFC2544.Throughput",
+ "Parameters" : {
+ "TRAFFIC" : {
+ "traffic_type" : "rfc2544_throughput",
+ },
+ },
+ },
]
diff --git a/core/pod_controller.py b/core/pod_controller.py
index e522b823..0e8e1b09 100644
--- a/core/pod_controller.py
+++ b/core/pod_controller.py
@@ -1,4 +1,4 @@
-# Copyright 2020 Spirent Communications
+# Copyright 2022 Spirent Communications, The Linux Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -44,12 +44,14 @@ class PodController():
self._pod_class = pod_class
self._deployment = deployment.lower()
self._pods = []
- if 'pcp' in self._deployment:
+ single_pods = ['pcp', 'c2c']
+ two_pods = ['pccp', 'c2c2c']
+ if any(item in self._deployment for item in single_pods):
pod_number = 1
- elif 'pccp'in self._deployment:
+ elif any(item in self._deployment for item in two_pods):
pod_number = 2
print("POD COUNTING DONE")
- settings.setValue('POD_COUNT', pod_number)
+ settings.setValue('POD_COUNT', pod_number)
# we will have single controller for all pods
if pod_number:
self._pods.append(pod_class())
diff --git a/docs/release/release-notes/release-notes.rst b/docs/release/release-notes/release-notes.rst
index 23bc0899..fd77a37a 100644
--- a/docs/release/release-notes/release-notes.rst
+++ b/docs/release/release-notes/release-notes.rst
@@ -3,6 +3,36 @@
.. (c) OPNFV, Intel Corporation, Spirent Communications, AT&T and others.
+Anuket Moselle Release
+======================
+
+* Supported Software Versions - DPDK:20.05, OVS:2.14.0, VPP:21.01, QEMU:3.1.1, Trex:2.86, PROX:Kali
+
+* Traffic Generator
+
+ * T-Rex bug-fix.
+
+* Kubernetes
+
+ * Support of East-West Traffic Performance Benchmarking.
+
+ * Dockerfiles for traffic-generators, and traffic forwarders.
+ * Pod deployment files.
+ * Example configurations - traffic generator, forwarder, and client.
+ * Detailed documentation.
+
+* Tools
+
+ * Stressor Tool for kubernetes environment is added.
+ * Cloud Information collection tool is added.
+
+* Miscellaneous
+
+ * For newer version of DPDK (based on meson build) and corresponding OVS version, OS-specific
+ installations and separate makefiles are added.
+ * Qemu Build fix.
+
+
Anuket Lakelse Release
======================
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Bidirectional Test with PROX.md b/docs/testing/user/userguide/east-west-benchmarking/Bidirectional Test with PROX.md
new file mode 100644
index 00000000..5f4e6f3a
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Bidirectional Test with PROX.md
@@ -0,0 +1,226 @@
+# Configure PROX for bidirectional traffic
+
+To configure PROX for bidirectional traffic starting from a unidirectional setup just modify the `parameters.lua` and the `prox.cfg` and then modify the vSwitch configuration to connect the interfaces also in the opposite direction.
+
+### Modify the `parameters.lua` file
+
+Duplicate these parameters:
+
+- `local_ip`
+- `local_hex_ip`
+- `local_hex_mac`
+- `gencores`
+- `latcores`
+
+Adjust the names to make them unique. The file now should look like this:
+
+```
+...
+local_ip1="192.168.30.11/24"
+local_hex_ip1=convertIPToHex(local_ip1)
+local_ip2="192.168.30.12/24"
+local_hex_ip2=convertIPToHex(local_ip2)
+...
+local_hex_mac1="de ad c3 52 79 9b"
+local_hex_mac2="02 09 c0 fd ba 1f"
+gencores1="15"
+gencores2="16"
+latcores1="17"
+latcores2="18"
+...
+```
+
+### Modify the `prox.cfg` file
+
+In this file duplicate the gencore and the latcore tasks adjust the tasks names and the variables names according to the ones in `parameters.lua` and then invert the ports number in the new tasks.
+
+After these changes, the result is below:
+
+```
+[core $gencores1]
+name=p0
+task=0
+mode=gen
+tx port=p0
+bps=1250000000
+pkt inline=${local_hex_mac2} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $gencores2]
+name=p1
+task=0
+mode=gen
+tx port=p1
+bps=1250000000
+pkt inline=${local_hex_mac1} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip2} ${local_hex_ip1} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $latcores1]
+name=lat1
+task=0
+mode=lat
+;sub mode=l3
+rx port=p1
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
+
+[core $latcores2]
+name=lat2
+task=0
+mode=lat
+;sub mode=l3
+rx port=p0
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
+```
+
+### Modify VPP
+
+To configure the opposite direction just copy the l2patches for the unidirectional traffic and invert the ports number:
+
+```
+vpp# show l2patch
+ memif1/0 -> memif3/0
+ memif4/0 -> memif2/0
+vpp# test l2patch rx memif2/0 tx memif4/0
+vpp# test l2patch rx memif3/0 tx memif1/0
+vpp# show l2patch
+ memif1/0 -> memif3/0
+ memif2/0 -> memif4/0
+ memif3/0 -> memif1/0
+ memif4/0 -> memif2/0
+```
+
+### Modify OvS-DPDK
+
+To configure the opposite direction just edit the `setup-flows.sh` copying the existing flows for the unidirectional traffic and invert the ports actions:
+
+``` bash
+udo ovs-ofctl --timeout 10 -O OpenFlow13 del-flows vsperf-br0
+sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=1,idle_timeout=0,action=output:3
+sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=4,idle_timeout=0,action=output:2
+sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=3,idle_timeout=0,action=output:1
+sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=2,idle_timeout=0,action=output:4
+```
+
+Run `sudo ./setup_flows.sh` and verify that the flows are correct by running `sudo ovs-ofctl dump-flows vsperf-br0`:
+
+``` bash
+[opnfv@worker utilities]$ sudo ovs-ofctl dump-flows vsperf-br0
+ cookie=0x0, duration=10.400s, table=0, n_packets=0, n_bytes=0, in_port=1 actions=output:3
+ cookie=0x0, duration=10.348s, table=0, n_packets=0, n_bytes=0, in_port=4 actions=output:2
+ cookie=0x0, duration=10.410s, table=0, n_packets=0, n_bytes=0, in_port=3 actions=output:1
+ cookie=0x0, duration=10.358s, table=0, n_packets=0, n_bytes=0, in_port=2 actions=output:4
+```
+
+### Configure rapid environment and files
+
+On Node 1 source the rapidenv and enter the rapid folder:
+
+```bash
+[opnfv@worker ~]$ source rapidenv/bin/activate
+(rapidenv) [opnfv@worker ~]$ cd rapid
+(rapidenv) [opnfv@worker rapid]$
+```
+
+Now we need to modify the `.env` , `.tst` files to run the `runrapid.py` script that do the tests.
+
+For the `topology-3.env`:
+
+```
+[rapid]
+loglevel = DEBUG
+version = 19.6.30
+total_number_of_machines = 1
+
+[M1]
+name = rapid-pod-1
+admin_ip = 10.244.1.157
+dp_ip1 = 192.168.30.11
+dp_mac1 = de:ad:c3:52:79:9b
+dp_ip2 = 192.168.30.12
+dp_mac2 = 02:09:c0:fd:ba:1f
+
+
+[ssh]
+key=rapid_rsa_key
+user = root
+
+[Varia]
+vim = Openstack
+stack = rapid
+```
+
+Before editing the `.tst` file, the new `prox.cfg` file should be copied under a folder in the same Node, in this case under `~/configs` and renamed as `prox-bi.cfg`.
+
+The `topology-3.tst`:
+
+```
+[TestParameters]
+name = Rapid_ETSINFV_TST009
+number_of_tests = 1
+total_number_of_test_machines = 1
+lat_percentile = 99
+
+[TestM1]
+name = Generator
+prox_launch_exit = false
+config_file = configs/prox-bi.cfg
+dest_vm = 1
+mcore = [14]
+gencores = [15,16]
+latcores = [17,18]
+
+[test1]
+test=TST009test
+warmupflowsize=128
+warmupimix=[64]
+warmupspeed=1
+warmuptime=2
+imixs=[[64],[128],[256],[512],[1024],[1280],[1512]]
+flows=[1]
+drop_rate_threshold = 0
+MAXr = 3
+MAXz = 5000
+MAXFramesPerSecondAllIngress = 12000000
+StepSize = 10000
+```
+
+### Running the tests
+
+Now that it's all configured, the test can be started form the rapid folder with the `runrapid.py` script, passing the two files as arguments:
+
+``` bash
+(rapidenv) [opnfv@worker rapid]$ python runrapid.py --env topology-3.env --test topology-3.tst --map machine.map --runtime 10 --screenlog DEBUG
+```
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-OvS-DPDK.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-OvS-DPDK.yaml
new file mode 100644
index 00000000..4d1532dd
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-OvS-DPDK.yaml
@@ -0,0 +1,68 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: userspace-rapid-pod-t1-p1
+ annotations:
+ k8s.v1.cni.cncf.io/networks: userspace-ovs-net
+spec:
+ containers:
+ - name: ovs-vhost
+ image: opnfv/rapid:latest
+ imagePullPolicy: Never
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ - mountPath: /usrspcni/
+ name: shared-dir
+ - mountPath: /opt/prox/
+ name: prox-dir
+ - mountPath: /dev/hugepages
+ name: hugepage
+ resources:
+ requests:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ limits:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ nodeSelector:
+ vswitch: ovs
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ - name: prox-dir
+ hostPath:
+ path: /opt/prox/
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-VPP.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-VPP.yaml
new file mode 100644
index 00000000..e9d26667
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-1-interface-VPP.yaml
@@ -0,0 +1,68 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: userspace-rapid-pod-t1-p1
+ annotations:
+ k8s.v1.cni.cncf.io/networks: userspace-vpp-net
+spec:
+ containers:
+ - name: vpp-vhost
+ image: opnfv/rapid:latest
+ imagePullPolicy: Never
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ - mountPath: /usrspcni/
+ name: shared-dir
+ - mountPath: /opt/prox/
+ name: prox-dir
+ - mountPath: /dev/hugepages
+ name: hugepage
+ resources:
+ requests:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ limits:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ nodeSelector:
+ vswitch: ovs
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ - name: prox-dir
+ hostPath:
+ path: /opt/prox/
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-OvS-DPDK.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-OvS-DPDK.yaml
new file mode 100644
index 00000000..fcae5981
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-OvS-DPDK.yaml
@@ -0,0 +1,68 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: userspace-rapid-pod-t1-p1
+ annotations:
+ k8s.v1.cni.cncf.io/networks: userspace-ovs-net, userspace-ovs-net
+spec:
+ containers:
+ - name: ovs-vhost
+ image: opnfv/rapid:latest
+ imagePullPolicy: Never
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ - mountPath: /usrspcni/
+ name: shared-dir
+ - mountPath: /opt/prox/
+ name: prox-dir
+ - mountPath: /dev/hugepages
+ name: hugepage
+ resources:
+ requests:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ limits:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ nodeSelector:
+ vswitch: ovs
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ - name: prox-dir
+ hostPath:
+ path: /opt/prox/
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml
new file mode 100644
index 00000000..a67106ab
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml
@@ -0,0 +1,68 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: userspace-rapid-pod-t1-p1
+ annotations:
+ k8s.v1.cni.cncf.io/networks: userspace-vpp-net, userspace-vpp-net
+spec:
+ containers:
+ - name: vpp-vhost
+ image: opnfv/rapid:latest
+ imagePullPolicy: Never
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ - mountPath: /usrspcni/
+ name: shared-dir
+ - mountPath: /opt/prox/
+ name: prox-dir
+ - mountPath: /dev/hugepages
+ name: hugepage
+ resources:
+ requests:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ limits:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ nodeSelector:
+ vswitch: ovs
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ - name: prox-dir
+ hostPath:
+ path: /opt/prox/
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/TRex-pod/userspace-trex-pod-2-interfaces-VPP.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/TRex-pod/userspace-trex-pod-2-interfaces-VPP.yaml
new file mode 100644
index 00000000..418d3ede
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/TRex-pod/userspace-trex-pod-2-interfaces-VPP.yaml
@@ -0,0 +1,64 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: userspace-trex-pod-t1-p1
+ annotations:
+ k8s.v1.cni.cncf.io/networks: userspace-vpp-net, userspace-vpp-net
+spec:
+ containers:
+ - name: vpp-vhost
+ image: trex:latest
+ imagePullPolicy: Never
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ - mountPath: /usrspcni/
+ name: shared-dir
+ - mountPath: /dev/hugepages
+ name: hugepage
+ resources:
+ requests:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ limits:
+ cpu: "6000m"
+ memory: "4000Mi"
+ hugepages-1Gi: 4Gi
+ nodeSelector:
+ vswitch: ovs
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-ovs-netAttach.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-ovs-netAttach.yaml
new file mode 100644
index 00000000..a2ee5ea8
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-ovs-netAttach.yaml
@@ -0,0 +1,47 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: "k8s.cni.cncf.io/v1"
+kind: NetworkAttachmentDefinition
+metadata:
+ name: userspace-ovs-net
+spec:
+ config: '{
+ "cniVersion": "0.3.1",
+ "type": "userspace",
+ "name": "userspace-ovs-net-1",
+ "kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig",
+ "logFile": "/var/log/userspace-ovs-net.log",
+ "logLevel": "debug",
+ "host": {
+ "engine": "ovs-dpdk",
+ "iftype": "vhostuser",
+ "netType": "bridge",
+ "vhost": {
+ "mode": "server"
+ },
+ "bridge": {
+ "bridgeName": "vsperf-br0"
+ }
+ },
+ "container": {
+ "engine": "ovs-dpdk",
+ "iftype": "vhostuser",
+ "netType": "interface",
+ "vhost": {
+ "mode": "client"
+ }
+ }
+ }'
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-vpp-netAttach-memif.yaml b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-vpp-netAttach-memif.yaml
new file mode 100644
index 00000000..3b199686
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Kubernetes/userspace-vpp-netAttach-memif.yaml
@@ -0,0 +1,46 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+apiVersion: "k8s.cni.cncf.io/v1"
+kind: NetworkAttachmentDefinition
+metadata:
+ name: userspace-vpp-net
+spec:
+ config: '{
+ "cniVersion": "0.3.1",
+ "type": "userspace",
+ "name": "userspace-vpp-net",
+ "kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig",
+ "logFile": "/var/log/userspace-vpp-net-1-cni.log",
+ "logLevel": "debug",
+ "host": {
+ "engine": "vpp",
+ "iftype": "memif",
+ "netType": "interface",
+ "memif": {
+ "role": "master",
+ "mode": "ethernet"
+ }
+ },
+ "container": {
+ "engine": "vpp",
+ "iftype": "memif",
+ "netType": "interface",
+ "memif": {
+ "role": "slave",
+ "mode": "ethernet"
+ }
+ }
+ }'
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/README.md b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/README.md
new file mode 100644
index 00000000..f6c1c8b5
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/README.md
@@ -0,0 +1,9 @@
+# PROX Configuration files
+
+In this folder there are all the files to configure a pod, with one or two interfaces running PROX, as a generator or a swap.
+
+The `eal` parameter in all `parameters.lua` files are configured for VPP and memif interfaces. To use OvS-DPDK and virtio-user interfaces replace that line with something like this:
+
+- One interface: `eal="--socket-mem=256,0 --vdev=virtio_user0,path=/usrspcni/563e4f024755-net1"`
+- Two interface: `eal="--socket-mem=256,0 --vdev=virtio_user0,path=/usrspcni/563e4f024755-net1 --vdev=virtio_user1,path=/usrspcni/563e4f024755-net2"`
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/parameters.lua
new file mode 100644
index 00000000..5e1481df
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/parameters.lua
@@ -0,0 +1,11 @@
+require "helper"
+name="Generator"
+local_ip1="192.168.30.11/24"
+local_hex_ip1=convertIPToHex(local_ip1)
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-8449692251a6-net1.sock,role=slave"
+mcore="14"
+local_hex_mac1="de ad c3 52 79 9b"
+gencores1="15"
+latcores1="16"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/prox.cfg
new file mode 100644
index 00000000..91838e5a
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_1-interface/unidirectional/prox.cfg
@@ -0,0 +1,61 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[variables]
+$mbs=8
+
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $gencores1]
+name=p0
+task=0
+mode=gen
+tx port=p0
+bps=1250000000
+pkt inline=${local_hex_mac2} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $latcores1]
+name=lat1
+task=0
+mode=lat
+;sub mode=l3
+rx port=p0
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/parameters.lua
new file mode 100644
index 00000000..adebdd1a
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/parameters.lua
@@ -0,0 +1,17 @@
+require "helper"
+name="Generator"
+local_ip1="192.168.30.11/24"
+local_hex_ip1=convertIPToHex(local_ip1)
+local_ip2="192.168.30.12/24"
+local_hex_ip2=convertIPToHex(local_ip2)
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-8449692251a6-net1.sock,role=slave --vdev=net_memif1,socket=/usrspcni/memif-8449692251a6-net2.sock,role=slave"
+mcore="14"
+local_hex_mac1="de ad c3 52 79 9b"
+local_hex_mac2="02 09 c0 fd ba 1f"
+gencores1="15"
+gencores2="16"
+latcores1="17"
+latcores2="18"
+latcores1="16"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/prox.cfg
new file mode 100644
index 00000000..cac15bc9
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/bidirectional/prox.cfg
@@ -0,0 +1,102 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[port 1]
+name=p1
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=rec_tap
+lsc=no
+
+[variables]
+$mbs=8
+
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $gencores1]
+name=p0
+task=0
+mode=gen
+tx port=p0
+bps=1250000000
+pkt inline=${local_hex_mac2} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $gencores2]
+name=p1
+task=0
+mode=gen
+tx port=p1
+bps=1250000000
+pkt inline=${local_hex_mac1} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip2} ${local_hex_ip1} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $latcores1]
+name=lat1
+task=0
+mode=lat
+;sub mode=l3
+rx port=p1
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
+
+[core $latcores2]
+name=lat2
+task=0
+mode=lat
+;sub mode=l3
+rx port=p0
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/parameters.lua
new file mode 100644
index 00000000..784b9ccc
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/parameters.lua
@@ -0,0 +1,11 @@
+require "helper"
+name="Generator"
+local_ip1="192.168.30.11/24"
+local_hex_ip1=convertIPToHex(local_ip1)
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-8449692251a6-net1.sock,role=slave --vdev=net_memif1,socket=/usrspcni/memif-8449692251a6-net2.sock,role=slave"
+mcore="14"
+local_hex_mac1="de ad c3 52 79 9b"
+gencores1="15"
+latcores1="16"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/prox.cfg
new file mode 100644
index 00000000..4520a26c
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/generator-pod_2-interfaces/unidirectional/prox.cfg
@@ -0,0 +1,69 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[port 1]
+name=p1
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=rec_tap
+lsc=no
+
+[variables]
+$mbs=8
+
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $gencores1]
+name=p0
+task=0
+mode=gen
+tx port=p0
+bps=1250000000
+pkt inline=${local_hex_mac2} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+pkt size=60
+min bulk size=$mbs
+max bulk size=16
+drop=yes
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+;arp update time=1
+
+[core $latcores1]
+name=lat1
+task=0
+mode=lat
+;sub mode=l3
+rx port=p1
+lat pos=42
+accuracy pos=46
+packet id pos=50
+signature=0x98765432
+signature pos=56
+accuracy limit nsec=1000000
+latency bucket size=${bucket_size_exp}
+;arp update time=1
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/parameters.lua
new file mode 100644
index 00000000..e9f707da
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/parameters.lua
@@ -0,0 +1,7 @@
+require "helper"
+name="Swap"
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-b42cff2335c2-net1.sock"
+mcore="14"
+swapone="17"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/prox.cfg
new file mode 100644
index 00000000..98d93bb9
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_1-interface/unidirectional/prox.cfg
@@ -0,0 +1,35 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[variables]
+$mbs=8
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $swapone]
+name=swap1
+task=0
+mode=swap
+rx port=p0
+tx port=p0
+drop=no
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/parameters.lua
new file mode 100644
index 00000000..0cf4c70e
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/parameters.lua
@@ -0,0 +1,8 @@
+require "helper"
+name="Swap"
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-b42cff2335c2-net1.sock --vdev=net_memif1,socket=/usrspcni/memif-b42cff2335c2-net2.sock"
+mcore="14"
+swapone="20"
+swaptwo="21"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/prox.cfg
new file mode 100644
index 00000000..db6a50ff
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/bidirectional/prox.cfg
@@ -0,0 +1,51 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[port 1]
+name=p1
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=rec_tap
+lsc=no
+
+[variables]
+$mbs=8
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $swapone]
+name=swap1
+task=0
+mode=swap
+rx port=p0
+tx port=p1
+drop=no
+
+[core $swaptwo]
+name=swap2
+task=0
+mode=swap
+rx port=p1
+tx port=p0
+drop=no
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/parameters.lua b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/parameters.lua
new file mode 100644
index 00000000..cd247ec4
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/parameters.lua
@@ -0,0 +1,7 @@
+require "helper"
+name="Swap"
+eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-b42cff2335c2-net1.sock --vdev=net_memif1,socket=/usrspcni/memif-b42cff2335c2-net2.sock"
+mcore="14"
+swapone="17"
+bucket_size_exp="11"
+heartbeat="60"
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/prox.cfg b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/prox.cfg
new file mode 100644
index 00000000..97662f74
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/PROX/swap-pod_2-interfaces/unidirectional/prox.cfg
@@ -0,0 +1,43 @@
+[lua]
+dofile("parameters.lua")
+
+[eal options]
+-n=4 ; force number of memory channels
+no-output=no ; disable DPDK debug output
+eal=--proc-type auto ${eal}
+
+[port 0]
+name=p0
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=gen_tap
+lsc=no
+
+[port 1]
+name=p1
+rx desc=2048
+tx desc=2048
+vlan=yes
+;vdev=rec_tap
+lsc=no
+
+[variables]
+$mbs=8
+[defaults]
+mempool size=8K
+
+[global]
+name=${name}
+heartbeat timeout=${heartbeat}
+
+[core $mcore]
+mode=master
+
+[core $swapone]
+name=swap1
+task=0
+mode=swap
+rx port=p0
+tx port=p1
+drop=no
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.env b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.env
new file mode 100644
index 00000000..8c59560f
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.env
@@ -0,0 +1,36 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+[rapid]
+loglevel = DEBUG
+version = 19.6.30
+total_number_of_machines = 1
+
+[M1]
+name = rapid-pod-1
+admin_ip = 10.244.1.157
+dp_ip1 = 192.168.30.11
+dp_mac1 = de:ad:c3:52:79:9b
+dp_ip2 = 192.168.30.12
+dp_mac2 = 02:09:c0:fd:ba:1f
+
+
+[ssh]
+key=rapid_rsa_key
+user = root
+
+[Varia]
+vim = Openstack
+stack = rapid
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.tst b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.tst
new file mode 100644
index 00000000..cf42ef52
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example-bidirectional.tst
@@ -0,0 +1,43 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+[TestParameters]
+name = Rapid_ETSINFV_TST009
+number_of_tests = 1
+total_number_of_test_machines = 1
+lat_percentile = 99
+
+[TestM1]
+name = Generator
+prox_launch_exit = false
+config_file = configs/prox-bi.cfg
+dest_vm = 1
+mcore = [14]
+gencores = [15,16]
+latcores = [17,18]
+
+[test1]
+test=TST009test
+warmupflowsize=128
+warmupimix=[64]
+warmupspeed=1
+warmuptime=2
+imixs=[[64],[128],[256],[512],[1024],[1280],[1512]]
+flows=[1]
+drop_rate_threshold = 0
+MAXr = 3
+MAXz = 5000
+MAXFramesPerSecondAllIngress = 12000000
+StepSize = 10000
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.env b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.env
new file mode 100644
index 00000000..be06dc82
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.env
@@ -0,0 +1,33 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+[rapid]
+loglevel = DEBUG
+version = 19.6.30
+total_number_of_machines = 1
+
+[M1]
+name = rapid-pod-1
+admin_ip = 10.244.1.157
+dp_ip = 192.168.1.4
+dp_mac = de:ad:c3:52:79:9b
+
+[ssh]
+key=rapid_rsa_key
+user = root
+
+[Varia]
+vim = Openstack
+stack = rapid
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.tst b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.tst
new file mode 100644
index 00000000..57575bf6
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/Rapid/example.tst
@@ -0,0 +1,43 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+[TestParameters]
+name = Rapid_ETSINFV_TST009
+number_of_tests = 1
+total_number_of_test_machines = 1
+lat_percentile = 99
+
+[TestM1]
+name = Generator
+prox_launch_exit = false
+config_file = configs/prox.cfg
+dest_vm = 1
+mcore = [14]
+gencores = [15]
+latcores = [16]
+
+[test1]
+test=TST009test
+warmupflowsize=128
+warmupimix=[64]
+warmupspeed=1
+warmuptime=2
+imixs=[[64],[128],[256],[512],[1024],[1280],[1512]]
+flows=[1]
+drop_rate_threshold = 0
+MAXr = 3
+MAXz = 5000
+MAXFramesPerSecondAllIngress = 12000000
+StepSize = 10000
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Configurations/TRex/vsperf-trex.conf b/docs/testing/user/userguide/east-west-benchmarking/Configurations/TRex/vsperf-trex.conf
new file mode 100644
index 00000000..f69d5b89
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Configurations/TRex/vsperf-trex.conf
@@ -0,0 +1,36 @@
+# Copyright 2022 Anuket, Intel Corporation, and The Linux Foundation
+#
+# 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.
+#
+
+VSWITCH_BRIDGE_NAME = 'vsperf-br0'
+WHITELIST_NICS = ['06:00.0', '06:00.1']
+TRAFFICGEN = 'Trex'
+TRAFFICGEN_TREX_HOST_IP_ADDR = '10.244.1.187'
+TRAFFICGEN_TREX_USER = 'root'
+TRAFFICGEN_TREX_BASE_DIR = '/root/v2.86/'
+TRAFFICGEN_TREX_LINE_SPEED_GBPS = '10'
+TRAFFICGEN_TREX_PORT1 = '0000:02:00.0'
+TRAFFICGEN_TREX_PORT2 = '0000:02:00.1'
+TRAFFICGEN_TREX_PROMISCUOUS = False
+TRAFFICGEN_DURATION=10
+TRAFFICGEN_LOSSRATE=0
+TRAFFICGEN_RFC2544_TESTS=10
+#TRAFFICGEN_PKT_SIZES=(64,128,256,512,1024,1280,1518)
+GUEST_TESTPMD_FWD_MODE = ['io']
+GUEST_IMAGE = ['/home/opnfv/old/vnfs/vloop-vnf-ubuntu-18.04_20180920.qcow2']
+TRAFFICGEN_TREX_LATENCY_PPS = 1000
+TRAFFICGEN_TREX_FORCE_PORT_SPEED = True
+TRAFFICGEN_TREX_PORT_SPEED = 10000 # 10 Gbps
+TRAFFICGEN_TREX_RFC2544_BINARY_SEARCH_LOSS_VERIFICATION = False
+TRAFFICGEN_TREX_RFC2544_MAX_REPEAT = 3 \ No newline at end of file
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Limitations.md b/docs/testing/user/userguide/east-west-benchmarking/Limitations.md
new file mode 100644
index 00000000..758654cd
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Limitations.md
@@ -0,0 +1,10 @@
+# Limitations
+
+There are some limitations due to the different tools used:
+- TRex
+ - Does not support virtio driver for vhost-user interfaces needed by OvS-DPDK.
+ - Does not support single interface configuration (dummy interfaces) with memif.
+- PROX
+ - In this envirorment it does not support multiple core assignement for a single task.
+- Memif
+ - Configuration can be changed only by modifying the source code of Userspace CNI. \ No newline at end of file
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Requirements.md b/docs/testing/user/userguide/east-west-benchmarking/Requirements.md
new file mode 100644
index 00000000..7450ec32
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Requirements.md
@@ -0,0 +1,116 @@
+# Requirements for the tests
+
+Some requirements are needed to run the test in the five topologies and these involve CPU, Memory, shared folders, etc...
+
+### CPU
+
+The CPUs assigned to a Pod can't be assigned to other Pods: the allocation is exclusive.
+
+### Shared Folders
+
+For TRex and PROX pods it's necessary to include some volumes in their pod definition file (examples of these files are under the [Kubernetes configuration](./Configurations/Kubernetes)) that provide:
+
+- Annotations and metadata: Pod's details (e.g. memif/vhost socket file name)
+
+ ```yaml
+ ...
+ spec:
+ containers:
+ ...
+ volumeMounts:
+ - mountPath: /etc/podnetinfo
+ name: podinfo
+ readOnly: false
+ ...
+ volumes:
+ - name: podinfo
+ downwardAPI:
+ items:
+ - path: "labels"
+ fieldRef:
+ fieldPath: metadata.labels
+ - path: "annotations"
+ fieldRef:
+ fieldPath: metadata.annotations
+ ...
+ ```
+
+- Socket files for memif and vhost interfaces: (directory with some socket files for memif/vhost interfaces). It's shared between pods.
+
+ ```yaml
+ ...
+ spec:
+ containers:
+ ...
+ volumeMounts:
+ ...
+ - mountPath: /usrspcni/
+ name: shared-dir
+ ...
+ volumes:
+ ...
+ - name: shared-dir
+ hostPath:
+ path: /var/lib/cni/usrspcni/data/
+ ...
+ ```
+
+
+
+- Hugepages:
+
+ ```yaml
+ ...
+ spec:
+ containers:
+ ...
+ volumeMounts:
+ ...
+ - mountPath: /dev/hugepages
+ name: hugepage
+ ...
+ volumes:
+ ...
+ - name: hugepage
+ emptyDir:
+ medium: HugePages
+ ...
+ ```
+
+
+
+And only for PROX:
+
+- directory with the PROX configuration files: Directory that contains `parameters.lua` and `prox.cfg` files. It's shared between pods.
+
+ ```yaml
+ ...
+ spec:
+ containers:
+ ...
+ volumeMounts:
+ ...
+ - mountPath: /opt/prox/
+ name: prox-dir
+ ...
+ volumes:
+ ...
+ - name: prox-dir
+ hostPath:
+ path: /opt/prox/
+ ...
+ ```
+
+ There are two variants of this directory: one for generator pod and the other for swap pods. The configuration files are more coherent with the role of the pod.
+
+ - Genreator pod: `/opt/proxgen`
+ - Swap pods: `/opt/proxswap`
+
+### CNIs
+
+The first CNI that is needed is Multus. This CNI allow to assign more than a single interface to the Pod.
+The choice of the CNIs that can be used for these additional interfaces is limited by the fact that the networking is in user space, so Userspace CNI should be used.
+
+### vSwitches
+
+As the Userspace CNI is used, the only virtual swithces that are supported are: OvS-DPDK and VPP. \ No newline at end of file
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and OVS.md b/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and OVS.md
new file mode 100644
index 00000000..cdf7ca32
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and OVS.md
@@ -0,0 +1,372 @@
+# ETSI GS NFV-TST 009 Testing with PROX and OvS-DPDK in a Kubernetes Cluster
+
+This document shows an example of testing the dataplane in the third topology represented in the [topologies description](Topologies.md) with two pods equipped with two interfaces each that are bounded to OvS-DPDK, using PROX as traffic generator. The `userspace-rapid-pod-t3-p1.yaml` and the `userspace-rapid-pod-t3-p2.yaml` files can be created by modifying the [Rapid pod definition file](./Configuration/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-OvS-DPDK.yaml).
+
+### Prepare OvS-DPDK and deploy the kubernetes components
+
+- On Node 1:
+ - source vsperfenv/bin/activate
+ 2. cd vineperf.
+
+ 3. ./vsperf --conf-file ~/conf/vsperf-master.conf --mode trafficgen-off phy2phy_tput - Leave this window untouched.
+- On Node 2 **(After previous steps)**:
+ - Deploy network attachment `userspace-ovs-netAttach.yaml`
+ - Deploy pods applying `userspace-rapid-pod-t3-p1.yaml` and `userspace-rapid-pod-t3-p2.yaml`
+
+### Configure PROX inside the pods
+
+- Generator Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-rapid-pod-t3-p1 -- /bin/bash`
+
+ - copy the prox folder (it is shared between pods) to make changes on configuration files: `cp -r /opt/prox /opt/proxgen`
+
+ - search for the two memif socketfile names running :
+
+ ```
+ [root@userspace-rapid-pod-t3-p1 /]# cat /etc/podnetinfo/annotations | grep socketfile
+ userspace/configuration-data="[{\n \"containerId\": \"87042916ab4dac68611ea9d2f02bcf26bc82b5d17716ffa9ebff1cf36af1fca3\",\n \"ifName\": \"net1\",\n \"name\": \"userspace-ovs-net-1\",\n \"config\": {\n \"engine\": \"ovs-dpdk\",\n \"iftype\": \"vhostuser\",\n \"netType\": \"interface\",\n \"memif\": {},\n \"vhost\": {\n \"mode\": \"client\",\n \"socketfile\": \"87042916ab4d-net1\"\n },\n \"bridge\": {}\n },\n \"ipResult\": {\n \"interfaces\": [\n {\n \"name\": \"net1\",\n \"sandbox\": \"/proc/2910/ns/net\"\n }\n ],\n \"dns\": {}\n }\n},{\n \"containerId\": \"87042916ab4dac68611ea9d2f02bcf26bc82b5d17716ffa9ebff1cf36af1fca3\",\n \"ifName\": \"net2\",\n \"name\": \"userspace-ovs-net-1\",\n \"config\": {\n \"engine\": \"ovs-dpdk\",\n \"iftype\": \"vhostuser\",\n \"netType\": \"interface\",\n \"memif\": {},\n \"vhost\": {\n \"mode\": \"client\",\n \"socketfile\": \"87042916ab4d-net2\"\n },\n \"bridge\": {}\n },\n \"ipResult\": {\n \"interfaces\": [\n {\n \"name\": \"net2\",\n \"sandbox\": \"/proc/2910/ns/net\"\n }\n ],\n \"dns\": {}\n }\n}]"
+ ```
+
+
+
+ - copy the names `*-net1` and `*-net2`
+
+ - edit the `parameters.lua` changing the socketfile name and set the CPUs number for the main core, generator cores and latency cores:
+
+ ```lua
+ ...
+ eal="--socket-mem=256,0 --vdev=virtio_user0,path=/usrspcni/87042916ab4d-net1 --vdev=virtio_user1,path=/usrspcni/87042916ab4d-net2"
+ mcore="14"
+ ...
+ gencores="15"
+ latcores="16"
+ ...
+
+ ```
+
+ - edit `prox.cfg` to configure the tasks properly for generating and receiving packets:
+
+ ```
+ [lua]
+ dofile("parameters.lua")
+
+ [eal options]
+ -n=4 ; force number of memory channels
+ no-output=no ; disable DPDK debug output
+ eal=--proc-type auto ${eal}
+
+ [port 0]
+ name=p0
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [port 1]
+ name=p1
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [variables]
+ $mbs=8
+
+ [defaults]
+ mempool size=8K
+
+ [global]
+ name=${name}
+ heartbeat timeout=${heartbeat}
+
+ [core $mcore]
+ mode=master
+
+ [core $gencores]
+ name=p0
+ task=0
+ mode=gen
+ tx port=p0
+ bps=1250000000
+ pkt inline=${dest_hex_mac1} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+ pkt size=60
+ min bulk size=$mbs
+ max bulk size=16
+ drop=yes
+ lat pos=42
+ accuracy pos=46
+ packet id pos=50
+ signature=0x98765432
+ signature pos=56
+
+ [core $latcores]
+ name=lat
+ task=0
+ mode=lat
+ rx port=p1
+ lat pos=42
+ accuracy pos=46
+ packet id pos=50
+ signature=0x98765432
+ signature pos=56
+ accuracy limit nsec=1000000
+ latency bucket size=${bucket_size_exp}
+ ```
+
+ - Enter rapid folder and start PROX:
+
+ ```
+ [root@userspace-rapid-pod-t3-p1 /]# cd /opt/rapid/
+ [root@userspace-rapid-pod-t3-p1 rapid]# ./prox -f ../proxgen/prox.cfg -et
+ ```
+
+ ```
+ Usage: ./prox [-f CONFIG_FILE] [-a|-e] [-m|-s|-i] [-w DEF] [-u] [-t]
+ -f CONFIG_FILE : configuration file to load, ./prox.cfg by default
+ -e : don't autostart
+ -t : Listen on TCP port 8474
+ ```
+
+ ![prox-vpp-screen](./images/prox-vpp-screen.png)
+
+- Swap Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-rapid-pod-t3-p2 -- /bin/bash`
+
+ - copy the prox folder (it is shared between pods) to make changes on configuration files: `cp -r /opt/prox /opt/proxswap`
+
+ - search for the two virtio socketfile names like for the Generator Pod and copy the names `*-net1` and `*-net2`
+
+ - edit the `parameters.lua` changing the socketfile name and set the CPUs number for the main core (same as Generator Pod) and the swap cores:
+
+ ```lua
+ ...
+ swapone="17"
+ ...
+
+ ```
+
+ - edit `prox.cfg` to configure the tasks properly for swapping:
+
+ ```
+ [lua]
+ dofile("parameters.lua")
+
+ [eal options]
+ -n=4 ; force number of memory channels
+ no-output=no ; disable DPDK debug output
+ eal=--proc-type auto ${eal}
+
+ [port 0]
+ name=p0
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [port 1]
+ name=p1
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [variables]
+ $mbs=8
+
+ [defaults]
+ mempool size=8K
+
+ [global]
+ name=${name}
+ heartbeat timeout=${heartbeat}
+
+ [core $mcore]
+ mode=master
+
+ [core $swapone]
+ name=swap1
+ task=0
+ mode=swap
+ rx port=p0
+ tx port=p1
+ drop=no
+ ```
+
+ - Enter rapid folder and start PROX:
+
+ ```
+ [root@userspace-rapid-pod-t3-p2 /]# cd /opt/rapid/
+ [root@userspace-rapid-pod-t3-p2 rapid]# ./prox -f ../proxgen/prox.cfg
+ ```
+
+ ![prox-vpp-screen-swap](./images/prox-vpp-screen-swap.png)
+
+### Configure OVS-DPDK
+
+The default configuration is under `vineperf/conf/02_vswitch.conf`. Then it's necessary to configure the connections between the interfaces
+
+- Go to the utilities folder `cd /home/opnfv/vineperf/src/ovs/ovs/utilities`
+
+- Run `sudo ovs-vsctl -- --columns=name,ofport list Interface` : Note down the port numbers (`ofport`) mapping to the vhost interfaces.
+
+ ```
+ [opnfv@worker utilities]$ sudo ovs-vsctl -- --columns=name,ofport list Interface
+ name : "dpdk1"
+ ofport : -1
+
+ name : "87042916ab4d-net1"
+ ofport : 1
+
+ name : "dpdk0"
+ ofport : -1
+
+ name : "vsperf-br0"
+ ofport : 65534
+
+ name : "2d63b16eb7ac-net2"
+ ofport : 4
+
+ name : "87042916ab4d-net2"
+ ofport : 2
+
+ name : "2d63b16eb7ac-net1"
+ ofport : 3
+ ```
+
+ In this case `ofport` for the first pod are 1 and 2 and for the second are 3 and 4.
+
+- Open `setup_flows.sh` file. Modify the `in_port=<>` and `action=output:<>` values to connect the interfaces:
+
+ ``` bash
+ sudo ovs-ofctl --timeout 10 -O OpenFlow13 del-flows vsperf-br0
+ sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=1,idle_timeout=0,action=output:3
+ sudo ovs-ofctl --timeout 10 -O Openflow13 add-flow vsperf-br0 in_port=4,idle_timeout=0,action=output:2
+ ```
+
+
+
+- Run `sudo ./setup_flows.sh`
+
+- Verify that the flows are correct by running `sudo ovs-ofctl dump-flows vsperf-br0`:
+
+ ``` bash
+ [opnfv@worker utilities]$ sudo ovs-ofctl dump-flows vsperf-br0
+ cookie=0x0, duration=10.400s, table=0, n_packets=0, n_bytes=0, in_port=1 actions=output:3
+ cookie=0x0, duration=10.348s, table=0, n_packets=0, n_bytes=0, in_port=4 actions=output:2
+ ```
+
+
+
+### Configure rapid environment and files
+
+On Node 1 the environment and the file for running rapid should be set-up.
+
+Source the rapidenv and enter the rapid folder:
+
+```bash
+[opnfv@worker ~]$ source rapidenv/bin/activate
+(rapidenv) [opnfv@worker ~]$ cd rapid
+(rapidenv) [opnfv@worker rapid]$
+```
+
+Now we need `.env` , `.tst` and `machine.map` files to run the `runrapid.py` script that do the tests.
+
+Before creating theese files the IP of the generator pod is needed. On Node 1 run this command:
+
+``` bash
+[opnfv@master ~]$ kubectl get pods -o wide
+NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
+userspace-rapid-pod-t3-p1 1/1 Running 0 69m 10.244.1.157 worker <none> <none>
+userspace-rapid-pod-t3-p2 1/1 Running 0 69m 10.244.1.158 worker <none> <none>
+```
+
+For the `topology-3.env`:
+
+```
+[rapid]
+loglevel = DEBUG
+version = 19.6.30
+total_number_of_machines = 1
+
+[M1]
+name = rapid-pod-1
+admin_ip = 10.244.1.157
+dp_ip = 192.168.1.4
+dp_mac = de:ad:c3:52:79:9b
+
+
+[ssh]
+key=rapid_rsa_key
+user = root
+
+[Varia]
+vim = Openstack
+stack = rapid
+```
+
+Before the `.tst` file, the `prox.cfg` file should be copied under a folder in the same Node, in this case under `~/configs`.
+
+The `topology-3.tst`:
+
+```
+[TestParameters]
+name = Rapid_ETSINFV_TST009
+number_of_tests = 1
+total_number_of_test_machines = 1
+lat_percentile = 99
+
+[TestM1]
+name = Generator
+prox_launch_exit = false
+config_file = configs/prox.cfg
+dest_vm = 1
+mcore = [14]
+gencores = [15]
+latcores = [16]
+
+[test1]
+test=TST009test
+warmupflowsize=128
+warmupimix=[64]
+warmupspeed=1
+warmuptime=2
+imixs=[[64],[128],[256],[512],[1024],[1280],[1512]]
+flows=[1]
+drop_rate_threshold = 0
+MAXr = 3
+MAXz = 5000
+MAXFramesPerSecondAllIngress = 12000000
+StepSize = 10000
+```
+
+For `machine.map`:
+
+```
+[DEFAULT]
+machine_index=0
+
+[TestM1]
+machine_index=1
+
+[TestM2]
+machine_index=2
+
+[TestM3]
+machine_index=3
+
+[TestM4]
+machine_index=4
+```
+
+
+
+### Running the tests
+
+Now that it's all configured, the test can be started form the rapid folder with the `runrapid.py` script, passing the two files as arguments:
+
+``` bash
+(rapidenv) [opnfv@worker rapid]$ python runrapid.py --env topology-3.env --test topology-3.tst --map machine.map --runtime 10 --screenlog DEBUG
+```
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and VPP.md b/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and VPP.md
new file mode 100644
index 00000000..21426ab2
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Test with PROX and VPP.md
@@ -0,0 +1,375 @@
+# ETSI GS NFV-TST 009 Testing with PROX and VPP in a Kubernetes Cluster
+
+This document shows an example of testing the dataplane in the third topology represented in the [topologies description](Topologies.md) with two pods equipped with two interfaces each that are bounded to VPP, using PROX as traffic generator. The `userspace-rapid-pod-t3-p1.yaml` and the `userspace-rapid-pod-t3-p2.yaml` files can be created by modifying the [Rapid pod definition file](./Configuration/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml).
+
+### Prepare VPP and deploy the kubernetes components
+
+- On Node 1:
+ - Start `vpp.service` with `startup.conf` file under `/etc/vpp`
+- On Node 2:
+ - Deploy network attachment `userspace-vpp-netAttach-memif.yaml`
+ - Deploy pods applying `userspace-rapid-pod-t3-p1.yaml` and `userspace-rapid-pod-t3-p2.yaml`
+
+### Configure PROX inside the pods
+
+- Generator Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-rapid-pod-t3-p1 -- /bin/bash`
+
+ - copy the prox folder (it is shared between pods) to make changes on configuration files: `cp -r /opt/prox /opt/proxgen`
+
+ - search for the two memif socketfile names running :
+
+ ```
+ [root@userspace-rapid-pod-t3-p1 /]# cat /etc/podnetinfo/annotations | grep socketfile
+ userspace/configuration-data="[{\n \"containerId\": \"d3810ce7d4dee8f4cbcbfb7f3a53b86fd33481db282446b07dcb1bf4f1d7fa49\",\n \
+
+ "ifName\": \"net1\",\n \"name\": \"userspace-vpp-net\",\n \"config\": {\n \"engine\": \"vpp\",\n \"iftype\": \"
+
+ memif\",\n \"netType\": \"interface\",\n \"memif\": {\n \"role\": \"slave\",\n \"mode\": \"ethe
+
+ rnet\",\n \"**socketfile**\": \"memif-d3810ce7d4de-net1.sock\"\n },\n \"vhost\": {},\n \"bridge\": {}\n
+
+ ​ },\n \"ipResult\": {\n \"interfaces\": [\n {\n \"name\": \"net1\",\n \"sandb
+
+ ox\": \"/proc/17603/ns/net\"\n }\n ],\n \"dns\": {}\n }\n},{\n \"containerId\": \"d3810ce7d4dee8f4cb
+
+ cbfb7f3a53b86fd33481db282446b07dcb1bf4f1d7fa49\",\n \"ifName\": \"net2\",\n \"name\": \"userspace-vpp-net\",\n \"config\":
+
+ {\n \"engine\": \"vpp\",\n \"iftype\": \"memif\",\n \"netType\": \"interface\",\n \"memif\": {\n
+
+ ​ \"role\": \"slave\",\n \"mode\": \"ethernet\",\n \"**socketfile**\": \"memif-d3810ce7d4de-net2.sock\"\n
+
+ ​ },\n \"vhost\": {},\n \"bridge\": {}\n },\n \"ipResult\": {\n \"interfaces\": [\n {\n
+
+ ​ \"name\": \"net2\",\n \"sandbox\": \"/proc/17603/ns/net\"\n }\n ],\n \"dns\": {
+
+ }\n }\n}]"
+ ```
+
+
+
+ - copy the names `memif-*-net1.sock` and `memif-*-net2.sock`
+
+ - edit the `parameters.lua` changing the socketfile name and set the CPUs number for the main core, generator cores and latency cores:
+
+ ```lua
+ ...
+ eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-d3810ce7d4de-net1.sock --vdev=net_memif1,socket=/usrspcni/memif-d3810ce7d4de-net2.sock"
+ mcore="14"
+ ...
+ gencores="15"
+ latcores="16"
+ ...
+
+ ```
+
+ - edit `prox.cfg` to configure the tasks properly for generating and receiving packets:
+
+ ```
+ [lua]
+ dofile("parameters.lua")
+
+ [eal options]
+ -n=4 ; force number of memory channels
+ no-output=no ; disable DPDK debug output
+ eal=--proc-type auto ${eal}
+
+ [port 0]
+ name=p0
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [port 1]
+ name=p1
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [variables]
+ $mbs=8
+
+ [defaults]
+ mempool size=8K
+
+ [global]
+ name=${name}
+ heartbeat timeout=${heartbeat}
+
+ [core $mcore]
+ mode=master
+
+ [core $gencores]
+ name=p0
+ task=0
+ mode=gen
+ tx port=p0
+ bps=1250000000
+ pkt inline=${dest_hex_mac1} 00 00 00 00 00 00 08 00 45 00 00 2e 00 01 00 00 40 11 f7 7d ${local_hex_ip1} ${local_hex_ip2} 0b b8 0b b9 00 1a 55 7b
+ pkt size=60
+ min bulk size=$mbs
+ max bulk size=16
+ drop=yes
+ lat pos=42
+ accuracy pos=46
+ packet id pos=50
+ signature=0x98765432
+ signature pos=56
+
+ [core $latcores]
+ name=lat
+ task=0
+ mode=lat
+ rx port=p1
+ lat pos=42
+ accuracy pos=46
+ packet id pos=50
+ signature=0x98765432
+ signature pos=56
+ accuracy limit nsec=1000000
+ latency bucket size=${bucket_size_exp}
+ ```
+
+ - Enter rapid folder and start PROX:
+
+ ```
+ [root@userspace-rapid-pod-t3-p1 /]# cd /opt/rapid/
+ [root@userspace-rapid-pod-t3-p1 rapid]# ./prox -f ../proxgen/prox.cfg -et
+ ```
+
+ ```
+ Usage: ./prox [-f CONFIG_FILE] [-a|-e] [-m|-s|-i] [-w DEF] [-u] [-t]
+ -f CONFIG_FILE : configuration file to load, ./prox.cfg by default
+ -e : don't autostart
+ -t : Listen on TCP port 8474
+ ```
+
+ ![prox-vpp-screen](./images/prox-vpp-screen.png)
+
+- Swap Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-rapid-pod-t3-p2 -- /bin/bash`
+ - copy the prox folder (it is shared between pods) to make changes on configuration files: `cp -r /opt/prox /opt/proxswap`
+ - search for the two memif socketfile names like for the Generator Pod and copy the names `memif-*-net1.sock` and `memif-*-net2.sock`
+
+ - edit the `parameters.lua` changing the socketfile name and set the CPUs number for the main core (same as Generator Pod) and the swap cores:
+
+ ```lua
+ ...
+ swapone="17"
+ ...
+
+ ```
+
+ - edit `prox.cfg` to configure the tasks properly for swapping:
+
+ ```
+ [lua]
+ dofile("parameters.lua")
+
+ [eal options]
+ -n=4 ; force number of memory channels
+ no-output=no ; disable DPDK debug output
+ eal=--proc-type auto ${eal}
+
+ [port 0]
+ name=p0
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [port 1]
+ name=p1
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [variables]
+ $mbs=8
+
+ [defaults]
+ mempool size=8K
+
+ [global]
+ name=${name}
+ heartbeat timeout=${heartbeat}
+
+ [core $mcore]
+ mode=master
+
+ [core $swapone]
+ name=swap1
+ task=0
+ mode=swap
+ rx port=p0
+ tx port=p1
+ drop=no
+ ```
+
+ - Enter rapid folder and start PROX:
+
+ ```
+ [root@userspace-rapid-pod-t3-p2 /]# cd /opt/rapid/
+ [root@userspace-rapid-pod-t3-p2 rapid]# ./prox -f ../proxgen/prox.cfg
+ ```
+
+ ![prox-vpp-screen-swap](./images/prox-vpp-screen-swap.png)
+
+### Configure VPP
+
+On Node 1 VPP should be configured to send the traffic between memif interfaces with `l2patch`:
+
+```
+[opnfv@worker ~]$ sudo vppctl
+ _______ _ _ _____ ___
+ __/ __/ _ \ (_)__ | | / / _ \/ _ \
+ _/ _// // / / / _ \ | |/ / ___/ ___/
+ /_/ /____(_)_/\___/ |___/_/ /_/
+
+vpp# show interface
+ Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
+local0 0 down 0/0/0/0
+memif1/0 1 up 9000/0/0/0
+memif2/0 2 up 9000/0/0/0
+memif3/0 3 up 9000/0/0/0
+memif4/0 4 up 9000/0/0/0
+vpp# show l2patch
+no l2patch entries
+vpp# test l2patch rx memif1/0 tx memif3/0
+vpp# test l2patch rx memif4/0 tx memif2/0
+vpp# show l2patch
+ memif1/0 -> memif3/0
+ memif4/0 -> memif2/0
+```
+
+To check the socketfiles of the showed memif for the patch configuration run:
+
+```
+vpp# show memif
+sockets
+ id listener filename
+ 2 yes (1) /var/lib/cni/usrspcni/data/memif-d3810ce7d4de-net2.sock
+ 4 yes (1) /var/lib/cni/usrspcni/data/memif-ab82066a8020-net2.sock
+ 3 yes (1) /var/lib/cni/usrspcni/data/memif-ab82066a8020-net1.sock
+ 0 no /run/vpp/memif.sock
+ 1 yes (1) /var/lib/cni/usrspcni/data/memif-d3810ce7d4de-net1.sock
+
+...
+```
+
+### Configure rapid environment and files
+
+On Node 1 the environment and the file for running rapid should be set-up.
+
+Source the rapidenv and enter the rapid folder:
+
+```bash
+[opnfv@worker ~]$ source rapidenv/bin/activate
+(rapidenv) [opnfv@worker ~]$ cd rapid
+(rapidenv) [opnfv@worker rapid]$
+```
+
+Now we need `.env` , `.tst` and `machine.map` files to run the `runrapid.py` script that do the tests.
+
+Before creating theese files the IP of the generator pod is needed. On Node 1 run this command:
+
+```bash
+[opnfv@master ~]$ kubectl get pods -o wide
+NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
+userspace-rapid-pod-t3-p1 1/1 Running 0 69m 10.244.1.157 worker <none> <none>
+userspace-rapid-pod-t3-p2 1/1 Running 0 69m 10.244.1.158 worker <none> <none>
+```
+
+For the `topology-3.env`:
+
+```
+[rapid]
+loglevel = DEBUG
+version = 19.6.30
+total_number_of_machines = 1
+
+[M1]
+name = rapid-pod-1
+admin_ip = 10.244.1.157
+dp_ip = 192.168.1.4
+dp_mac = de:ad:c3:52:79:9b
+
+
+[ssh]
+key=rapid_rsa_key
+user = root
+
+[Varia]
+vim = Openstack
+stack = rapid
+```
+
+Before the `.tst` file, the `prox.cfg` file should be copied under a folder in the same Node, in this case under `~/configs`.
+
+The `topology-3.tst`:
+
+```
+[TestParameters]
+name = Rapid_ETSINFV_TST009
+number_of_tests = 1
+total_number_of_test_machines = 1
+lat_percentile = 99
+
+[TestM1]
+name = Generator
+prox_launch_exit = false
+config_file = configs/prox.cfg
+dest_vm = 1
+mcore = [14]
+gencores = [15]
+latcores = [16]
+
+[test1]
+test=TST009test
+warmupflowsize=128
+warmupimix=[64]
+warmupspeed=1
+warmuptime=2
+imixs=[[64],[128],[256],[512],[1024],[1280],[1512]]
+flows=[1]
+drop_rate_threshold = 0
+MAXr = 3
+MAXz = 5000
+MAXFramesPerSecondAllIngress = 12000000
+StepSize = 10000
+```
+
+For `machine.map`:
+
+```
+[DEFAULT]
+machine_index=0
+
+[TestM1]
+machine_index=1
+
+[TestM2]
+machine_index=2
+
+[TestM3]
+machine_index=3
+
+[TestM4]
+machine_index=4
+```
+
+
+
+### Running the tests
+
+Now that it's all configured, the test can be started form the rapid folder with the `runrapid.py` script, passing the two files as arguments:
+
+``` bash
+(rapidenv) [opnfv@worker rapid]$ python runrapid.py --env topology-3.env --test topology-3.tst --map machine.map --runtime 10 --screenlog DEBUG
+```
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Test with TRex and VPP.md b/docs/testing/user/userguide/east-west-benchmarking/Test with TRex and VPP.md
new file mode 100644
index 00000000..b1878b39
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Test with TRex and VPP.md
@@ -0,0 +1,228 @@
+# ETSI GS NFV-TST 009 Testing with TRex and VPP in a Kubernetes Cluster
+
+This document shows an example of testing the dataplane in the third topology represented in the [topologies description](Topologies.md) with two pods equipped with two interfaces each that are bounded to VPP, using TRex as traffic generator. The `userspace-trex-pod-t3-p1.yaml` file can be created by modifying the [TRex pod definition file](./Configuration/Kubernetes/TRex-pod/userspace-trex-pod-2-interfaces-VPP.yaml) and for `userspace-rapid-pod-t3-p2.yaml` file use the [Rapid pod definition file](./Configuration/Kubernetes/Rapid-pod/userspace-rapid-pod-2-interfaces-VPP.yaml).
+
+### Prepare VPP and deploy the Kubernetes components
+
+- On Node 1:
+ - Start `vpp.service` with `startup.conf` file under `/etc/vpp`
+- On Node 2:
+ - Deploy network attachment `userspace-vpp-netAttach-memif.yaml`
+ - Deploy pods applying `userspace-trex-pod-t3-p1.yaml` and `userspace-rapid-pod-t3-p2.yaml`
+
+### Configure TRex inside the pods
+
+- Generator Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-trex-pod-t3-p1 -- /bin/bash`
+
+ - Run the script `vppconf.py` that generates the TRex configuration file:
+
+ ```
+ [root@userspace-trex-pod-t3-p1 ~]# python3 vppconf.py
+ Type=Memif Role=slave Mode=ethernet Path=/usrspcni/memif-e80434cd91fc-net1.sock
+ Type=Memif Role=slave Mode=ethernet Path=/usrspcni/memif-e80434cd91fc-net2.sock
+ ```
+
+ - Edit the configuration file `/etc/trex_cfg.yaml` to set the slave mode for the memif interface :
+
+ ```
+ ...
+ interfaces : ["--vdev=net_memif0,socket=/usrspcni/memif-e80434cd91fc-net1.sock,role=slave", "--vdev=net_memif1,socket=/usrspcni/memif-e80434cd91fc-net2.sock,role=slave"] # list of the interfaces
+ ...
+ ```
+
+ - Go in the TRex folder and start it:
+
+ ```
+ [root@userspace-trex-pod-t3-p1 ~]# cd v2.86/
+ [root@userspace-trex-pod-t3-p1 v2.86]# ./t-rex-64 -i --no-scapy-server --nc --no-watchdog
+ ```
+
+ The TRex screen comes up:
+
+ ![trex-screen](./images/trex-screen.png)
+
+
+
+- Swap Pod:
+
+ - Enter the generator pod with `kubectl exec -it userspace-rapid-pod-t3-p2 -- /bin/bash`
+
+ - copy the prox folder (it is shared between pods) to make changes on configuration files: `cp -r /opt/prox /opt/proxswap`
+
+ - search for the two memif socketfile names running :
+
+ ```bash
+ [root@userspace-rapid-pod-t3-p2 /]# cat /etc/podnetinfo/annotations | grep socketfile
+ userspace/configuration-data="[{\n \"containerId\": \"fbbc9e8e1c5bfb280eeb061c7c1fc6fade8cb2e0e8cda7dd0c3974ce61442246\",\n \"ifName\": \"net1\",\n \"name\": \"userspace-vpp-net\",\n \"config\": {\n \"engine\": \"vpp\",\n \"iftype\": \"memif\",\n \"netType\": \"interface\",\n \"memif\": {\n \"role\": \"slave\",\n \"mode\": \"ethernet\",\n \"socketfile\": \"memif-fbbc9e8e1c5b-net1.sock\"\n },\n \"vhost\": {},\n \"bridge\": {}\n },\n \"ipResult\": {\n \"interfaces\": [\n {\n \"name\": \"net1\",\n \"sandbox\": \"/proc/24281/ns/net\"\n }\n ],\n \"dns\": {}\n }\n},{\n \"containerId\": \"fbbc9e8e1c5bfb280eeb061c7c1fc6fade8cb2e0e8cda7dd0c3974ce61442246\",\n \"ifName\": \"net2\",\n \"name\": \"userspace-vpp-net\",\n \"config\": {\n \"engine\": \"vpp\",\n \"iftype\": \"memif\",\n \"netType\": \"interface\",\n \"memif\": {\n \"role\": \"slave\",\n \"mode\": \"ethernet\",\n \"socketfile\": \"memif-fbbc9e8e1c5b-net2.sock\"\n },\n \"vhost\": {},\n \"bridge\": {}\n },\n \"ipResult\": {\n \"interfaces\": [\n {\n \"name\": \"net2\",\n \"sandbox\": \"/proc/24281/ns/net\"\n }\n ],\n \"dns\": {}\n }\n}]"
+ ```
+
+
+
+ - copy the names `memif-*-net1.sock` and `memif-*-net2.sock`
+
+ - edit the `parameters.lua` changing the socketfile name and set the CPUs number for the main core, generator cores and latency cores:
+
+ ```lua
+ ...
+ eal="--socket-mem=256,0 --vdev=net_memif0,socket=/usrspcni/memif-fbbc9e8e1c5b-net1.sock --vdev=net_memif1,socket=/usrspcni/memif-fbbc9e8e1c5b-net2.sock"
+ mcore="14"
+ ...
+ swapone="17"
+ ...
+ ```
+
+ - edit `prox.cfg` to configure the tasks properly for swapping:
+
+ ```
+ [lua]
+ dofile("parameters.lua")
+
+ [eal options]
+ -n=4 ; force number of memory channels
+ no-output=no ; disable DPDK debug output
+ eal=--proc-type auto ${eal}
+
+ [port 0]
+ name=p0
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [port 1]
+ name=p1
+ rx desc=2048
+ tx desc=2048
+ vlan=yes
+ lsc=no
+
+ [variables]
+ $mbs=8
+
+ [defaults]
+ mempool size=8K
+
+ [global]
+ name=${name}
+ heartbeat timeout=${heartbeat}
+
+ [core $mcore]
+ mode=master
+
+ [core $swapone]
+ name=swap1
+ task=0
+ mode=swap
+ rx port=p0
+ tx port=p1
+ drop=no
+ ```
+
+ - Enter rapid folder and start PROX:
+
+ ```bash
+ [root@userspace-rapid-pod-t3-p2 /]# cd /opt/rapid/
+ [root@userspace-rapid-pod-t3-p2 rapid]# ./prox -f ../proxgen/prox.cfg
+ ```
+
+ ![prox-vpp-screen-swap](./images/prox-vpp-screen-swap.png)
+
+### Configure VPP
+
+On Node 1 VPP should be configured to send the traffic between memif interfaces with `l2patch`:
+
+```
+[opnfv@worker ~]$ sudo vppctl
+ _______ _ _ _____ ___
+ __/ __/ _ \ (_)__ | | / / _ \/ _ \
+ _/ _// // / / / _ \ | |/ / ___/ ___/
+ /_/ /____(_)_/\___/ |___/_/ /_/
+
+vpp# show interface
+ Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
+local0 0 down 0/0/0/0
+memif1/0 1 up 9000/0/0/0
+memif2/0 2 up 9000/0/0/0
+memif3/0 3 up 9000/0/0/0
+memif4/0 4 up 9000/0/0/0
+vpp# show l2patch
+no l2patch entries
+vpp# test l2patch rx memif1/0 tx memif3/0
+vpp# test l2patch rx memif4/0 tx memif2/0
+vpp# show l2patch
+ memif1/0 -> memif3/0
+ memif4/0 -> memif2/0
+```
+
+To check the socketfiles of the memif shown for the patch configuration run:
+
+```
+vpp# show memif
+sockets
+ id listener filename
+ 2 yes (1) /var/lib/cni/usrspcni/data/memif-e80434cd91fc-net2.sock
+ 4 yes (1) /var/lib/cni/usrspcni/data/memif-fbbc9e8e1c5b-net2.sock
+ 3 yes (1) /var/lib/cni/usrspcni/data/memif-fbbc9e8e1c5b-net1.sock
+ 0 no /run/vpp/memif.sock
+ 1 yes (1) /var/lib/cni/usrspcni/data/memif-e80434cd91fc-net1.sock
+
+...
+```
+
+### Configure vsperf environment and files
+
+On Node 1 the environment and the file for running rapid should be set-up.
+
+Source the rapidenv and enter the rapid folder:
+
+```bash
+[opnfv@worker ~]$ source vsperfenv/bin/activate
+(rapidenv) [opnfv@worker ~]$ cd rapid
+(rapidenv) [opnfv@worker rapid]$
+```
+
+Now edit the vsperf configuration file to use TRex with the test variables set-up and write the generator pod's IP for the connection. Find the IP with `kubectl get pods -o wide`:
+
+```
+[opnfv@master ~]$ kubectl get pods -o wide
+NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
+userspace-rapid-pod-t3-p2 1/1 Running 0 22m 10.244.1.203 worker <none> <none>
+userspace-trex-pod-t3-p1 1/1 Running 0 22m 10.244.1.202 worker <none> <none>
+```
+
+Copy the IP of the `userspace-trex-pod-t3-p1` pod and then edit the configuration file `~/conf/vsperf-trex.conf`:
+
+```
+VSWITCH_BRIDGE_NAME = 'vsperf-br0'
+WHITELIST_NICS = ['06:00.0', '06:00.1']
+TRAFFICGEN = 'Trex'
+TRAFFICGEN_TREX_HOST_IP_ADDR = '10.244.1.202'
+TRAFFICGEN_TREX_USER = 'root'
+TRAFFICGEN_TREX_BASE_DIR = '/root/v2.86/'
+TRAFFICGEN_TREX_LINE_SPEED_GBPS = '10'
+TRAFFICGEN_TREX_PORT1 = '0000:02:00.0'
+TRAFFICGEN_TREX_PORT2 = '0000:02:00.1'
+TRAFFICGEN_TREX_PROMISCUOUS = False
+TRAFFICGEN_DURATION=10
+TRAFFICGEN_LOSSRATE=0
+TRAFFICGEN_RFC2544_TESTS=10
+TRAFFICGEN_PKT_SIZES=(64,128,256,512,1024,1280,1518)
+GUEST_TESTPMD_FWD_MODE = ['io']
+GUEST_IMAGE = ['/home/opnfv/old/vnfs/vloop-vnf-ubuntu-18.04_20180920.qcow2']
+TRAFFICGEN_TREX_LATENCY_PPS = 1000
+TRAFFICGEN_TREX_FORCE_PORT_SPEED = True
+TRAFFICGEN_TREX_PORT_SPEED = 10000 # 10 Gbps
+TRAFFICGEN_TREX_RFC2544_BINARY_SEARCH_LOSS_VERIFICATION = True
+TRAFFICGEN_TREX_RFC2544_MAX_REPEAT = 3
+```
+
+### Running the tests
+
+Now that it's all configured, the test can be started form the vineperf folder with the `vsperf` script, passing the configuration file as argument:
+
+``` bash
+(vsperfenv) [opnfv@worker vineperf]$ ./vsperf --conf-file ~/conf/vsperf-trex.conf --mode trafficgen phy2phy_tput
+```
+
diff --git a/docs/testing/user/userguide/east-west-benchmarking/Topologies-EastWest.md b/docs/testing/user/userguide/east-west-benchmarking/Topologies-EastWest.md
new file mode 100644
index 00000000..84dd8725
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/Topologies-EastWest.md
@@ -0,0 +1,34 @@
+# Topologies used for East-Weast traffic benchmarking
+
+For the East-Weast traffic benchmarking, five topologies has been tested. These topologies are composed by Pods running in the same node, and each one differs in terms of number of Pods and numbers of interfaces.
+
+
+
+### Topologies
+
+<img src="./images/topologies.png" alt="topologies" style="zoom: 50%;" />
+
+
+
+### Single and Multi Nodes
+
+A System Under Test (SUT) can be composed by one or more nodes. In a single node configuration all the Pods run on the same worker node, while, in a multi node configuration there are Pods that run on different workers and the traffic flows also in the Kubernetes main network.
+
+### Traffic Generators as PODs
+
+##### Different Traffic generators
+
+The traffic generators available as Pods are TRex and PROX.
+
+##### Swaps and Routers as test-pods.
+
+PROX's Swap and Router modes are useful for creating complex network topologies (such as the 5 shown at the beginning of this file).
+
+- Swap: takes whatever arrives on a specified rx port and send to a specified tx port. The source/destination MAC and ports are swapped.
+- Router: PROX defines a routing table to foward traffic on the Pod's interfaces. It finds MAC address by running the ARP protocol and than updates the table.
+
+##### CNIs Used
+
+The additional interfaces has been configured by the Userspace CNI. With that CNI the Pods can use memif or vhost-user interfaces to communicate respectively with VPP or OvS-DPDK.
+
+SRIOV was excluded due to lack of access to switching infrastructure. \ No newline at end of file
diff --git a/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen-swap.png b/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen-swap.png
new file mode 100644
index 00000000..a0dca08a
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen-swap.png
Binary files differ
diff --git a/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen.png b/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen.png
new file mode 100644
index 00000000..09d3b8e6
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/images/prox-vpp-screen.png
Binary files differ
diff --git a/docs/testing/user/userguide/east-west-benchmarking/images/topologies.png b/docs/testing/user/userguide/east-west-benchmarking/images/topologies.png
new file mode 100644
index 00000000..cc74b786
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/images/topologies.png
Binary files differ
diff --git a/docs/testing/user/userguide/east-west-benchmarking/images/topology1.png b/docs/testing/user/userguide/east-west-benchmarking/images/topology1.png
new file mode 100644
index 00000000..7393301c
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/images/topology1.png
Binary files differ
diff --git a/docs/testing/user/userguide/east-west-benchmarking/images/trex-screen.png b/docs/testing/user/userguide/east-west-benchmarking/images/trex-screen.png
new file mode 100644
index 00000000..7864146d
--- /dev/null
+++ b/docs/testing/user/userguide/east-west-benchmarking/images/trex-screen.png
Binary files differ
diff --git a/src/qemu/Makefile b/src/qemu/Makefile
index b105496c..fe658c41 100755
--- a/src/qemu/Makefile
+++ b/src/qemu/Makefile
@@ -1,7 +1,7 @@
# makefile to manage qemu package
#
-# Copyright (c) 2015-2016 OPNFV and Intel Corporation.
+# Copyright (c) 2015-2022 Anuket, Intel Corporation, and The Linux Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@ include ../mk/master.mk
include ../package-list.mk
WORK_DIR = qemu
+SUBMODULE_CONFIG_FILE = $(WORK_DIR)/.gitmodules
TAG_DONE_FLAG = $(WORK_DIR)/.$(QEMU_TAG).done
INSTALL_TARGET = force_make force_install
CONFIG_CMD =
@@ -40,6 +41,9 @@ config $(WORK_DIR)/Makefile: $(WORK_DIR)/configure
force_make: $(WORK_DIR)/Makefile
$(AT)cd $(WORK_DIR) && git pull $(QEMU_URL) $(QEMU_TAG)
$(AT)echo "git pull done"
+ $(AT)sed -i -e 's/https\:\/\/git.qemu.org\/git\/capstone\.git/https\:\/\/github.com\/capstone-engine\/capstone\.git/g' $(SUBMODULE_CONFIG_FILE)
+ $(AT)sed -i -e 's/https\:\/\/git.qemu.org\/git\/dtc\.git/https\:\/\/github.com\/qemu\/dtc\.git/g' $(SUBMODULE_CONFIG_FILE)
+ $(AT)sed -i -e 's/https\:\/\/git.qemu.org\/git\/keycodemapdb\.git/https\:\/\/github.com\/qemu\/keycodemapdb\.git/g' $(SUBMODULE_CONFIG_FILE)
$(AT)$(MAKE) -C $(WORK_DIR) $(MORE_MAKE_FLAGS)
@echo "Make done"
diff --git a/src/vpp/Makefile b/src/vpp/Makefile
index d3146f46..5753a994 100644
--- a/src/vpp/Makefile
+++ b/src/vpp/Makefile
@@ -37,6 +37,7 @@ force_make: $(WORK_DIR)/Makefile
# another option is to copy all required VPP dependencies into VSPERF
# installation files and keep them updated
$(AT)$(MAKE) -C $(WORK_DIR) UNATTENDED=y install-dep
+ $(AT)$(MAKE) -C $(WORK_DIR) UNATTENDED=y install-ext-deps
$(AT)$(MAKE) -C $(WORK_DIR) build-release $(MORE_MAKE_FLAGS)
# vppctl expects that vpp_api_test is installed in system directories
# in order to execute vppctl from src/ subtree we have to use absolute path
diff --git a/testcases/testcase.py b/testcases/testcase.py
index 13ada1cc..12d71bc5 100644
--- a/testcases/testcase.py
+++ b/testcases/testcase.py
@@ -640,19 +640,28 @@ class TestCase(object):
if S.getValue('K8S') and 'sriov' not in S.getValue('PLUGIN'):
if 'Ovs' in S.getValue('VSWITCH'):
# Add OVS Flows
- logging.info("Kubernetes: Adding OVS Connections")
- flow = {'table':'0', 'in_port':'1',
- 'idle_timeout':'0', 'actions': ['output:3']}
- vswitch.add_flow(bridge, flow)
- flow = {'table':'0', 'in_port':'3',
- 'idle_timeout':'0', 'actions': ['output:1']}
- vswitch.add_flow(bridge, flow)
- flow = {'table':'0', 'in_port':'2',
- 'idle_timeout':'0', 'actions': ['output:4']}
- vswitch.add_flow(bridge, flow)
- flow = {'table':'0', 'in_port':'4',
- 'idle_timeout':'0', 'actions': ['output:2']}
- vswitch.add_flow(bridge, flow)
+ if S.getValue('USCNI_INTERFACE_PAIRS') == 1:
+ logging.info("Kubernetes: Adding 1-Pair OVS Connections")
+ flow = {'table':'0', 'in_port':'1',
+ 'idle_timeout':'0', 'actions': ['output:2']}
+ vswitch.add_flow(bridge, flow)
+ flow = {'table':'0', 'in_port':'2',
+ 'idle_timeout':'0', 'actions': ['output:1']}
+ vswitch.add_flow(bridge, flow)
+ elif S.getValue('USCNI_INTERFACE_PAIRS') == 2:
+ logging.info("Kubernetes: Adding 2-Pairs OVS Connections")
+ flow = {'table':'0', 'in_port':'1',
+ 'idle_timeout':'0', 'actions': ['output:3']}
+ vswitch.add_flow(bridge, flow)
+ flow = {'table':'0', 'in_port':'3',
+ 'idle_timeout':'0', 'actions': ['output:1']}
+ vswitch.add_flow(bridge, flow)
+ flow = {'table':'0', 'in_port':'2',
+ 'idle_timeout':'0', 'actions': ['output:4']}
+ vswitch.add_flow(bridge, flow)
+ flow = {'table':'0', 'in_port':'4',
+ 'idle_timeout':'0', 'actions': ['output:2']}
+ vswitch.add_flow(bridge, flow)
elif 'vpp' in S.getValue('VSWITCH'):
phy_ports = vswitch.get_ports()
virt_port0 = 'memif1/0'
diff --git a/tools/cloudinfo.py b/tools/cloudinfo.py
new file mode 100644
index 00000000..18550e78
--- /dev/null
+++ b/tools/cloudinfo.py
@@ -0,0 +1,94 @@
+# Copyright 2022 The Linux Foundation
+#
+# 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.
+
+
+"""
+Get Cloud information and save it a file
+"""
+
+import os
+import json
+from kubernetes import client, config
+from kubernetes.client.rest import ApiException
+from conf import settings
+
+def save_kubernetes_info():
+ """
+ Save Kubernetes Cluster Info
+ """
+ config.load_kube_config(settings.getValue('K8S_CONFIG_FILEPATH'))
+ with open(os.path.join(settings.getValue('RESULTS_PATH'),
+ 'cloud_info.txt'), 'a+') as outf:
+ api = client.CoreV1Api()
+ try:
+ node_info = api.list_node()
+ except ApiException as err:
+ raise Exception from err
+ for ni_item in node_info.items:
+ outf.write("\n ******************************************** \n")
+ outf.write("\n System Information \n")
+ sinfo = {'Architecture': ni_item.status.node_info.architecture,
+ 'Container Runtime Version':ni_item.status.node_info.container_runtime_version,
+ 'kernel version':ni_item.status.node_info.kernel_version,
+ 'Kube Proxy Version':ni_item.status.node_info.kube_proxy_version,
+ 'Kubelet Version':ni_item.status.node_info.kubelet_version,
+ 'Operating System':ni_item.status.node_info.operating_system,
+ 'OS Image':ni_item.status.node_info.os_image}
+ json.dump(sinfo, outf, indent=4)
+ outf.write("\n List of Addresses \n")
+ addresses = []
+ for addrs in ni_item.status.addresses:
+ entry = {'address': addrs.address, 'type': addrs.type}
+ addresses.append(entry)
+ json.dump(entry, outf, indent=4)
+ sinfo['List of Addresses'] = entry
+ outf.write("\n Allocatable Resources \n")
+ sinfo['Allocatable Resources'] = ni_item.status.allocatable
+ json.dump(ni_item.status.allocatable, outf, indent=4)
+ outf.write("\n Available Resources \n")
+ sinfo['Available Resources'] = ni_item.status.capacity
+ json.dump(ni_item.status.capacity, outf, indent=4)
+ api = client.VersionApi()
+ try:
+ version_info = api.get_code()
+ except ApiException as err:
+ raise Exception from err
+ outf.write("\n Version Information \n")
+ vinfo = {'git_commit': version_info.git_commit, 'git_version': version_info.git_version,
+ 'platform': version_info.platform, 'go_version': version_info.go_version}
+ #json.dump(vinfo, outf, indent=4)
+ result = {**sinfo, **vinfo}
+ return result
+
+def save_openstack_info():
+ """
+ Save Openstack Info
+ """
+ return None
+
+def save_cloud_info():
+ """
+ Save Cloud Information
+ """
+ if settings.getValue('K8S'):
+ return save_kubernetes_info()
+ elif settings.getValue('OPENSTACK'):
+ return save_openstack_info()
+ else:
+ print("Unsupported Cloud")
+ return None
+ return 0
+
+if __name__ == "__main__":
+ save_cloud_info()
diff --git a/tools/k8s/load-generator/Dockerfile b/tools/k8s/load-generator/Dockerfile
new file mode 100644
index 00000000..6212f6b2
--- /dev/null
+++ b/tools/k8s/load-generator/Dockerfile
@@ -0,0 +1,27 @@
+# Copyright 2022 The Linux Foundation.
+#
+# 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.
+
+FROM debian:bullseye
+RUN mkdir -p /opt/spirent/inception
+EXPOSE 3357
+EXPOSE 13731
+EXPOSE 13771
+EXPOSE 17731
+RUN apt-get clean && \
+ apt-get update && \
+ apt-get install -y net-tools procps
+COPY ./config.zpl /opt/spirent/inception/config.zpl
+COPY ./cloudstress /opt/spirent/inception/cloudstress
+WORKDIR /opt/spirent/inception
+CMD ["cloudstress", "--conffile", "config.zpl"]
diff --git a/tools/k8s/load-generator/README.md b/tools/k8s/load-generator/README.md
new file mode 100755
index 00000000..3b03a9b0
--- /dev/null
+++ b/tools/k8s/load-generator/README.md
@@ -0,0 +1,24 @@
+# Stressor for Cloud-Native Usecases using Spirent Cloudstress
+
+## Updating the configuration
+
+Modify the config.zpl file according to your requirements - configure the required amount of CPU and Memory stresses.
+
+## Building container (if required)
+
+Download the cloudstress binary from the artifacts.
+
+Build using the following command
+
+```sh
+$ docker build --rm -t autocloudstress .
+```
+
+## Using existing container.
+
+Pre-built container exists in dockerhub as: vsperf/autocloudstress:thoth
+
+## Running workloads.
+
+Run the built or existing container as pods.
+Example deployment file: csdeployment.yaml present in this folder.
diff --git a/tools/k8s/load-generator/config.zpl b/tools/k8s/load-generator/config.zpl
new file mode 100755
index 00000000..a0dbc281
--- /dev/null
+++ b/tools/k8s/load-generator/config.zpl
@@ -0,0 +1,52 @@
+# Copyright 2022 Spirent Communications.
+#
+# 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.
+
+
+#rfc.zeromq.org/spec:4/ZPL
+
+generator
+ cpu
+ utilization = 100.0
+ running = "true"
+ block
+ writes_per_sec = 1048576
+ write_size = 2M
+ reads_per_sec = 1048576
+ read_size = 2M
+ queue_depth = 4
+ vdev_path = "/tmp"
+ vdev_size = 1048576000
+ file_size = 1000
+ running = "true"
+ pattern = "random"
+ memory
+ writes_per_sec = 1048576
+ write_size = 2000000
+ reads_per_sec = 1048576
+ read_size = 2000000
+ buffer_size = 250000000
+ running = "true"
+ pattern = "random"
+ network.client
+ connections = 10
+ threads = 5
+ ops_per_connection = 10
+ protocol = tcp
+ writes_per_sec = 1043576
+ write_size = 2000000
+ reads_per_sec = 1043576
+ read_size = 2000000
+ running = "true"
+ network.server
+ running = "true"
diff --git a/tools/k8s/load-generator/csdeployment.yaml b/tools/k8s/load-generator/csdeployment.yaml
new file mode 100644
index 00000000..e6d32d5f
--- /dev/null
+++ b/tools/k8s/load-generator/csdeployment.yaml
@@ -0,0 +1,39 @@
+# Copyright 2022 The Linux Foundation.
+#
+# 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.
+
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: cloudstress-deployment
+spec:
+ selector:
+ matchLabels:
+ app: cloudstress
+ replicas: 2 # tells deployment to run 2 pods matching the template
+ template:
+ metadata:
+ labels:
+ app: cloudstress
+ spec:
+ containers:
+ - name: cloudstress
+ image: vsperf/autocloudstress:thoth
+ resources:
+ requests:
+ cpu: "2000m"
+ memory: "2000Mi"
+ limits:
+ cpu: "2000m"
+ memory: "2000Mi"
diff --git a/tools/pkt_gen/trex/trex_client.py b/tools/pkt_gen/trex/trex_client.py
index 680497ec..01d4d389 100644
--- a/tools/pkt_gen/trex/trex_client.py
+++ b/tools/pkt_gen/trex/trex_client.py
@@ -108,7 +108,7 @@ class Trex(ITrafficGenerator):
self._stlclient = None
self._verification_params = None
self._show_packet_data = False
- self.trial_results = []
+ self.trial_results = {}
def show_packet_info(self, packet_a, packet_b):
"""
@@ -521,8 +521,8 @@ class Trex(ITrafficGenerator):
return stats
- @staticmethod
- def calculate_results(stats):
+ # @staticmethod
+ def calculate_results(self, stats):
"""Calculate results from Trex statistic
"""
result = OrderedDict()