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.orgpespin 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>