summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorNathan Rossi <nathan@nathanrossi.com>2019-09-05 13:44:15 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-09-06 08:13:40 +0100
commit77939cca96fa5467c88eafa3ac0db2db4aef09d6 (patch)
treec5cbe1e6a475c4ac6e4978afa36de16007f63684 /scripts
parent2dc78e805d80bdba8710a6a417fc139e884b9ea9 (diff)
downloadopenembedded-core-contrib-77939cca96fa5467c88eafa3ac0db2db4aef09d6.tar.gz
oe-selftest: Implement console 'keepalive' output
Similar to bitbake, implement a 'keepalive' output to the console to ensure CI systems do not kill the process. The default timeout for bitbake is 5000s. Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/lib/scriptutils.py43
-rwxr-xr-xscripts/oe-selftest2
2 files changed, 42 insertions, 3 deletions
diff --git a/scripts/lib/scriptutils.py b/scripts/lib/scriptutils.py
index e7e7021c245..c573dc7f678 100644
--- a/scripts/lib/scriptutils.py
+++ b/scripts/lib/scriptutils.py
@@ -16,12 +16,51 @@ import string
import subprocess
import sys
import tempfile
+import threading
import importlib
from importlib import machinery
-def logger_create(name, stream=None):
+class KeepAliveStreamHandler(logging.StreamHandler):
+ def __init__(self, keepalive=True, **kwargs):
+ super().__init__(**kwargs)
+ if keepalive is True:
+ keepalive = 5000 # default timeout
+ self._timeout = threading.Condition()
+ self._stop = False
+
+ # background thread waits on condition, if the condition does not
+ # happen emit a keep alive message
+ def thread():
+ while not self._stop:
+ with self._timeout:
+ if not self._timeout.wait(keepalive):
+ self.emit(logging.LogRecord("keepalive", logging.INFO,
+ None, None, "Keepalive message", None, None))
+
+ self._thread = threading.Thread(target = thread, daemon = True)
+ self._thread.start()
+
+ def close(self):
+ # mark the thread to stop and notify it
+ self._stop = True
+ with self._timeout:
+ self._timeout.notify()
+ # wait for it to join
+ self._thread.join()
+ super().close()
+
+ def emit(self, record):
+ super().emit(record)
+ # trigger timer reset
+ with self._timeout:
+ self._timeout.notify()
+
+def logger_create(name, stream=None, keepalive=None):
logger = logging.getLogger(name)
- loggerhandler = logging.StreamHandler(stream=stream)
+ if keepalive is not None:
+ loggerhandler = KeepAliveStreamHandler(stream=stream, keepalive=keepalive)
+ else:
+ loggerhandler = logging.StreamHandler(stream=stream)
loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
logger.addHandler(loggerhandler)
logger.setLevel(logging.INFO)
diff --git a/scripts/oe-selftest b/scripts/oe-selftest
index 57662b2f75d..18ac0f5869c 100755
--- a/scripts/oe-selftest
+++ b/scripts/oe-selftest
@@ -33,7 +33,7 @@ scriptpath.add_bitbake_lib_path()
from oeqa.utils import load_test_components
from oeqa.core.exception import OEQAPreRun
-logger = scriptutils.logger_create('oe-selftest', stream=sys.stdout)
+logger = scriptutils.logger_create('oe-selftest', stream=sys.stdout, keepalive=True)
def main():
description = "Script that runs unit tests against bitbake and other Yocto related tools. The goal is to validate tools functionality and metadata integrity. Refer to https://wiki.yoctoproject.org/wiki/Oe-selftest for more information."