Change in osmo-gsm-tester[master]: iperf3: Support running iperf3 remotely

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Tue Feb 11 16:47:52 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17134 )


Change subject: iperf3: Support running iperf3 remotely
......................................................................

iperf3: Support running iperf3 remotely

The new RunNode class is used and ip_address support will be dropped
eventually, replaced by the former.

Change-Id: Ib803d7774cb502c7d07443d7720a7b013684faa8
---
M src/osmo_gsm_tester/iperf3.py
1 file changed, 103 insertions(+), 10 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/34/17134/1

diff --git a/src/osmo_gsm_tester/iperf3.py b/src/osmo_gsm_tester/iperf3.py
index 55cb546..2038daa 100644
--- a/src/osmo_gsm_tester/iperf3.py
+++ b/src/osmo_gsm_tester/iperf3.py
@@ -20,7 +20,7 @@
 import os
 import json
 
-from . import log, util, process, pcap_recorder
+from . import log, util, process, pcap_recorder, run_node, remote
 
 def iperf3_result_to_json(file):
     with open(file) as f:
@@ -35,32 +35,77 @@
 class IPerf3Server(log.Origin):
 
     DEFAULT_SRV_PORT = 5003
+    LOGFILE = 'iperf3_srv.json'
+    REMOTE_DIR = '/tmp'
 
     def __init__(self, suite_run, ip_address):
         super().__init__(log.C_RUN, 'iperf3-srv_%s' % ip_address.get('addr'))
         self.run_dir = None
-        self.config_file = None
         self.process = None
+        self._run_node = None
         self.suite_run = suite_run
         self.ip_address = ip_address
         self._port = IPerf3Server.DEFAULT_SRV_PORT
+        self.log_file = None
+        self.rem_host = None
+        self.remote_log_file = None
+        self.log_copied = False
+
+    def cleanup(self):
+        if self.process is None:
+            return
+        if self.runs_locally():
+            return
+        # copy back files (may not exist, for instance if there was an early error of process):
+        try:
+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)
+        except Exception as e:
+            self.log(repr(e))
+
+    def runs_locally(self):
+        locally = not self._run_node or self._run_node.is_local()
+        return locally
 
     def start(self):
         self.log('Starting iperf3-srv')
+        self.log_copied = False
         self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))
+        self.log_file = self.run_dir.new_file(IPerf3Server.LOGFILE)
+        if self.runs_locally():
+            self.start_locally()
+        else:
+            self.start_remotely()
 
+    def start_remotely(self):
+        self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())
+        remote_prefix_dir = util.Dir(IPerf3Server.REMOTE_DIR)
+        remote_run_dir = util.Dir(remote_prefix_dir.child('srv-' + str(self)))
+        self.remote_log_file = remote_run_dir.child(IPerf3Server.LOGFILE)
+
+        self.rem_host.recreate_remote_dir(remote_run_dir)
+
+        args = ('iperf3', '-s', '-B', self.addr(),
+                '-p', str(self._port), '-J',
+                '--logfile', self.remote_log_file)
+        self.process = self.rem_host.RemoteProcess(self.name(), args)
+        self.suite_run.remember_to_stop(self.process)
+        self.process.launch()
+
+    def start_locally(self):
         pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,
                                    'host %s and port not 22' % self.addr())
 
-        self.log_file = self.run_dir.new_file('iperf3_srv.json')
-        self.process = process.Process(self.name(), self.run_dir,
-                                       ('iperf3', '-s', '-B', self.addr(),
-                                        '-p', str(self._port), '-J',
-                                        '--logfile', os.path.abspath(self.log_file)),
-                                       env={})
+        args = ('iperf3', '-s', '-B', self.addr(),
+                '-p', str(self._port), '-J',
+                '--logfile', os.path.abspath(self.log_file))
+
+        self.process = process.Process(self.name(), self.run_dir, args, env={})
         self.suite_run.remember_to_stop(self.process)
         self.process.launch()
 
+    def set_run_node(self, run_node):
+        self._run_node = run_node
+
     def set_port(self, port):
         self._port = port
 
@@ -68,6 +113,9 @@
         self.suite_run.stop_process(self.process)
 
     def get_results(self):
+        if not self.runs_locally() and not self.log_copied:
+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)
+            self.log_copied = True
         return iperf3_result_to_json(self.log_file)
 
     def addr(self):
@@ -87,22 +135,57 @@
 
 class IPerf3Client(log.Origin):
 
+    REMOTE_DIR = '/tmp'
+    LOGFILE = 'iperf3_cli.json'
+
     def __init__(self, suite_run, iperf3srv):
         super().__init__(log.C_RUN, 'iperf3-cli_%s' % iperf3srv.addr())
         self.run_dir = None
-        self.config_file = None
         self.process = None
+        self._run_node = None
         self.server = iperf3srv
         self.suite_run = suite_run
+        self.log_file = None
+        self.rem_host = None
+        self.remote_log_file = None
+        self.log_copied = False
+
+    def runs_locally(self):
+        locally = not self._run_node or self._run_node.is_local()
+        return locally
 
     def prepare_test_proc(self, netns=None):
         self.log('Starting iperf3-client connecting to %s:%d' % (self.server.addr(), self.server.port()))
+        self.log_copied = False
         self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))
+        self.log_file = self.run_dir.new_file(IPerf3Client.LOGFILE)
+        if self.runs_locally():
+            return self.prepare_test_proc_locally()
+        else:
+            return self.prepare_test_proc_remotely()
 
+    def prepare_test_proc_remotely(self, netns=None):
+        self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())
+
+        remote_prefix_dir = util.Dir(IPerf3Client.REMOTE_DIR)
+        remote_run_dir = util.Dir(remote_prefix_dir.child('cli-' + str(self)))
+        self.remote_log_file = remote_run_dir.child(IPerf3Client.LOGFILE)
+
+        self.rem_host.recreate_remote_dir(remote_run_dir)
+
+        popen_args = ('iperf3', '-c',  self.server.addr(),
+                      '-p', str(self.server.port()), '-J',
+                      '--logfile', self.remote_log_file)
+        if netns:
+            self.process = self.rem_host.RemoteNetNSProcess(self.name(), netns, popen_args, env={})
+        else:
+            self.process = self.rem_host.RemoteProcess(self.name(), popen_args, env={})
+        return self.process
+
+    def prepare_test_proc_locally(self, netns=None):
         pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,
                                    'host %s and port not 22' % self.server.addr(), netns)
 
-        self.log_file = self.run_dir.new_file('iperf3_cli.json')
         popen_args = ('iperf3', '-c',  self.server.addr(),
                       '-p', str(self.server.port()), '-J',
                       '--logfile', os.path.abspath(self.log_file))
@@ -118,6 +201,16 @@
         return self.get_results()
 
     def get_results(self):
+        if not self.runs_locally() and not self.log_copied:
+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)
+            self.log_copied = True
         return iperf3_result_to_json(self.log_file)
 
+    def set_run_node(self, run_node):
+        self._run_node = run_node
+
+    def __str__(self):
+        # FIXME: somehow differentiate between several clients connected to same server?
+        return "%s:%u" %(self.server.addr(), self.server.port())
+
 # vim: expandtab tabstop=4 shiftwidth=4

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17134
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Change-Id: Ib803d7774cb502c7d07443d7720a7b013684faa8
Gerrit-Change-Number: 17134
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200211/5cf2b7c2/attachment.htm>


More information about the gerrit-log mailing list