tests: remotehost add execute_stop()
Before we have to kill an application we start in the thread - in most cases using killall and sometimes kill other applicantions, e.g., tcpdump, iper, iperf3, tshark. With this patch we are able to stop/kill a single application/thread instead, based on the pid file. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
This commit is contained in:
parent
fed855d5dd
commit
14d28a655a
1 changed files with 55 additions and 5 deletions
|
@ -8,6 +8,7 @@ import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import os
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
@ -34,6 +35,17 @@ def execute_thread(command, reply):
|
||||||
reply.append(status)
|
reply.append(status)
|
||||||
reply.append(buf)
|
reply.append(buf)
|
||||||
|
|
||||||
|
def gen_reaper_file(conf):
|
||||||
|
fd, filename = tempfile.mkstemp(dir='/tmp', prefix=conf + '-')
|
||||||
|
f = os.fdopen(fd, 'w')
|
||||||
|
|
||||||
|
f.write("#!/bin/sh\n")
|
||||||
|
f.write("name=\"$(basename $0)\"\n")
|
||||||
|
f.write("echo $$ > /tmp/$name.pid\n")
|
||||||
|
f.write("exec \"$@\"\n");
|
||||||
|
|
||||||
|
return filename;
|
||||||
|
|
||||||
class Host():
|
class Host():
|
||||||
def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
|
def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
|
||||||
self.host = host
|
self.host = host
|
||||||
|
@ -86,17 +98,55 @@ class Host():
|
||||||
return status, buf.decode()
|
return status, buf.decode()
|
||||||
|
|
||||||
# async execute
|
# async execute
|
||||||
def execute_run(self, command, res):
|
def execute_run(self, command, res, use_reaper=True):
|
||||||
if self.host is None:
|
if use_reaper:
|
||||||
cmd = command
|
filename = gen_reaper_file("reaper")
|
||||||
|
self.send_file(filename, filename)
|
||||||
|
self.execute(["chmod", "755", filename])
|
||||||
|
_command = [filename] + command
|
||||||
else:
|
else:
|
||||||
cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
|
filename = ""
|
||||||
|
_command = command
|
||||||
|
|
||||||
|
if self.host is None:
|
||||||
|
cmd = _command
|
||||||
|
else:
|
||||||
|
cmd = ["ssh", self.user + "@" + self.host, ' '.join(_command)]
|
||||||
_cmd = self.name + " execute_run: " + ' '.join(cmd)
|
_cmd = self.name + " execute_run: " + ' '.join(cmd)
|
||||||
logger.debug(_cmd)
|
logger.debug(_cmd)
|
||||||
t = threading.Thread(target=execute_thread, args=(cmd, res))
|
t = threading.Thread(target=execute_thread, name=filename, args=(cmd, res))
|
||||||
t.start()
|
t.start()
|
||||||
return t
|
return t
|
||||||
|
|
||||||
|
def execute_stop(self, t):
|
||||||
|
if t.name.find("reaper") == -1:
|
||||||
|
raise Exception("use_reaper required")
|
||||||
|
|
||||||
|
pid_file = t.name + ".pid"
|
||||||
|
|
||||||
|
if t.isAlive():
|
||||||
|
cmd = ["kill `cat " + pid_file + "`"]
|
||||||
|
self.execute(cmd)
|
||||||
|
|
||||||
|
# try again
|
||||||
|
self.wait_execute_complete(t, 5)
|
||||||
|
if t.isAlive():
|
||||||
|
cmd = ["kill `cat " + pid_file + "`"]
|
||||||
|
self.execute(cmd)
|
||||||
|
|
||||||
|
# try with -9
|
||||||
|
self.wait_execute_complete(t, 5)
|
||||||
|
if t.isAlive():
|
||||||
|
cmd = ["kill -9 `cat " + pid_file + "`"]
|
||||||
|
self.execute(cmd)
|
||||||
|
|
||||||
|
self.wait_execute_complete(t, 5)
|
||||||
|
if t.isAlive():
|
||||||
|
raise Exception("thread still alive")
|
||||||
|
|
||||||
|
self.execute(["rm", pid_file])
|
||||||
|
self.execute(["rm", t.name])
|
||||||
|
|
||||||
def wait_execute_complete(self, t, wait=None):
|
def wait_execute_complete(self, t, wait=None):
|
||||||
if wait == None:
|
if wait == None:
|
||||||
wait_str = "infinite"
|
wait_str = "infinite"
|
||||||
|
|
Loading…
Reference in a new issue