Make sure we go through all tests available and record the failures.
Signed-off-by: Lucas Meneghel Rodrigues <[email protected]>
---
client/virt/tests/ethtool.py | 101 ++++++++++++++++++++++++++----------------
1 files changed, 63 insertions(+), 38 deletions(-)
diff --git a/client/virt/tests/ethtool.py b/client/virt/tests/ethtool.py
index fa9448e..45942a8 100644
--- a/client/virt/tests/ethtool.py
+++ b/client/virt/tests/ethtool.py
@@ -6,7 +6,7 @@ from autotest_lib.client.virt import virt_test_utils,
virt_utils, aexpect
def run_ethtool(test, params, env):
"""
- Test offload functions of ethernet device by ethtool
+ Test offload functions of ethernet device using ethtool
1) Log into a guest.
2) Initialize the callback of sub functions.
@@ -35,9 +35,11 @@ def run_ethtool(test, params, env):
}
o = session.cmd("ethtool -k %s" % ethname)
try:
- return re.findall("%s: (.*)" % feature_pattern.get(f_type), o)[0]
+ result = re.findall("%s: (.*)" % feature_pattern.get(f_type), o)[0]
+ logging.debug("(%s) %s: %s", ethname, f_type, result)
+ return result
except IndexError:
- logging.debug("Could not get %s status", f_type)
+ logging.debug("(%s) %s: failed to get status", ethname, f_type)
def ethtool_set(f_type, status):
@@ -47,7 +49,7 @@ def run_ethtool(test, params, env):
@param f_type: Offload type name
@param status: New status will be changed to
"""
- logging.info("Try to set %s %s", f_type, status)
+ logging.info("(%s) %s: set status %s", ethname, f_type, status)
if status not in ["off", "on"]:
return False
cmd = "ethtool -K %s %s %s" % (ethname, f_type, status)
@@ -55,28 +57,30 @@ def run_ethtool(test, params, env):
try:
session.cmd(cmd)
return True
- except Exception:
+ except aexpect.ShellCmdError, e:
+ logging.error(e)
return False
if ethtool_get(f_type) != status:
- logging.error("Fail to set %s %s", f_type, status)
+ logging.error("(%s) %s: set status %s failed", ethname, f_type,
+ status)
return False
return True
def ethtool_save_params():
- logging.info("Save ethtool configuration")
+ logging.info("Saving ethtool configuration")
for i in supported_features:
feature_status[i] = ethtool_get(i)
def ethtool_restore_params():
- logging.info("Restore ethtool configuration")
+ logging.info("Restoring ethtool configuration")
for i in supported_features:
ethtool_set(i, feature_status[i])
def compare_md5sum(name):
- logging.info("Compare md5sum of the files on guest and host")
+ logging.info("Comparing md5sum of the files on guest and host")
host_result = utils.hash_file(name, method="md5")
try:
o = session.cmd_output("md5sum %s" % name)
@@ -88,7 +92,7 @@ def run_ethtool(test, params, env):
return guest_result == host_result
- def transfer_file(src="guest"):
+ def transfer_file(src):
"""
Transfer file by scp, use tcpdump to capture packets, then check the
return string.
@@ -97,21 +101,24 @@ def run_ethtool(test, params, env):
@return: Tuple (status, error msg/tcpdump result)
"""
session2.cmd_output("rm -rf %s" % filename)
+
dd_cmd = ("dd if=/dev/urandom of=%s bs=1M count=%s" %
(filename, params.get("filesize")))
- failure = (False, "Failed to create file using dd, cmd: %s" % dd_cmd)
- logging.info("Creating file in source host, cmd: %s", dd_cmd)
+
+ failure = (False, "Failed to create file using: %s" % dd_cmd)
+
+ logging.info("Creating file in %s, cmd: %s", src, dd_cmd)
tcpdump_cmd = "tcpdump -lep -s 0 tcp -vv port ssh"
if src == "guest":
tcpdump_cmd += " and src %s" % guest_ip
- copy_files_from = vm.copy_files_from
+ copy_files_func = vm.copy_files_from
try:
session.cmd_output(dd_cmd, timeout=360)
except aexpect.ShellCmdError, e:
return failure
else:
tcpdump_cmd += " and dst %s" % guest_ip
- copy_files_from = vm.copy_files_to
+ copy_files_func = vm.copy_files_to
try:
utils.system(dd_cmd)
except error.CmdError, e:
@@ -119,34 +126,36 @@ def run_ethtool(test, params, env):
# only capture the new tcp port after offload setup
original_tcp_ports = re.findall("tcp.*:(\d+).*%s" % guest_ip,
- utils.system_output("/bin/netstat -nap"))
+ utils.system_output("/bin/netstat
-nap"))
+
for i in original_tcp_ports:
tcpdump_cmd += " and not port %s" % i
- logging.debug("Listen using command: %s", tcpdump_cmd)
+
+ logging.debug("Listening traffic using command: %s", tcpdump_cmd)
session2.sendline(tcpdump_cmd)
if not virt_utils.wait_for(
lambda:session.cmd_status("pgrep tcpdump") == 0,
30):
return (False, "Tcpdump process wasn't launched")
- logging.info("Start to transfer file")
+ logging.info("Transfering file %s from %s", filename, src)
try:
- copy_files_from(filename, filename)
+ copy_files_func(filename, filename)
except virt_utils.SCPError, e:
return (False, "File transfer failed (%s)" % e)
- logging.info("Transfer file completed")
+
session.cmd("killall tcpdump")
try:
tcpdump_string = session2.read_up_to_prompt(timeout=60)
except aexpect.ExpectError:
- return (False, "Fail to read tcpdump's output")
+ return (False, "Failed to read tcpdump's output")
if not compare_md5sum(filename):
- return (False, "Files' md5sum mismatched")
+ return (False, "Failure, md5sum mismatch")
return (True, tcpdump_string)
def tx_callback(status="on"):
- s, o = transfer_file(src="guest")
+ s, o = transfer_file("guest")
if not s:
logging.error(o)
return False
@@ -154,7 +163,7 @@ def run_ethtool(test, params, env):
def rx_callback(status="on"):
- s, o = transfer_file(src="host")
+ s, o = transfer_file("host")
if not s:
logging.error(o)
return False
@@ -162,7 +171,7 @@ def run_ethtool(test, params, env):
def so_callback(status="on"):
- s, o = transfer_file(src="guest")
+ s, o = transfer_file("guest")
if not s:
logging.error(o)
return False
@@ -173,7 +182,7 @@ def run_ethtool(test, params, env):
def ro_callback(status="on"):
- s, o = transfer_file(src="host")
+ s, o = transfer_file("host")
if not s:
logging.error(o)
return False
@@ -183,6 +192,7 @@ def run_ethtool(test, params, env):
vm = env.get_vm(params["main_vm"])
vm.verify_alive()
session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
+
# Let's just error the test if we identify that there's no ethtool
installed
session.cmd("ethtool -h")
session2 = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
@@ -191,11 +201,13 @@ def run_ethtool(test, params, env):
filename = "/tmp/ethtool.dd"
guest_ip = vm.get_address()
ethname = virt_test_utils.get_linux_ifname(session, vm.get_mac_address(0))
+
supported_features = params.get("supported_features")
if supported_features:
supported_features = supported_features.split()
else:
- supported_features = []
+ raise error.TestError("No supported features set on the parameters")
+
test_matrix = {
# type:(callback, (dependence), (exclude)
"tx": (tx_callback, (), ()),
@@ -207,28 +219,41 @@ def run_ethtool(test, params, env):
"lro": (rx_callback, (), ("gro",)),
}
ethtool_save_params()
- success = True
+ failed_tests = []
try:
for f_type in supported_features:
callback = test_matrix[f_type][0]
+
for i in test_matrix[f_type][2]:
if not ethtool_set(i, "off"):
- logging.error("Fail to disable %s", i)
- success = False
+ e_msg = "Failed to disable %s" % i
+ logging.error(e_msg)
+ failed_tests.append(e_msg)
+
for i in [f for f in test_matrix[f_type][1]] + [f_type]:
if not ethtool_set(i, "on"):
- logging.error("Fail to enable %s", i)
- success = False
- if not callback():
- raise error.TestFail("Test failed, %s: on" % f_type)
+ e_msg = "Failed to enable %s" % i
+ logging.error(e_msg)
+ failed_tests.append(e_msg)
+
+ if not callback(status="on"):
+ e_msg = "Callback failed after enabling %s" % f_type
+ logging.error(e_msg)
+ failed_tests.append(e_msg)
if not ethtool_set(f_type, "off"):
- logging.error("Fail to disable %s", f_type)
- success = False
+ e_msg = "Failed to disable %s" % f_type
+ logging.error(e_msg)
+ failed_tests.append(e_msg)
+
if not callback(status="off"):
- raise error.TestFail("Test failed, %s: off" % f_type)
- if not success:
- raise error.TestError("Enable/disable offload function fail")
+ e_msg = "Callback failed after disabling %s" % f_type
+ logging.error(e_msg)
+ failed_tests.append(e_msg)
+
+ if failed_tests:
+ raise error.TestFail("Failed tests: %s" % failed_tests)
+
finally:
ethtool_restore_params()
session.close()
--
1.7.7.6
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html