From: Amos Kong <ak...@redhat.com>

This test uses 'hdparm' to set disk device to low/high
performance status, and compare the reading speed.
The emulated device should pass all the tests.

Changes from v1:
 * Little changes in message wording
 * Better logging of hdparm messages (better looking logs)
 * Proper printing of average speeds (.2f rather than s)

Signed-off-by: Feng Yang <fy...@redhat.com>
Signed-off-by: Amos Kong <ak...@redhat.com>
---
 client/tests/kvm/tests/hdparm.py       |   89 ++++++++++++++++++++++++++++++++
 client/tests/kvm/tests_base.cfg.sample |   13 +++++
 2 files changed, 102 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/tests/hdparm.py

diff --git a/client/tests/kvm/tests/hdparm.py b/client/tests/kvm/tests/hdparm.py
new file mode 100644
index 0000000..9092fc7
--- /dev/null
+++ b/client/tests/kvm/tests/hdparm.py
@@ -0,0 +1,89 @@
+import re, logging
+from autotest_lib.client.common_lib import error
+
+
+@error.context_aware
+def run_hdparm(test, params, env):
+    """
+    Test hdparm setting on linux guest os. This case will:
+    1) Set/record parameters value of hard disk to low performance status.
+    2) Perform device/cache read timings then record the results.
+    3) Set/record parameters value of hard disk to high performance status.
+    4) Perform device/cache read timings then compare two results.
+
+    @param test: KVM test object.
+    @param params: Dictionary with the test parameters.
+    @param env: Dictionary with test environment.
+    """
+    def check_setting_result(set_cmd, timeout):
+        params = re.findall("(-[a-zA-Z])([0-9]*)", set_cmd)
+        disk = re.findall("(\/+[a-z]*\/[a-z]*$)", set_cmd)[0]
+        for (param, value) in params:
+            cmd = "hdparm %s %s" % (param, disk)
+            (s, output) = session.cmd_status_output(cmd, timeout)
+            if s != 0:
+                raise error.TestError("Fail to get %s parameter value. "
+                                      "Output is:\n%s" % (param, 
output.strip()))
+            if value not in output:
+                 raise error.TestFail("Fail to set %s parameter to value: %s"
+                                      % (param, value))
+
+
+    def perform_read_timing(disk, timeout, num=5):
+        results = 0
+        for i in range(num):
+            cmd = params.get("device_cache_read_cmd") % disk
+            (s, output) = session.cmd_status_output(cmd, timeout)
+            if s != 0:
+                raise error.TestFail("Fail to perform device/cache read"
+                                     " timings \nOutput is: %s\n" % output)
+            logging.info("Output of device/cache read timing check (%s of %s):"
+                         % (i + 1, num))
+            for line in output.strip().splitlines():
+                logging.info(line)
+            (result, unit) = re.findall("= *([0-9]*.+[0-9]*) ([a-zA-Z]*)",
+                             output)[1]
+            if unit == "kB":
+                result = float(result)/1024.0
+            results += float(result)
+        return results/num
+
+
+    vm = env.get_vm(params["main_vm"])
+    vm.create()
+    session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
+    try:
+        timeout = float(params.get("cmd_timeout", 60))
+        cmd = params.get("get_disk_cmd")
+        output = session.cmd(cmd)
+        disk = output.strip()
+
+        error.context("Setting hard disk to lower performance")
+        cmd = params.get("low_status_cmd") % disk
+        session.cmd(cmd, timeout)
+
+        error.context("Checking hard disk keyval under lower performance "
+                      "settings")
+        check_setting_result(cmd, timeout)
+        low_result = perform_read_timing(disk, timeout)
+        logging.info("Average buffered disk read speed under low performance "
+                     "settings: %.2f MB/sec" % low_result)
+
+        error.context("Setting hard disk to higher performance")
+        cmd = params.get("high_status_cmd") % disk
+        session.cmd(cmd, timeout)
+
+        error.context("Checking hard disk keyval under higher performance "
+                      "settings")
+        check_setting_result(cmd, timeout)
+        high_result = perform_read_timing(disk, timeout)
+        logging.info("Average buffered disk read speed under high performance "
+                     "settings: %.2f MB/sec" % high_result)
+
+        if not float(high_result) > float(low_result):
+            raise error.TestFail("High performance setting does not "
+                                 "increase read speed\n")
+
+    finally:
+        if session:
+            session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample 
b/client/tests/kvm/tests_base.cfg.sample
index 5012a46..acd9883 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -1137,6 +1137,19 @@ variants:
         fdisk_string = "10 MB, 10485760 bytes"
         only Linux
 
+    - hdparm:
+        type = hdparm
+        get_disk_cmd = \ls /dev/[vhs]da
+        low_status_cmd = hdparm -a64 -d0 -u0 %s
+        device_cache_read_cmd = hdparm -tT %s
+        high_status_cmd = hdparm -a256 -d1 -u1 %s
+        cmd_timeout = 540
+        only Linux
+        virtio_blk:
+            get_disk_cmd = \ls /dev/vda
+            low_status_cmd = hdparm -a32 -r0 %s
+            high_status_cmd = hdparm -a256 -r1 %s
+
 
 # NICs
 variants:
-- 
1.7.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to