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
This commit is contained in:
Pau Espin 2020-05-25 15:44:09 +02:00
parent d84a8387be
commit 0d64f16544
4 changed files with 28 additions and 26 deletions

View File

@ -55,7 +55,7 @@ class RemoteHost(log.Origin):
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 @@ class RemoteHost(log.Origin):
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 @@ class RemoteHost(log.Origin):
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)

View File

@ -310,7 +310,11 @@ class OsmoTrx(Trx, metaclass=ABCMeta):
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()

View File

@ -46,6 +46,7 @@ class AmarisoftEPC(epc.EPC):
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 @@ class AmarisoftEPC(epc.EPC):
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 @@ class AmarisoftEPC(epc.EPC):
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 @@ class AmarisoftEPC(epc.EPC):
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)

View File

@ -91,6 +91,7 @@ class srsUE(MS):
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 @@ class srsUE(MS):
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 @@ class srsUE(MS):
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 @@ class srsUE(MS):
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):