#!/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()