From: Yiqiao Pu <[email protected]>

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/cfg/host-kernel.cfg |  49 +++++++++++++++++++
 qemu/control.host-kernel | 125 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 174 insertions(+)
 create mode 100644 qemu/cfg/host-kernel.cfg
 create mode 100644 qemu/control.host-kernel

diff --git a/qemu/cfg/host-kernel.cfg b/qemu/cfg/host-kernel.cfg
new file mode 100644
index 0000000..222dd11
--- /dev/null
+++ b/qemu/cfg/host-kernel.cfg
@@ -0,0 +1,49 @@
+# 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]+
+
+# Host
+variants:
+    - Host_Fedora:
+        pre_check_cmd = "grep 'Fedora' /etc/issue"
+    - 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"]
diff --git a/qemu/control.host-kernel b/qemu/control.host-kernel
new file mode 100644
index 0000000..822bf9c
--- /dev/null
+++ b/qemu/control.host-kernel
@@ -0,0 +1,125 @@
+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):
+    """
+    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)
+        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())
+                    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:
+        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():
+    if (dict_test.get("packages_require") and not package_check(dict_test)):
+        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):
+                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)
-- 
1.8.1.4

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

Reply via email to