The problem with this example is that it hasn't been fully pruned and
tested, there are import errors and undefined variable errors
everywhere. I did try to clean up the file, but now I can't seem to
get the test list to be filtered appropriately, that is, all dicts
from all hosts are generated by default. I've sent the version I tried
to clean up to the ML, so please pick it up and make it work the way
you intended.

Cheers,

Lucas

On Thu, Feb 21, 2013 at 9:38 AM, Yiqiao Pu <[email protected]> wrote:
> This is an example for set up params based on kernel version defined
> in a cfg file named host-kernel.cfg. The main function for package
> check(package_check) is in the control.kernel-version. Take
> this as an example as kernel is a very important part in kvm test
> and will decide a set of common parameters using in the cases. You
> can also setup yourself host-package.cfg for different type of tests
> in the same way.
>
> Signed-off-by: Yiqiao Pu <[email protected]>
> ---
>  qemu/contrib/control.kernel-version |  166 
> +++++++++++++++++++++++++++++++++++
>  qemu/contrib/host-kernel.cfg        |   50 +++++++++++
>  2 files changed, 216 insertions(+), 0 deletions(-)
>  create mode 100644 qemu/contrib/control.kernel-version
>  create mode 100644 qemu/contrib/host-kernel.cfg
>
> diff --git a/qemu/contrib/control.kernel-version 
> b/qemu/contrib/control.kernel-version
> new file mode 100644
> index 0000000..fd05d41
> --- /dev/null
> +++ b/qemu/contrib/control.kernel-version
> @@ -0,0 +1,166 @@
> +# This file can be used for the cases have requirements for host kernel
> +# version and packages installed.
> +
> +
> +def package_check(dict_test):
> +    """
> +    Check if the package request in case installed in host.
> +
> +    @dict_test: dict for test case
> +    @return: Boolean value for have the packages or not
> +    """
> +    failed_message = ""
> +    for package in dict_test.get("required_packages", "").split():
> +        package_check_cmd = dict_test.get("package_check_cmd_%s" % package,
> +                                      "rpm -q --provides PACKNAME")
> +        package_version_pattern = dict_test.get("package_version_pattern_%s" 
> % package,
> +                                             "PACKNAME\s+=.*:(.*)")
> +        package_check_cmd = re.sub("PACKNAME", package, package_check_cmd)
> +        s, o = commands.getstatusoutput(package_check_cmd)
> +        if s != 0:
> +            failed_message += "%s not installed.\n" % package
> +            continue
> +
> +        version_pattern = re.sub("PACKNAME", package, 
> package_version_pattern)
> +        packge_version = re.findall(version_pattern, o)
> +        if packge_version:
> +            packge_version = packge_version[0].strip()
> +        else:
> +            failed_message += "Can not get version info."
> +            failed_message += " Please check your pattern and command."
> +            continue
> +
> +
> +        if dict_test.get("requires_%s" % package):
> +            package_requires = eval(dict_test.get("requires_%s" % package))
> +            if isinstance(package_requires, list):
> +                package_requires = (package_requires,)
> +            for requires in package_requires:
> +                pass_flag = False
> +                for require in requires:
> +                    op = re.findall("[>=<!]+", require)[0]
> +                    ver = re.sub(op, "", require)
> +                    compare_str = "version.LooseVersion('%s') " % 
> packge_version
> +                    compare_str += "%s " % op
> +                    compare_str += "version.LooseVersion('%s')" % ver.strip()
> +                    if not eval(compare_str):
> +                        break
> +                else:
> +                    pass_flag = True
> +
> +            if not pass_flag:
> +                failed_message += "%s in system is" % package
> +                failed_message += " not fit the requires for test.\n"
> +                failed_message += "require is: %s\n" % str(package_requires)
> +                failed_message += "system is: %s\n" % packge_version
> +
> +    if failed_message:
> +        print failed_message
> +        return False
> +
> +    return True
> +
> +
> +AUTHOR = """
> [email protected] (Uri Lublin)
> [email protected] (Dror Russo)
> [email protected] (Michael Goldish)
> [email protected] (David Huff)
> [email protected] (Alexey Eromenko)
> [email protected] (Mike Burns)
> +"""
> +TIME = 'MEDIUM'
> +NAME = 'QEMU (KVM) Test'
> +TEST_TYPE = 'client'
> +TEST_CLASS = 'Virtualization'
> +TEST_CATEGORY = 'Functional'
> +
> +DOC = """
> +Executes the QEMU (accelerated via KVM) test framework on a given host.
> +This module is separated in minor functions, that execute different tests for
> +doing Quality Assurance on KVM (both kernelspace and userspace) code.
> +
> +Online docs: https://github.com/autotest/virt-test/wiki
> +"""
> +
> +import sys, os, logging
> +virt_test_dir = os.path.join(os.environ['AUTODIR'],'tests/virt')
> +sys.path.insert(0, virt_test_dir)
> +from virttest import utils_misc, cartesian_config
> +
> +# set English environment (command output might be localized, need to be 
> safe)
> +os.environ['LANG'] = 'en_US.UTF-8'
> +
> +filter_str = """
> +# This string will be parsed after build.cfg.  Make any desired changes to 
> the
> +# build configuration here.  For example (to install from koji/brew):
> +# installers = koji_qemu_kvm
> +"""
> +
> +parser = cartesian_config.Parser()
> +qemu_test_dir = os.path.join(os.environ['AUTODIR'],'tests/virt/qemu')
> +parser.parse_file(os.path.join(qemu_test_dir, "cfg", "build.cfg"))
> +parser.parse_string(filter_str)
> +if not utils_misc.run_tests(parser, job):
> +    logging.error("QEMU build step failed, exiting.")
> +    sys.exit(1)
> +
> +filter_str = """
> +# This string will be parsed after tests.cfg.  Make any desired changes to 
> the
> +# test configuration here.  For example:
> +#display = sdl
> +#install, setup: timeout_multiplier = 3
> +"""
> +
> +parser = cartesian_config.Parser()
> +parser.parse_file(os.path.join(qemu_test_dir, "cfg", "tests.cfg"))
> +
> +if args:
> +    # We get test parameters from command line
> +    for arg in args:
> +        try:
> +            (key, value) = re.findall("^(\w+)=(.*)", arg)[0]
> +            if key == "only":
> +                filter_str += "only %s\n" % value
> +            elif key == "no":
> +                filter_str += "no %s\n" % value
> +            else:
> +                filter_str += "%s = %s\n" % (key, value)
> +        except IndexError:
> +            pass
> +
> +#Get the kernel version and package requirements filter strings
> +host_kernel_ver_str = ""
> +host_kernel_ver_file = "/tmp/host_kernel_version"
> +for i in parser.get_dicts():
> +    if (i.get("packages_require") and not package_check(i)):
> +        filter_str += "no %s\n" % dict_test['name']
> +        logging.warning("Skip case '%s' for package "
> +                        "missing." % dict_test['name'])
> +
> +    if i.get("requires_kernel") and not host_kernel_ver_str:
> +        if i.get("pre_check_cmd"):
> +            s, o = commands.getstatusoutput(i.get("pre_check_cmd"))
> +            if s != 0:
> +                print "Prepare check failed for %s" % i.get("kernel_ver_str")
> +                continue
> +        if os.path.isfile(host_kernel_ver_file):
> +            kervel_version = open(host_kernel_ver_file, "r")
> +            host_kernel_ver_str = kervel_version.read()
> +            kervel_version.close()
> +        else:
> +            host_dict = i.copy()
> +            host_dict["required_packages"] = "kernel"
> +            if package_check(host_dict):
> +                host_kernel_ver_str = "only %s\n" %\
> +                                      host_dict.get("kernel_ver_str")
> +                kervel_version = open(host_kernel_ver_file, "w")
> +                kervel_version.write(host_kernel_ver_str)
> +                kervel_version.close()
> +
> +filter_str += host_kernel_ver_str
> +
> +parser.parse_string(filter_str)
> +
> +
> +utils_misc.run_tests(parser, job)
> diff --git a/qemu/contrib/host-kernel.cfg b/qemu/contrib/host-kernel.cfg
> new file mode 100644
> index 0000000..169c4a6
> --- /dev/null
> +++ b/qemu/contrib/host-kernel.cfg
> @@ -0,0 +1,50 @@
> +# Host kernel related parameters
> +# Here will set up a set up prameters for the test based on the different
> +# kerenl installed in RHEL system. You can also make different one like this
> +# based on other packages in the system in your test.
> +
> +package_check_cmd_kernel = uname -r
> +package_version_pattern_kernel = [\.\-\_\w\d]+
> +
> +# Host
> +variants:
> +    - @Host_default:
> +        host_ver_str = Host_default
> +        requires_kernel = ["< 2.6.18-274"], [">2.6.19", "<2.6.32-131"], 
> [">2.6.33", "<3.2.1-0.8"]
> +    - Host_RHEL:
> +        pre_check_cmd = "grep 'Red Hat Enterprise Linux' /etc/redhat-release"
> +        host_ver_str = Host_RHEL
> +        variants:
> +            - 5:
> +                monitor_type = human
> +                monitors = humanmonitor1
> +                main_monitor = humanmonitor1
> +                variants:
> +                    - 7:
> +                        host_ver_str += ".7"
> +                        requires_kernel = [">= 2.6.18-274", "<  2.6.18-308"]
> +                    - 8:
> +                        host_ver_str += ".8"
> +                        requires_kernel = [">= 2.6.18-308", "<  2.6.18-309"]
> +                    - 9:
> +                        host_ver_str += ".9"
> +                        requires_kernel = [">= 2.6.18-309", "<  2.6.19"]
> +            - 6:
> +                # RHEL-6 pointer
> +                netdev_peer_re = "\s{2,}(.*?):.*?peer=(.*?)\s"
> +                ksm_base:
> +                    status_query_cmd = "cat /sys/kernel/mm/ksm/run"
> +                    setup_cmd = "echo 1 > /sys/kernel/mm/ksm/run"
> +                    query_cmd = "cat /sys/kernel/mm/ksm/pages_sharing"
> +                virtio_net:
> +                    vhost = "vhost=on"
> +                variants:
> +                    - 1:
> +                        host_ver_str += ".1"
> +                        requires_kernel = [">= 2.6.32-131", "<  2.6.32-220"]
> +                    - 2:
> +                        host_ver_str += ".2"
> +                        requires_kernel = [">= 2.6.32-220", "<  2.6.32-279"]
> +                    - 3:
> +                        host_ver_str += ".3"
> +                        requires_kernel = [">= 2.6.32-279", "<  2.6.32-280"]
> --
> 1.7.7.6
>
> _______________________________________________
> Virt-test-devel mailing list
> [email protected]
> https://www.redhat.com/mailman/listinfo/virt-test-devel



-- 
Lucas

_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to