diff options
Diffstat (limited to 'test/vpp_iperf.py')
-rw-r--r-- | test/vpp_iperf.py | 118 |
1 files changed, 98 insertions, 20 deletions
diff --git a/test/vpp_iperf.py b/test/vpp_iperf.py index 78ce9d08c90..42b5ea8a523 100644 --- a/test/vpp_iperf.py +++ b/test/vpp_iperf.py @@ -4,6 +4,7 @@ import subprocess import os +import sys class VppIperf: @@ -26,13 +27,14 @@ class VppIperf: iperf.server_args='-p 5202' """ - def __init__(self, server_ns=None, client_ns=None, server_ip=None): + def __init__(self, server_ns=None, client_ns=None, server_ip=None, logger=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 = "" + self.logger = logger # Set the iperf executable self.iperf = os.path.join(os.getenv("TEST_DATA_DIR") or "/", "usr/bin/iperf") @@ -45,7 +47,6 @@ class VppIperf: ) def start_iperf_server(self): - print("Starting iPerf Server Daemon in Namespace ", self.server_ns) args = [ "ip", "netns", @@ -54,22 +55,22 @@ class VppIperf: self.iperf, "-s", "-D", - "-B", - self.server_ip, ] args.extend(self.server_args.split()) + args = " ".join(args) try: - subprocess.run( + return subprocess.run( args, - stderr=subprocess.STDOUT, timeout=self.duration + 5, encoding="utf-8", + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, ) 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", @@ -82,30 +83,107 @@ class VppIperf: str(self.duration), ] args.extend(self.client_args.split()) + args = " ".join(args) try: - subprocess.run( + return subprocess.run( args, - stderr=subprocess.STDOUT, timeout=self.duration + 5, encoding="utf-8", + capture_output=True, + shell=True, ) except subprocess.TimeoutExpired as e: raise Exception("Error: Timeout expired for iPerf", e.output) - def start(self): - """Run iPerf and return True if successful""" + def start(self, server_only=False, client_only=False): + """Runs iPerf. + + Starts the iperf server daemon & runs the iperf client. + arguments:- + server_only -- start the iperf server daemon only + client_only -- run the iperf client only + Return True if we have no errors in iPerf client, else False. + """ self.ensure_init() - try: + if not client_only: self.start_iperf_server() - except Exception as e: - subprocess.run(["pkill", "iperf"]) - raise Exception("Error starting iPerf Server", e) + if not server_only: + result = self.start_iperf_client() + self.logger.debug(f"Iperf client args: {result.args}") + self.logger.debug(result.stdout) + if result.stderr: + self.logger.error( + f"Error starting Iperf Client in Namespace: {self.client_ns}" + ) + self.logger.error(f"Iperf client args: {result.args}") + self.logger.error(f"Iperf client has errors: {result.stderr}") + return False + else: + return True - try: - self.start_iperf_client() - except Exception as e: - raise Exception("Error starting iPerf Client", e) - subprocess.run(["pkill", "iperf"]) + +## Functions to start and stop iPerf using the iPerf object +def start_iperf( + ip_version, + client_ns="iprf_client_ns", + server_ns="iprf_server_ns", + server_ipv4_address="10.0.0.102", + server_ipv6_address="2001:1::2", + client_args="", + server_args="", + duration=10, + server_only=False, + client_only=False, + logger=None, +): + """Start an iperf connection stream using the iPerf object. + + Starts iPerf an connection stream between an iPerf client in the + client namespace (client_ns) and a server in another + namespace (server_ns). + Parameters: + ip_version - 4 or 6 + client_ns - iPerf client namespace + server_ns - iPerf server namespace + server_ipv4_address - ipv4 address of the server, if ip_version=4 + server_ipv6_address - ipv6 address of the server, if ip_version=6 + client_args - Additonal iperf control arguments to be passed + to the iperf client from the test (str) + server_args - Additonal iperf control arguments to be passed + to the iperf server from the test (str) + duration - Iperf duration in seconds + server_only - start iperf server only + client_only - start the iperf client only + logger - test logger + """ + if ip_version == 4: + iperf_server_ip = server_ipv4_address + elif ip_version == 6: + iperf_server_ip = server_ipv6_address + client_args = "-V" + " " + client_args + server_args = "-V" + " " + server_args + iperf = VppIperf() + iperf.client_ns = client_ns + iperf.server_ns = server_ns + iperf.server_ip = iperf_server_ip + iperf.client_args = client_args + iperf.server_args = server_args + iperf.duration = duration + iperf.logger = logger + return iperf.start(server_only=server_only, client_only=client_only) + + +def stop_iperf(): + args = ["pkill", "iperf"] + args = " ".join(args) + try: + return subprocess.run( + args, + encoding="utf-8", + shell=True, + ) + except Exception: + pass if __name__ == "__main__": |