* [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM
@ 2017-06-27 16:30 Aníbal Limón
2017-06-27 16:30 ` [PATCHv2 2/2] selftest/cases/package: Call parent setUpClass method Aníbal Limón
2017-06-27 18:43 ` [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Patrick Ohly
0 siblings, 2 replies; 3+ messages in thread
From: Aníbal Limón @ 2017-06-27 16:30 UTC (permalink / raw)
To: openembedded-core
In order to avoid corrupt local.conf and bblayers.conf adds
signal handler for SIGTERM and use try/finally (KeyboardIntrrupt) block
to restore previously backuped configuration.
[YOCTO #11650]
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
meta/lib/oeqa/selftest/case.py | 36 +++++++------
meta/lib/oeqa/selftest/context.py | 107 +++++++++++++++++++++++++++-----------
2 files changed, 97 insertions(+), 46 deletions(-)
diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index 31a11fddda9..871009c568b 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -13,28 +13,34 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var
from oeqa.core.case import OETestCase
class OESelftestTestCase(OETestCase):
- builddir = os.environ.get("BUILDDIR") or ""
- localconf_path = os.path.join(builddir, "conf/local.conf")
- localconf_backup = os.path.join(builddir, "conf/local.bk")
- testinc_path = os.path.join(builddir, "conf/selftest.inc")
- local_bblayers_path = os.path.join(builddir, "conf/bblayers.conf")
- local_bblayers_backup = os.path.join(builddir, "conf/bblayers.bk")
- testinc_bblayers_path = os.path.join(builddir, "conf/bblayers.inc")
- machineinc_path = os.path.join(builddir, "conf/machine.inc")
-
def __init__(self, methodName="runTest"):
self._extra_tear_down_commands = []
- self._track_for_cleanup = [
- self.testinc_path, self.testinc_bblayers_path,
- self.machineinc_path, self.localconf_backup,
- self.local_bblayers_backup]
-
super(OESelftestTestCase, self).__init__(methodName)
@classmethod
def setUpClass(cls):
super(OESelftestTestCase, cls).setUpClass()
- cls.testlayer_path = cls.tc.testlayer_path
+
+ cls.testlayer_path = cls.tc.config_paths['testlayer_path']
+ cls.builddir = cls.tc.config_paths['builddir']
+
+ cls.localconf_path = cls.tc.config_paths['localconf']
+ cls.localconf_backup = cls.tc.config_paths['localconf_class_backup']
+ cls.local_bblayers_path = cls.tc.config_paths['bblayers']
+ cls.local_bblayers_backup = cls.tc.config_paths['bblayers_class_backup']
+
+ cls.testinc_path = os.path.join(cls.tc.config_paths['builddir'],
+ "conf/selftest.inc")
+ cls.testinc_bblayers_path = os.path.join(cls.tc.config_paths['builddir'],
+ "conf/bblayers.inc")
+ cls.machineinc_path = os.path.join(cls.tc.config_paths['builddir'],
+ "conf/machine.inc")
+
+ cls._track_for_cleanup = [
+ cls.testinc_path, cls.testinc_bblayers_path,
+ cls.machineinc_path, cls.localconf_backup,
+ cls.local_bblayers_backup]
+
cls.add_include()
@classmethod
diff --git a/meta/lib/oeqa/selftest/context.py b/meta/lib/oeqa/selftest/context.py
index ca87398224c..8a7ee26cd91 100644
--- a/meta/lib/oeqa/selftest/context.py
+++ b/meta/lib/oeqa/selftest/context.py
@@ -6,6 +6,8 @@ import time
import glob
import sys
import imp
+import signal
+from shutil import copyfile
from random import choice
import oeqa
@@ -16,13 +18,12 @@ from oeqa.core.exception import OEQAPreRun
from oeqa.utils.commands import runCmd, get_bb_vars, get_test_layer
class OESelftestTestContext(OETestContext):
- def __init__(self, td=None, logger=None, machines=None, testlayer_path=None):
+ def __init__(self, td=None, logger=None, machines=None, config_paths=None):
super(OESelftestTestContext, self).__init__(td, logger)
self.machines = machines
self.custommachine = None
-
- self.testlayer_path = testlayer_path
+ self.config_paths = config_paths
def runTests(self, machine=None):
if machine:
@@ -108,7 +109,29 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
self.tc_kwargs['init']['td'] = get_bb_vars()
self.tc_kwargs['init']['machines'] = self._get_available_machines()
- self.tc_kwargs['init']['testlayer_path'] = get_test_layer()
+
+ builddir = os.environ.get("BUILDDIR")
+ self.tc_kwargs['init']['config_paths'] = {}
+ self.tc_kwargs['init']['config_paths']['testlayer_path'] = \
+ get_test_layer()
+ self.tc_kwargs['init']['config_paths']['builddir'] = builddir
+ self.tc_kwargs['init']['config_paths']['localconf'] = \
+ os.path.join(builddir, "conf/local.conf")
+ self.tc_kwargs['init']['config_paths']['localconf_backup'] = \
+ os.path.join(builddir, "conf/local.conf.orig")
+ self.tc_kwargs['init']['config_paths']['localconf_class_backup'] = \
+ os.path.join(builddir, "conf/local.conf.bk")
+ self.tc_kwargs['init']['config_paths']['bblayers'] = \
+ os.path.join(builddir, "conf/bblayers.conf")
+ self.tc_kwargs['init']['config_paths']['bblayers_backup'] = \
+ os.path.join(builddir, "conf/bblayers.conf.orig")
+ self.tc_kwargs['init']['config_paths']['bblayers_class_backup'] = \
+ os.path.join(builddir, "conf/bblayers.conf.bk")
+
+ copyfile(self.tc_kwargs['init']['config_paths']['localconf'],
+ self.tc_kwargs['init']['config_paths']['localconf_backup'])
+ copyfile(self.tc_kwargs['init']['config_paths']['bblayers'],
+ self.tc_kwargs['init']['config_paths']['bblayers_backup'])
def _pre_run(self):
def _check_required_env_variables(vars):
@@ -131,7 +154,7 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
runCmd("bitbake-layers add-layer %s" %meta_selftestdir)
# reload data is needed because a meta-selftest layer was add
self.tc.td = get_bb_vars()
- self.tc.testlayer_path = get_test_layer()
+ self.tc.config_paths['testlayer_path'] = get_test_layer()
else:
self.tc.logger.error("could not locate meta-selftest in:\n%s" % meta_selftestdir)
raise OEQAPreRun
@@ -184,41 +207,63 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
rc.logSummary(self.name)
return rc
+
+ def _signal_clean_handler(self, signum, frame):
+ config_paths = self.tc_kwargs['init']['config_paths']
+ if os.path.exists(config_paths['localconf_backup']):
+ copyfile(config_paths['localconf_backup'],
+ config_paths['localconf'])
+ os.remove(config_paths['localconf_backup'])
+
+ if os.path.exists(config_paths['bblayers_backup']):
+ copyfile(config_paths['bblayers_backup'],
+ config_paths['bblayers'])
+ os.remove(config_paths['bblayers_backup'])
+
+ if os.path.exists(config_paths['localconf_class_backup']):
+ os.remove(config_paths['localconf_class_backup'])
+ if os.path.exists(config_paths['bblayers_class_backup']):
+ os.remove(config_paths['bblayers_class_backup'])
def run(self, logger, args):
self._process_args(logger, args)
- rc = None
- if args.machine:
- logger.info('Custom machine mode enabled. MACHINE set to %s' %
- args.machine)
+ signal.signal(signal.SIGTERM, self._signal_clean_handler)
- if args.machine == 'all':
- results = []
- for m in self.tc_kwargs['init']['machines']:
- self.tc_kwargs['run']['machine'] = m
- results.append(self._internal_run(logger, args))
+ rc = None
+ try:
+ if args.machine:
+ logger.info('Custom machine mode enabled. MACHINE set to %s' %
+ args.machine)
+
+ if args.machine == 'all':
+ results = []
+ for m in self.tc_kwargs['init']['machines']:
+ self.tc_kwargs['run']['machine'] = m
+ results.append(self._internal_run(logger, args))
+
+ # XXX: the oe-selftest script only needs to know if one
+ # machine run fails
+ for r in results:
+ rc = r
+ if not r.wasSuccessful():
+ break
- # XXX: the oe-selftest script only needs to know if one
- # machine run fails
- for r in results:
- rc = r
- if not r.wasSuccessful():
- break
+ else:
+ self.tc_kwargs['run']['machine'] = args.machine
+ return self._internal_run(logger, args)
else:
self.tc_kwargs['run']['machine'] = args.machine
- return self._internal_run(logger, args)
-
- else:
- self.tc_kwargs['run']['machine'] = args.machine
- rc = self._internal_run(logger, args)
-
- output_link = os.path.join(os.path.dirname(args.output_log),
- "%s-results.log" % self.name)
- if os.path.exists(output_link):
- os.remove(output_link)
- os.symlink(args.output_log, output_link)
+ rc = self._internal_run(logger, args)
+ finally:
+ output_link = os.path.join(os.path.dirname(args.output_log),
+ "%s-results.log" % self.name)
+ if os.path.exists(output_link):
+ os.remove(output_link)
+ os.symlink(args.output_log, output_link)
+
+ self._signal_clean_handler(None, None)
return rc
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCHv2 2/2] selftest/cases/package: Call parent setUpClass method
2017-06-27 16:30 [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Aníbal Limón
@ 2017-06-27 16:30 ` Aníbal Limón
2017-06-27 18:43 ` [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Patrick Ohly
1 sibling, 0 replies; 3+ messages in thread
From: Aníbal Limón @ 2017-06-27 16:30 UTC (permalink / raw)
To: openembedded-core
Since config paths are now passed in Test context the setUpClass
method is expected to be call.
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
meta/lib/oeqa/selftest/cases/package.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/meta/lib/oeqa/selftest/cases/package.py b/meta/lib/oeqa/selftest/cases/package.py
index 5b9a6d15851..b07d6ed0abe 100644
--- a/meta/lib/oeqa/selftest/cases/package.py
+++ b/meta/lib/oeqa/selftest/cases/package.py
@@ -17,6 +17,8 @@ class VersionOrdering(OESelftestTestCase):
@classmethod
def setUpClass(cls):
+ super(VersionOrdering, cls).setUpClass()
+
# Build the tools we need and populate a sysroot
bitbake("dpkg-native opkg-native rpm-native python3-native")
bitbake("build-sysroots -c build_native_sysroot")
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM
2017-06-27 16:30 [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Aníbal Limón
2017-06-27 16:30 ` [PATCHv2 2/2] selftest/cases/package: Call parent setUpClass method Aníbal Limón
@ 2017-06-27 18:43 ` Patrick Ohly
1 sibling, 0 replies; 3+ messages in thread
From: Patrick Ohly @ 2017-06-27 18:43 UTC (permalink / raw)
To: Aníbal Limón; +Cc: openembedded-core
On Tue, 2017-06-27 at 11:30 -0500, Aníbal Limón wrote:
> In order to avoid corrupt local.conf and bblayers.conf adds
> signal handler for SIGTERM and use try/finally (KeyboardIntrrupt) block
> to restore previously backuped configuration.
Thanks for pointing out that SIGTERM isn't going through the "finally"
block - I thought it would, hence my previous question.
However, in this incarnation of your patch there's now cleanup code in
various places. Would it be perhaps cleaner to just raise a suitable
exception in the signal handler and leave all the cleanup code in the
"finally" block?
--
Best Regards, Patrick Ohly
The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-06-27 18:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-27 16:30 [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Aníbal Limón
2017-06-27 16:30 ` [PATCHv2 2/2] selftest/cases/package: Call parent setUpClass method Aníbal Limón
2017-06-27 18:43 ` [PATCHv2 1/2] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM Patrick Ohly
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.