[OE-core] [PATCH 02/30] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM
Leonardo Sandoval
leonardo.sandoval.gonzalez at linux.intel.com
Wed Jul 12 14:18:19 UTC 2017
I saw a similar patch in the past. Is this a new revision?
Leo
On Tue, 2017-07-11 at 15:23 -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.
>
> [YOCTO #11650]
>
> Signed-off-by: Aníbal Limón <anibal.limon at 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..4575a0537fb 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):
> + sys.exit(1)
>
> 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:
> + 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'])
> +
> + 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)
>
> return rc
>
More information about the Openembedded-core
mailing list