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.

changes from v1:
  - fix the typo for host_kernel_version_str
  - add one parameter for whether print out the debug messages

Signed-off-by: Yiqiao Pu <[email protected]>
---
 qemu/contrib/control.kernel-version |  129 +++++++++++++++++++++++++++++++++++
 qemu/contrib/host-kernel.cfg        |   59 ++++++++++++++++
 2 files changed, 188 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..bf58805
--- /dev/null
+++ b/qemu/contrib/control.kernel-version
@@ -0,0 +1,129 @@
+AUTHOR = """
[email protected] (Yiqiao Pu)
+"""
+TIME = 'MEDIUM'
+NAME = 'QEMU (KVM) Test - Host autoconfig'
+TEST_TYPE = 'client'
+TEST_CLASS = 'Virtualization'
+TEST_CATEGORY = 'Functional'
+
+DOC = """
+Executes the QEMU (accelerated via KVM) test framework on a given host,
+adapting the tests executed to the host machine.
+
+Online docs: https://github.com/autotest/virt-test/wiki
+"""
+
+import sys, os, logging, re, commands
+from distutils import version
+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
+
+os.environ['LANG'] = 'en_US.UTF-8'
+
+
+def package_check(dict_test, verbose=False):
+    """
+    Check if the package request in case installed in host.
+
+    @dict_test: dict for test case
+    @verbose: print out the debug messages or not
+    @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)
+        package_version_pattern = dict_test.get("package_version_pattern_%s" %
+                                                package)
+        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 verbose:
+                        print compare_str
+                    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:
+        if verbose:
+            print failed_message
+        return False
+
+    return True
+
+qemu_test_dir = os.path.join(os.environ['AUTODIR'],'tests/virt/qemu')
+parser = cartesian_config.Parser()
+
+parser.parse_file(os.path.join(qemu_test_dir, "cfg", "tests-example.cfg"))
+parser.parse_file(os.path.join(qemu_test_dir, "cfg", "host-kernel.cfg"))
+
+host_kernel_ver_str = ""
+host_kernel_ver_file = "/tmp/host_kernel_version"
+
+filter_str = ""
+for dict_test in parser.get_dicts():
+    verbose = dict_test.get("host_check_verbose", "no") == "yes"
+    if (dict_test.get("packages_require") and
+        not package_check(dict_test, verbose=verbose)):
+        filter_str += "no %s\n" % dict_test['name']
+        logging.warning("Skip case '%s' due to package "
+                        "missing." % dict_test['name'])
+
+    if dict_test.get("requires_kernel") and not host_kernel_ver_str:
+        if dict_test.get("pre_check_cmd"):
+            s, o = commands.getstatusoutput(dict_test.get("pre_check_cmd"))
+            if s != 0:
+                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 = dict_test.copy()
+            host_dict["required_packages"] = "kernel"
+            if package_check(host_dict, verbose=verbose):
+                host_kernel_ver_str = ("only %s\n" %
+                                       host_dict.get("host_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..72b7651
--- /dev/null
+++ b/qemu/contrib/host-kernel.cfg
@@ -0,0 +1,59 @@
+# Host kernel related parameters
+# Here will set up a set up parameters for the test based on the different
+# kernel installed in RHEL system. You can also edit this to match other
+# packages in the host under test.
+
+package_check_cmd_kernel = uname -r
+package_version_pattern_kernel = [\.\-\_\w\d]+
+# Whether we will print out debug informations during the host check
+# The default value is no.
+# host_check_verbose = yes
+
+# Host
+variants:
+    - Host_Fedora:
+        pre_check_cmd = "grep 'Fedora' /etc/issue"
+        requires_kernel = []
+        host_kernel_ver_str = Host_Fedora
+    - Host_RHEL:
+        pre_check_cmd = "grep 'Red Hat Enterprise Linux' /etc/redhat-release"
+        host_kernel_ver_str = Host_RHEL
+        variants:
+            - 5:
+                host_kernel_ver_str += ".5"
+                monitor_type = human
+                monitors = humanmonitor1
+                main_monitor = humanmonitor1
+                variants:
+                    - 7:
+                        host_kernel_ver_str += ".7"
+                        requires_kernel = [">= 2.6.18-274", "<  2.6.18-308"]
+                    - 8:
+                        host_kernel_ver_str += ".8"
+                        requires_kernel = [">= 2.6.18-308", "<  2.6.18-309"]
+                    - 9:
+                        host_kernel_ver_str += ".9"
+                        requires_kernel = [">= 2.6.18-309", "<  2.6.19"]
+            - 6:
+                # RHEL-6 pointer
+                host_kernel_ver_str += ".6"
+                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_kernel_ver_str += ".1"
+                        requires_kernel = [">= 2.6.32-131", "<  2.6.32-220"]
+                    - 2:
+                        host_kernel_ver_str += ".2"
+                        requires_kernel = [">= 2.6.32-220", "<  2.6.32-279"]
+                    - 3:
+                        host_kernel_ver_str += ".3"
+                        requires_kernel = [">= 2.6.32-279", "<  2.6.32-280"]
+                    - 4:
+                        host_kernel_ver_str += ".4"
+                        requires_kernel = [">= 2.6.32-280", "<  2.6.33"]
-- 
1.7.7.6

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

Reply via email to