summaryrefslogtreecommitdiffstats
path: root/test/vpp_iperf.py
diff options
context:
space:
mode:
authorNaveen Joy <najoy@cisco.com>2021-05-11 10:31:18 -0700
committerNaveen Joy <najoy@cisco.com>2022-08-04 12:19:35 -0700
commit7ea7ab5f215a95dbc1a38acc03b7fea6d3dbedcf (patch)
tree0fbc23c6fc67019a785c577204ca01a26272a173 /test/vpp_iperf.py
parent157e4f5d249a262bd8a9c920b8591411e179763c (diff)
tests: run a test inside a QEMU VM
Use the script test/run.py to run a test named test_vm_tap inside a QEMU VM. The run script builds out a virtual env, launches a light weight QEMU VM, mounts host directories, starts VPP inside the VM and runs the test. The test named test_vm_tap, creates two tap v2 interfaces in separate Linux namespaces and using iPerf, streams traffic between the VM and VPP. All data files are stored in the directory named /tmp/vpp-vm-tests. To clean up, use the make test-wipe command. Usage: test/run.py --vm --debug --test test_vm_tap Type: improvement Change-Id: I4425dbef52acee1e5b8af5acaa169b89a2c0f171 Signed-off-by: Naveen Joy <najoy@cisco.com>
Diffstat (limited to 'test/vpp_iperf.py')
-rw-r--r--test/vpp_iperf.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/test/vpp_iperf.py b/test/vpp_iperf.py
new file mode 100644
index 00000000000..78ce9d08c90
--- /dev/null
+++ b/test/vpp_iperf.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+# Start an iPerf connection stream between two Linux namespaces ##
+
+import subprocess
+import os
+
+
+class VppIperf:
+ """ "Create an iPerf connection stream between two namespaces.
+
+ Usage:
+ iperf = VppIperf() # Create the iPerf Object
+ iperf.client_ns = 'ns1' # Client Namespace
+ iperf.server_ns = 'ns2' # Server Namespace
+ iperf.server_ip = '10.0.0.102' # Server IP Address
+ iperf.start() # Start the connection stream
+
+ Optional:
+ iperf.duration = 15 # Time to transmit for in seconds (Default=10)
+
+ ## Optionally set any iperf client & server args
+ Example:
+ # Run 4 parallel streams, write to logfile & bind to port 5202
+ iperf.client_args='-P 4 --logfile /tmp/vpp-vm-tests/vpp_iperf.log -p 5202'
+ iperf.server_args='-p 5202'
+ """
+
+ def __init__(self, server_ns=None, client_ns=None, server_ip=None):
+ self.server_ns = server_ns
+ self.client_ns = client_ns
+ self.server_ip = server_ip
+ self.duration = 10
+ self.client_args = ""
+ self.server_args = ""
+ # Set the iperf executable
+ self.iperf = os.path.join(os.getenv("TEST_DATA_DIR") or "/", "usr/bin/iperf")
+
+ def ensure_init(self):
+ if self.server_ns and self.client_ns and self.server_ip:
+ return True
+ else:
+ raise Exception(
+ "Error: Cannot Start." "iPerf object has not been initialized"
+ )
+
+ def start_iperf_server(self):
+ print("Starting iPerf Server Daemon in Namespace ", self.server_ns)
+ args = [
+ "ip",
+ "netns",
+ "exec",
+ self.server_ns,
+ self.iperf,
+ "-s",
+ "-D",
+ "-B",
+ self.server_ip,
+ ]
+ args.extend(self.server_args.split())
+ try:
+ subprocess.run(
+ args,
+ stderr=subprocess.STDOUT,
+ timeout=self.duration + 5,
+ encoding="utf-8",
+ )
+ except subprocess.TimeoutExpired as e:
+ raise Exception("Error: Timeout expired for iPerf", e.output)
+
+ def start_iperf_client(self):
+ print("Starting iPerf Client in Namespace ", self.client_ns)
+ args = [
+ "ip",
+ "netns",
+ "exec",
+ self.client_ns,
+ self.iperf,
+ "-c",
+ self.server_ip,
+ "-t",
+ str(self.duration),
+ ]
+ args.extend(self.client_args.split())
+ try:
+ subprocess.run(
+ args,
+ stderr=subprocess.STDOUT,
+ timeout=self.duration + 5,
+ encoding="utf-8",
+ )
+ except subprocess.TimeoutExpired as e:
+ raise Exception("Error: Timeout expired for iPerf", e.output)
+
+ def start(self):
+ """Run iPerf and return True if successful"""
+ self.ensure_init()
+ try:
+ self.start_iperf_server()
+ except Exception as e:
+ subprocess.run(["pkill", "iperf"])
+ raise Exception("Error starting iPerf Server", e)
+
+ try:
+ self.start_iperf_client()
+ except Exception as e:
+ raise Exception("Error starting iPerf Client", e)
+ subprocess.run(["pkill", "iperf"])
+
+
+if __name__ == "__main__":
+ # Run iPerf using default settings
+ iperf = VppIperf()
+ iperf.client_ns = "ns1"
+ iperf.server_ns = "ns2"
+ iperf.server_ip = "10.0.0.102"
+ iperf.duration = 20
+ iperf.start()