[OE-core] [PATCH 02/30] oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM

Aníbal Limón anibal.limon at linux.intel.com
Wed Jul 12 14:53:16 UTC 2017


Yes is the same,

Anibal

On 07/12/2017 09:18 AM, Leonardo Sandoval wrote:
> 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