Replace RemoteProcessFixIgnoreSIGHUP with RemoteProcessSafeExit
The API was doing far more stuff than its name indicated. Even more
important stuff, like making sure the process is killed at the end with
-9 after ssh connection is dropped.
Change-Id: If043ecab509b34b0922824d73db916196274ec64
diff --git a/src/osmo_gsm_tester/core/remote.py b/src/osmo_gsm_tester/core/remote.py
index 95b8967..29eea30 100644
--- a/src/osmo_gsm_tester/core/remote.py
+++ b/src/osmo_gsm_tester/core/remote.py
@@ -55,7 +55,7 @@
run_dir = self.run_dir.new_dir(name)
return process.RemoteProcess(name, run_dir, self.user(), self.host(), self.cwd(), popen_args, remote_env=remote_env, **popen_kwargs)
- def generate_wrapper_script(self):
+ def generate_wrapper_script(self, wait_time_sec):
wrapper_script = self.run_dir.new_file(RemoteHost.WRAPPER_SCRIPT)
with open(wrapper_script, 'w') as f:
r = """#!/bin/bash
@@ -66,8 +66,8 @@
if ! kill -0 $mypid; then
return
fi
- echo "sleeping some time waiting for child to die..." >>$LOGFILE
- sleep 5
+ echo "sleeping %d seconds waiting for child to die..." >>$LOGFILE
+ sleep %d
if ! kill -0 $mypid; then
return
fi
@@ -102,20 +102,18 @@
prep_sighandler
$@ &
wait_sighandler
- """
+ """ % (wait_time_sec, wait_time_sec)
f.write(r)
st = os.stat(wrapper_script)
os.chmod(wrapper_script, st.st_mode | stat.S_IEXEC)
return wrapper_script
- def RemoteProcessFixIgnoreSIGHUP(self, name, remote_dir, popen_args, remote_env={}, **popen_kwargs):
- # Run remotely through ssh. We need to run binary under a wrapper
- # script since osmo-trx ignores SIGHUP and will keep running after
- # we close local ssh session. The wrapper script catches SIGHUP and
- # sends SIGINT to it.
+ def RemoteProcessSafeExit(self, name, remote_dir, popen_args, remote_env={}, wait_time_sec=5, **popen_kwargs):
+ """Run binary under a wrapper which will make sure process is killed -9
+ a few seconds after SIGHUP from SSH is received."""
self.create_remote_dir(remote_dir)
- wrapper_script = self.generate_wrapper_script()
+ wrapper_script = self.generate_wrapper_script(wait_time_sec)
remote_wrapper_script = remote_dir.child(RemoteHost.WRAPPER_SCRIPT)
self.scp('scp-wrapper-to-remote', wrapper_script, remote_wrapper_script)
diff --git a/src/osmo_gsm_tester/obj/bts_osmotrx.py b/src/osmo_gsm_tester/obj/bts_osmotrx.py
index 1456802..0eeef49 100644
--- a/src/osmo_gsm_tester/obj/bts_osmotrx.py
+++ b/src/osmo_gsm_tester/obj/bts_osmotrx.py
@@ -310,7 +310,11 @@
remote_env = {}
remote_binary = self.binary_name()
args = (remote_binary, '-C', remote_config_file)
- self.proc_trx = rem_host.RemoteProcessFixIgnoreSIGHUP(self.binary_name(), remote_run_dir, args, remote_env=remote_env)
+ # Run remotely through ssh. We need to run binary under a wrapper
+ # script since osmo-trx ignores SIGHUP and will keep running after
+ # we close local ssh session. The wrapper script catches SIGHUP and
+ # sends SIGINT to it.
+ self.proc_trx = rem_host.RemoteProcessSafeExit(self.binary_name(), remote_run_dir, args, remote_env=remote_env)
self.testenv.remember_to_stop(self.proc_trx, keepalive)
self.proc_trx.launch()
diff --git a/src/osmo_gsm_tester/obj/epc_amarisoft.py b/src/osmo_gsm_tester/obj/epc_amarisoft.py
index e9f1e82..d6cad81 100644
--- a/src/osmo_gsm_tester/obj/epc_amarisoft.py
+++ b/src/osmo_gsm_tester/obj/epc_amarisoft.py
@@ -46,6 +46,7 @@
self.ifup_file = None
self.process = None
self.rem_host = None
+ self.remote_run_dir = None
self.remote_inst = None
self.remote_config_file = None
self.remote_log_file = None
@@ -92,8 +93,7 @@
args = (remote_binary, self.remote_config_file)
- self.process = self.rem_host.RemoteProcess(AmarisoftEPC.BINFILE, args)
- #self.process = self.rem_host.RemoteProcessFixIgnoreSIGHUP(AmarisoftEPC.BINFILE, remote_run_dir, args)
+ self.process = self.rem_host.RemoteProcessSafeExit(AmarisoftEPC.BINFILE, self.remote_run_dir, args)
self.testenv.remember_to_stop(self.process)
self.process.launch()
@@ -137,11 +137,11 @@
self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())
remote_prefix_dir = util.Dir(AmarisoftEPC.REMOTE_DIR)
self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))
- remote_run_dir = util.Dir(remote_prefix_dir.child(AmarisoftEPC.BINFILE))
+ self.remote_run_dir = util.Dir(remote_prefix_dir.child(AmarisoftEPC.BINFILE))
- self.remote_config_file = remote_run_dir.child(AmarisoftEPC.CFGFILE)
- self.remote_log_file = remote_run_dir.child(AmarisoftEPC.LOGFILE)
- self.remote_ifup_file = remote_run_dir.child(AmarisoftEPC.IFUPFILE)
+ self.remote_config_file = self.remote_run_dir.child(AmarisoftEPC.CFGFILE)
+ self.remote_log_file = self.remote_run_dir.child(AmarisoftEPC.LOGFILE)
+ self.remote_ifup_file = self.remote_run_dir.child(AmarisoftEPC.IFUPFILE)
values = super().configure(['amarisoft', 'amarisoftepc'])
@@ -162,7 +162,7 @@
if not self._run_node.is_local():
self.rem_host.recreate_remote_dir(self.remote_inst)
self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)
- self.rem_host.recreate_remote_dir(remote_run_dir)
+ self.rem_host.recreate_remote_dir(self.remote_run_dir)
self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)
self.rem_host.scp('scp-ifup-to-remote', self.ifup_file, self.remote_ifup_file)
diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py
index b494c54..3fa282e 100644
--- a/src/osmo_gsm_tester/obj/ms_srs.py
+++ b/src/osmo_gsm_tester/obj/ms_srs.py
@@ -91,6 +91,7 @@
self.process = None
self.rem_host = None
self.remote_inst = None
+ self.remote_run_dir = None
self.remote_config_file = None
self.remote_log_file = None
self.remote_pcap_file = None
@@ -168,8 +169,7 @@
args = (remote_binary, self.remote_config_file, '--gw.netns=' + self.netns())
args += tuple(self._additional_args)
- self.process = self.rem_host.RemoteProcess(srsUE.BINFILE, args)
- #self.process = self.rem_host.RemoteProcessFixIgnoreSIGHUP(srsUE.BINFILE, remote_run_dir, args, remote_lib)
+ self.process = self.rem_host.RemoteProcessSafeExit(srsUE.BINFILE, self.remote_run_dir, args)
self.testenv.remember_to_stop(self.process)
self.process.launch()
@@ -213,11 +213,11 @@
self.rem_host = remote.RemoteHost(self.run_dir, self.remote_user, self._addr)
remote_prefix_dir = util.Dir(srsUE.REMOTE_DIR)
self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))
- remote_run_dir = util.Dir(remote_prefix_dir.child(srsUE.BINFILE))
- self.remote_config_file = remote_run_dir.child(srsUE.CFGFILE)
- self.remote_log_file = remote_run_dir.child(srsUE.LOGFILE)
- self.remote_pcap_file = remote_run_dir.child(srsUE.PCAPFILE)
- self.remote_metrics_file = remote_run_dir.child(srsUE.METRICSFILE)
+ self.remote_run_dir = util.Dir(remote_prefix_dir.child(srsUE.BINFILE))
+ self.remote_config_file = self.remote_run_dir.child(srsUE.CFGFILE)
+ self.remote_log_file = self.remote_run_dir.child(srsUE.LOGFILE)
+ self.remote_pcap_file = self.remote_run_dir.child(srsUE.PCAPFILE)
+ self.remote_metrics_file = self.remote_run_dir.child(srsUE.METRICSFILE)
values = dict(ue=config.get_defaults('srsue'))
config.overlay(values, dict(ue=self.testenv.suite().config().get('modem', {})))
@@ -297,7 +297,7 @@
if not self.setup_runs_locally():
self.rem_host.recreate_remote_dir(self.remote_inst)
self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)
- self.rem_host.recreate_remote_dir(remote_run_dir)
+ self.rem_host.recreate_remote_dir(self.remote_run_dir)
self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)
def is_connected(self, mcc_mnc=None):