import os
from teuthology.orchestra.cluster import Cluster
+from teuthology.exit import exiter
from . import Task
if not self.enabled:
return
super(ConsoleLog, self).setup()
- self.processes = list()
+ self.processes = dict()
+ self.signal_handlers = list()
self.setup_archive()
def setup_archive(self):
"%s.log" % remote.shortname,
)
proc = remote.console.spawn_sol_log(log_path)
- self.processes.append(proc)
+ self.processes[remote.shortname] = proc
+
+ # Install a signal handler to make sure the console-logging
+ # processes are terminated if the job is killed
+ def kill_console_loggers(signal_, frame):
+ for (name, proc) in self.processes.items():
+ log.debug("Killing console logger for %s", name)
+ proc.terminate()
+ exiter.add_handler(15, kill_console_loggers)
def end(self):
if not self.enabled:
self.stop_logging()
def stop_logging(self, force=False):
- for proc in self.processes:
+ for proc in self.processes.values():
if proc.poll() is not None:
continue
if force:
else:
proc.terminate()
+ # Remove any signal handlers
+ for handler in self.signal_handlers:
+ handler.remove()
+
def teardown(self):
if not self.enabled:
return
def test_end(self, m_pconsole):
with self.klass(self.ctx, self.task_config) as task:
pass
- for proc in task.processes:
+ for proc in task.processes.values():
assert proc.terminate.called_once_with()
assert proc.kill.called_once_with()