[OE-core] [PATCH 1/1] scripts/oe-selftest: oe-selftest-internal wrapper scripts that isolates execution

Leonardo Sandoval leonardo.sandoval.gonzalez at linux.intel.com
Thu Nov 9 17:22:17 UTC 2017


On Thu, 26 Oct 2017 10:33:19 -0700
leonardo.sandoval.gonzalez at linux.intel.com wrote:

RP indicated two scenarios that this v1 won't work:

1) if oe-selftest comes from a tarball (together with the other repo files)
2) if other no-poky layers are present on current BBLAYERS.

I will review both items and send a v2.

Leo


> From: Leonardo Sandoval <leonardo.sandoval.gonzalez at linux.intel.com>
> 
> The main idea is to isolate the oe-selftest execution so neither the current
> build dir nor the configuration data is touch/polluted. This approach uses
> a wrapper script (which is the one presented on this commit) which creates
> a unique directory and inside it does a shallow of repo(s) (OE-Core and Bitbake),
> re-initializes the enviroment (re-sources oe-init-build-env) and finally launches
> the oe-selftest-internal (which used to be oe-selftest) command, passing command
> arguments to the latter.
> 
> The new build directory created when re-initializing the enviroment has the
> same configuration data (local.conf, auto.conf, site.conf) as the
> main build directory. The latter means that one can set DL_DIR and SSTATE_DIR
> into <main build dir>/conf/site.conf and the oe-selftest execution will use this.
> 
> [YOCTO #11429]
> 
> Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez at linux.intel.com>
> ---
>  scripts/oe-selftest          | 102 +++++++++++++++++++++++--------------------
>  scripts/oe-selftest-internal |  75 +++++++++++++++++++++++++++++++
>  2 files changed, 129 insertions(+), 48 deletions(-)
>  create mode 100755 scripts/oe-selftest-internal
> 
> diff --git a/scripts/oe-selftest b/scripts/oe-selftest
> index 1bf860a415..f3ce89cedb 100755
> --- a/scripts/oe-selftest
> +++ b/scripts/oe-selftest
> @@ -1,5 +1,7 @@
> -#!/usr/bin/env python3
> +#!/bin/sh
>  
> +# scripts/oe-selftest: calls oe-selftest-internal in a isolated environment
> +#
>  # Copyright (c) 2013-2017 Intel Corporation
>  #
>  # This program is free software; you can redistribute it and/or modify
> @@ -14,62 +16,66 @@
>  # You should have received a copy of the GNU General Public License along
>  # with this program; if not, write to the Free Software Foundation, Inc.,
>  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +
> +# Variable definitions
> +ORIGBUILDDIR="$BUILDDIR"
> +OESELFTESTSCRIPTDIR="$(which oe-selftest)"
> +SCRIPTSDIR="$(dirname $OESELFTESTSCRIPTDIR)"
> +OECOREDIR="$(dirname $SCRIPTSDIR)"
> +
> +# oe-selftest-$$ related
> +OESELFTESTDIR="$ORIGBUILDDIR/oe-selftest-$$"
> +OESELFTESTOECOREDIR="$OESELFTESTDIR/openembedded-core"
> +OESELFTESTBUILDDIR="$OESELFTESTDIR/openembedded-core/build"
> +TEMPLATEPATH="$OESELFTESTDIR/template/conf"
>  
> -# DESCRIPTION
> -# This script runs tests defined in meta/lib/oeqa/selftest/
> -# It's purpose is to automate the testing of different bitbake tools.
> -# To use it you just need to source your build environment setup script and
> -# add the meta-selftest layer to your BBLAYERS.
> -# Call the script as: "oe-selftest -a" to run all the tests in meta/lib/oeqa/selftest/
> -# Call the script as: "oe-selftest -r <module>.<Class>.<method>" to run just a single test
> -# E.g: "oe-selftest -r bblayers.BitbakeLayers" will run just the BitbakeLayers class from meta/lib/oeqa/selftest/bblayers.py
> +# 0. Return immediately in case no test execution
> +ADDTESTS="$(echo "$@" | grep -i '\-a')"
> +SOMETESTS="$(echo "$@" | grep -i '\-r')"
> +if [ -z "$ADDTESTS" -a -z "$SOMETESTS" ]; then
> +    if [ -z "$@" ]; then
> +	oe-selftest-internal -h
> +    else
> +	oe-selftest-internal "$@"
> +    fi
> +    exit 0
> +fi
>  
> +# 1. All work will be done under OESELFTESTDIR
> +mkdir $OESELFTESTDIR && cd $OESELFTESTDIR
>  
> +# 2.1 Shallow clone OE-Core
> +git clone file://$OECOREDIR --depth 1 $OESELFTESTOECOREDIR
>  
> -import os
> -import sys
> -import argparse
> -import logging
> +# 2.2 Shallow clone bitbake if necessary (if OE-Core is embedded on a combo repo, like Poky, there is no need)
> +if [ ! -d "$OESELFTESTOECOREDIR/bitbake" ]; then
> +    git clone file://$OECOREDIR/bitbake --depth 1 $OESELFTESTOECOREDIR/bitbake
> +fi
>  
> -scripts_path = os.path.dirname(os.path.realpath(__file__))
> -lib_path = scripts_path + '/lib'
> -sys.path = sys.path + [lib_path]
> -import argparse_oe
> -import scriptutils
> -import scriptpath
> -scriptpath.add_oe_lib_path()
> -scriptpath.add_bitbake_lib_path()
> +# 3. Template: create template directory based on BUILDIR/conf/local.conf
> +mkdir -p $TEMPLATEPATH
> +cp $ORIGBUILDDIR/conf/local.conf $TEMPLATEPATH/local.conf.sample
>  
> -from oeqa.utils import load_test_components
> -from oeqa.core.exception import OEQAPreRun
> +# 4. re-initialized environment with new metadata and templateconf environement
> +cd $OESELFTESTOECOREDIR
> +export TEMPLATEPATH && source ./oe-init-build-env $OESELFTESTBUILDDIR
>  
> -logger = scriptutils.logger_create('oe-selftest', stream=sys.stdout)
> +# 5. Respect any site.conf and/or auto.conf and place it into conf directory
> +if [ -r "$ORIGBUILDDIR/conf/site.conf" ]; then
> +    cp -f $ORIGBUILDDIR/conf/site.conf $OESELFTESTBUILDDIR/conf
> +fi
> +if [ -r "$ORIGBUILDDIR/conf/auto.conf" ]; then
> +    cp -f $ORIGBUILDDIR/conf/auto.conf $OESELFTESTBUILDDIR/conf
> +fi
>  
> -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."
> -    parser = argparse_oe.ArgumentParser(description=description)
> +# 6. Execute the tests throught oe-selftest-internal
> +oe-selftest-internal "$@"
>  
> -    comp_name, comp = load_test_components(logger, 'oe-selftest').popitem()
> -    comp.register_commands(logger, parser)
> +OESELFTESTRC="$?"
>  
> -    try:
> -        args = parser.parse_args()
> -        results = args.func(logger, args)
> -        ret = 0 if results.wasSuccessful() else 1
> -    except SystemExit as err:
> -        if err.code != 0:
> -            raise err
> -        ret = err.code
> -    except OEQAPreRun as pr:
> -        ret = 1
> +# 7. Echo working folder
>  
> -    return ret
> +echo -e "\nAll work done under $OESELFTESTDIR\n"
>  
> -if __name__ == '__main__':
> -    try:
> -        ret = main()
> -    except Exception:
> -        ret = 1
> -        import traceback
> -        traceback.print_exc()
> -    sys.exit(ret)
> +exit $OESELFTESTRC
> diff --git a/scripts/oe-selftest-internal b/scripts/oe-selftest-internal
> new file mode 100755
> index 0000000000..cff2906763
> --- /dev/null
> +++ b/scripts/oe-selftest-internal
> @@ -0,0 +1,75 @@
> +#!/usr/bin/env python3
> +
> +# Copyright (c) 2013-2017 Intel Corporation
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License version 2 as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License along
> +# with this program; if not, write to the Free Software Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +
> +# DESCRIPTION
> +# This script runs tests defined in meta/lib/oeqa/selftest/
> +# It's purpose is to automate the testing of different bitbake tools.
> +# To use it you just need to source your build environment setup script and
> +# add the meta-selftest layer to your BBLAYERS.
> +# Call the script as: "oe-selftest -a" to run all the tests in meta/lib/oeqa/selftest/
> +# Call the script as: "oe-selftest -r <module>.<Class>.<method>" to run just a single test
> +# E.g: "oe-selftest -r bblayers.BitbakeLayers" will run just the BitbakeLayers class from meta/lib/oeqa/selftest/bblayers.py
> +
> +
> +
> +import os
> +import sys
> +import argparse
> +import logging
> +
> +scripts_path = os.path.dirname(os.path.realpath(__file__))
> +lib_path = scripts_path + '/lib'
> +sys.path = sys.path + [lib_path]
> +import argparse_oe
> +import scriptutils
> +import scriptpath
> +scriptpath.add_oe_lib_path()
> +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)
> +
> +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."
> +    parser = argparse_oe.ArgumentParser(prog='oe-selftest', description=description)
> +
> +    comp_name, comp = load_test_components(logger, 'oe-selftest').popitem()
> +    comp.register_commands(logger, parser)
> +
> +    try:
> +        args = parser.parse_args()
> +        results = args.func(logger, args)
> +        ret = 0 if results.wasSuccessful() else 1
> +    except SystemExit as err:
> +        if err.code != 0:
> +            raise err
> +        ret = err.code
> +    except OEQAPreRun as pr:
> +        ret = 1
> +
> +    return ret
> +
> +if __name__ == '__main__':
> +    try:
> +        ret = main()
> +    except Exception:
> +        ret = 1
> +        import traceback
> +        traceback.print_exc()
> +    sys.exit(ret)
> -- 
> 2.12.3
> 
> -- 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core



More information about the Openembedded-core mailing list