Changes from v2: - Do not close the serial session on tests that require it - Instead of an infinite loop, have a thread that changes nic promisc mode in nic_promisc. It is more reliable and avoids garbage on the serial session. - On mac_change, open a remote session in the beginning of the test to check for responsiveness (the previous version was checking responsiveness of the serial session, which didn't make sense.
Changes from v1: - Convert all net tests to use new function - Update debug info Signed-off-by: Amos Kong <[email protected]> Signed-off-by: Lucas Meneghel Rodrigues <[email protected]> --- client/tests/kvm/kvm_test_utils.py | 15 +++++++--- client/tests/kvm/tests/mac_change.py | 18 +++++------- client/tests/kvm/tests/nic_promisc.py | 41 +++++++++++++++++++--------- client/tests/kvm/tests/nicdriver_unload.py | 11 +++----- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py index 014f265..11e3e58 100644 --- a/client/tests/kvm/kvm_test_utils.py +++ b/client/tests/kvm/kvm_test_utils.py @@ -44,7 +44,7 @@ def get_living_vm(env, vm_name): return vm -def wait_for_login(vm, nic_index=0, timeout=240, start=0, step=2): +def wait_for_login(vm, nic_index=0, timeout=240, start=0, step=2, serial=None): """ Try logging into a VM repeatedly. Stop on success or when timeout expires. @@ -53,9 +53,16 @@ def wait_for_login(vm, nic_index=0, timeout=240, start=0, step=2): @param timeout: Time to wait before giving up. @return: A shell session object. """ - logging.info("Trying to log into guest '%s', timeout %ds", vm.name, timeout) - session = kvm_utils.wait_for(lambda: vm.remote_login(nic_index=nic_index), - timeout, start, step) + if serial: + logging.info("Trying to log into guest using serial connection," + " timeout %ds", timeout) + session = kvm_utils.wait_for(lambda: vm.serial_login(), timeout, + start, step) + else: + logging.info("Trying to log into guest %s using remote connection," + " timeout %ds", vm.name, timeout) + session = kvm_utils.wait_for(lambda: vm.remote_login( + nic_index=nic_index), timeout, start, step) if not session: raise error.TestFail("Could not log into guest '%s'" % vm.name) logging.info("Logged into guest '%s'" % vm.name) diff --git a/client/tests/kvm/tests/mac_change.py b/client/tests/kvm/tests/mac_change.py index c614e15..605d29d 100644 --- a/client/tests/kvm/tests/mac_change.py +++ b/client/tests/kvm/tests/mac_change.py @@ -17,12 +17,10 @@ def run_mac_change(test, params, env): """ timeout = int(params.get("login_timeout", 360)) vm = kvm_test_utils.get_living_vm(env, params.get("main_vm")) - logging.info("Trying to log into guest '%s' by serial", vm.name) - session = kvm_utils.wait_for(lambda: vm.serial_login(), - timeout, 0, step=2) - if not session: - raise error.TestFail("Could not log into guest '%s'" % vm.name) - + session_serial = kvm_test_utils.wait_for_login(vm, 0, timeout, 0, 2, + serial=True) + # This session will be used to assess whether the IP change worked + session = kvm_test_utils.wait_for_login(vm, 0, timeout, 0, 2) old_mac = vm.get_mac_address(0) while True: vm.free_mac_address(0) @@ -30,23 +28,23 @@ def run_mac_change(test, params, env): if old_mac != new_mac: break logging.info("The initial MAC address is %s", old_mac) - interface = kvm_test_utils.get_linux_ifname(session, old_mac) + interface = kvm_test_utils.get_linux_ifname(session_serial, old_mac) # Start change MAC address logging.info("Changing MAC address to %s", new_mac) change_cmd = ("ifconfig %s down && ifconfig %s hw ether %s && " "ifconfig %s up" % (interface, interface, new_mac, interface)) - if session.get_command_status(change_cmd) != 0: + if session_serial.get_command_status(change_cmd) != 0: raise error.TestFail("Fail to send mac_change command") # Verify whether MAC address was changed to the new one logging.info("Verifying the new mac address") - if session.get_command_status("ifconfig | grep -i %s" % new_mac) != 0: + if session_serial.get_command_status("ifconfig |grep -i %s" % new_mac) != 0: raise error.TestFail("Fail to change MAC address") # Restart `dhclient' to regain IP for new mac address logging.info("Restart the network to gain new IP") dhclient_cmd = "dhclient -r && dhclient %s" % interface - session.sendline(dhclient_cmd) + session_serial.sendline(dhclient_cmd) # Re-log into the guest after changing mac address if kvm_utils.wait_for(session.is_responsive, 120, 20, 3): diff --git a/client/tests/kvm/tests/nic_promisc.py b/client/tests/kvm/tests/nic_promisc.py index 99bbf8c..a8eaa39 100644 --- a/client/tests/kvm/tests/nic_promisc.py +++ b/client/tests/kvm/tests/nic_promisc.py @@ -1,4 +1,4 @@ -import logging +import logging, threading from autotest_lib.client.common_lib import error from autotest_lib.client.bin import utils import kvm_utils, kvm_test_utils @@ -21,12 +21,8 @@ def run_nic_promisc(test, params, env): timeout = int(params.get("login_timeout", 360)) vm = kvm_test_utils.get_living_vm(env, params.get("main_vm")) session = kvm_test_utils.wait_for_login(vm, timeout=timeout) - - logging.info("Trying to log into guest '%s' by serial", vm.name) - session2 = kvm_utils.wait_for(lambda: vm.serial_login(), - timeout, 0, step=2) - if not session2: - raise error.TestFail("Could not log into guest '%s'" % vm.name) + session_serial = kvm_test_utils.wait_for_login(vm, 0, timeout, 0, 2, + serial=True) def compare(filename): cmd = "md5sum %s" % filename @@ -46,11 +42,28 @@ def run_nic_promisc(test, params, env): return True ethname = kvm_test_utils.get_linux_ifname(session, vm.get_mac_address(0)) - set_promisc_cmd = ("ip link set %s promisc on; sleep 0.01;" - "ip link set %s promisc off; sleep 0.01" % - (ethname, ethname)) - logging.info("Set promisc change repeatedly in guest") - session2.sendline("while true; do %s; done" % set_promisc_cmd) + + class ThreadPromiscCmd(threading.Thread): + def __init__(self, session, termination_event): + self.session = session + self.termination_event = termination_event + super(ThreadPromiscCmd, self).__init__() + + + def run(self): + set_promisc_cmd = ("ip link set %s promisc on; sleep 0.01;" + "ip link set %s promisc off; sleep 0.01" % + (ethname, ethname)) + while True: + self.session.get_command_output(set_promisc_cmd) + if self.termination_event.isSet(): + break + + + logging.info("Started thread to change promisc mode in guest") + termination_event = threading.Event() + promisc_thread = ThreadPromiscCmd(session_serial, termination_event) + promisc_thread.start() dd_cmd = "dd if=/dev/urandom of=%s bs=%d count=1" filename = "/tmp/nic_promisc_file" @@ -93,8 +106,10 @@ def run_nic_promisc(test, params, env): session.get_command_status(cmd) finally: + logging.info("Stopping the promisc thread") + termination_event.set() + promisc_thread.join(10) logging.info("Restore the %s to the nonpromisc mode", ethname) - session2.close() session.get_command_status("ip link set %s promisc off" % ethname) session.close() diff --git a/client/tests/kvm/tests/nicdriver_unload.py b/client/tests/kvm/tests/nicdriver_unload.py index 47318ba..242b22f 100644 --- a/client/tests/kvm/tests/nicdriver_unload.py +++ b/client/tests/kvm/tests/nicdriver_unload.py @@ -20,11 +20,8 @@ def run_nicdriver_unload(test, params, env): timeout = int(params.get("login_timeout", 360)) vm = kvm_test_utils.get_living_vm(env, params.get("main_vm")) session = kvm_test_utils.wait_for_login(vm, timeout=timeout) - logging.info("Trying to log into guest '%s' by serial", vm.name) - session2 = kvm_utils.wait_for(lambda: vm.serial_login(), - timeout, 0, step=2) - if not session2: - raise error.TestFail("Could not log into guest '%s'" % vm.name) + session_serial = kvm_test_utils.wait_for_login(vm, 0, timeout, 0, 2, + serial=True) ethname = kvm_test_utils.get_linux_ifname(session, vm.get_mac_address(0)) sys_path = "/sys/class/net/%s/device/driver" % (ethname) @@ -77,7 +74,8 @@ def run_nicdriver_unload(test, params, env): logging.info("Unload/load NIC driver repeatedly in guest...") while True: logging.debug("Try to unload/load nic drive once") - if session2.get_command_status(unload_load_cmd, timeout=120) != 0: + if session_serial.get_command_status(unload_load_cmd, + timeout=120) != 0: session.get_command_output("rm -rf /tmp/Thread-*") raise error.TestFail("Unload/load nic driver failed") pid, s = os.waitpid(pid, os.WNOHANG) @@ -96,7 +94,6 @@ def run_nicdriver_unload(test, params, env): t.join(timeout = scp_timeout) os._exit(0) - session2.close() try: logging.info("Check MD5 hash for received files in multi-session") -- 1.7.1 _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
