blob: 388049afbe20cb7d8f6560da29afd7c90087673e [file] [log] [blame]
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()