All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amos Kong <akong@redhat.com>
To: lmr@redhat.com
Cc: autotest@test.kernel.org, qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [RFC PATCH 07/14] KVM-test: Add a subtest of load/unload nic driver
Date: Tue, 20 Jul 2010 09:35:50 +0800	[thread overview]
Message-ID: <20100720013549.2212.18606.stgit@z> (raw)
In-Reply-To: <20100720013414.2212.13476.stgit@z>

Repeatedly load/unload nic driver, try to transfer file between guest and host
by threads at the same time, and check the md5sum.

Signed-off-by: Amos Kong <akong@redhat.com>
---
 0 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/client/tests/kvm/tests/nicdriver_unload.py b/client/tests/kvm/tests/nicdriver_unload.py
new file mode 100644
index 0000000..22f9f44
--- /dev/null
+++ b/client/tests/kvm/tests/nicdriver_unload.py
@@ -0,0 +1,128 @@
+import logging, commands, threading, re, os
+from autotest_lib.client.common_lib import error
+import kvm_utils, kvm_test_utils, kvm_net_utils
+
+def run_nicdriver_unload(test, params, env):
+    """
+    Test nic driver
+
+    1) Boot a vm
+    2) Get the nic driver name
+    3) Repeatedly unload/load nic driver
+    4) Multi-session TCP transfer on test interface
+    5) Check the test interface should still work
+
+    @param test: KVM test object
+    @param params: Dictionary with the test parameters
+    @param env: Dictionary with test environment.
+    """
+    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)
+
+    ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0))
+    try:
+        # FIXME: Try three waies to get nic driver name, because the
+        # modprobe.conf is dropped in latest system, and ethtool method is not
+        # supported by virtio_nic.
+
+        output = session.get_command_output("cat /etc/modprobe.conf")
+        driver = re.findall(r'%s (\w+)' % ethname,output)
+        if not driver:
+            output = session.get_command_output("ethtool -i %s" % ethname)
+            driver = re.findall(r'driver: (\w+)', output)
+        if not driver:
+            output = session.get_command_output("lspci -k")
+            driver = re.findall("Ethernet controller.*\n.*\n.*Kernel driver"
+                                " in use: (\w+)", output)
+        driver = driver[0]
+    except IndexError:
+        raise error.TestError("Could not find driver name")
+
+    logging.info("driver is %s" % driver)
+
+    class ThreadScp(threading.Thread):
+        def run(self):
+            remote_file = '/tmp/' + self.getName()
+            file_list.append(remote_file)
+            ret = vm.copy_files_to(file_name, remote_file, timeout=scp_timeout)
+            logging.debug("Copy result of %s: %s" % (remote_file, ret))
+
+    def compare(origin_file, receive_file):
+        cmd = "md5sum %s"
+        output1 = commands.getstatusoutput(cmd % origin_file)[1].strip()
+        check_sum1 = output1.split()[0]
+        s, output2 = session.get_command_status_output(cmd % receive_file)
+        if s != 0:
+            logging.error("Could not get md5sum of receive_file")
+            return False
+        check_sum2 = output2.strip().split()[0]
+        logging.debug("origin: %s, receive: %s" % (check_sum1, check_sum2))
+        if check_sum1 != check_sum2:
+            logging.error("md5sum doesn't match")
+            return False
+        return True
+
+    #produce sized file in host
+    file_size = params.get("file_size")
+    file_name = "/tmp/nicdriver_unload_file"
+    cmd = "dd if=/dev/urandom of=%s bs=%sM count=1"
+    s, o = commands.getstatusoutput(cmd % (file_name, file_size))
+    if s != 0:
+        raise error.TestFail("Fail to create file by dd")
+
+    connect_time = params.get("connect_time")
+    scp_timeout = int(params.get("scp_timeout"))
+    thread_num = int(params.get("thread_num"))
+    file_list = []
+
+    unload_load_cmd = "sleep %s && ifconfig %s down && modprobe -r %s && "
+    unload_load_cmd += "sleep 1 && modprobe %s && ifconfig %s up"
+    unload_load_cmd = unload_load_cmd % (connect_time, ethname, driver,
+                                         driver, ethname)
+    pid = os.fork()
+    if pid != 0:
+        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:
+                session.get_command_output("rm -rf /tmp/Thread-*")
+                raise error.TestFail("Unload/load nic driver failed")
+            pid, s = os.waitpid(pid, os.WNOHANG)
+            status = os.WEXITSTATUS(s)
+            if (pid, status) != (0, 0):
+                logging.debug("Child process ending")
+                break
+    else:
+        logging.info("Multi-session tcp data transfer")
+        threads = []
+        for i in range(thread_num):
+            t = ThreadScp()
+            t.start()
+            threads.append(t)
+        for t in threads:
+            t.join(timeout = scp_timeout)
+        os._exit(0)
+
+    session2.close()
+
+    try:
+        logging.info("Check md5sum for received files in multi-session")
+        for f in file_list:
+            if not compare(file_name, f):
+                raise error.TestFail("Fail to compare (guest)file %s" % f)
+
+        logging.info("Test nic function after load/unload")
+        if not vm.copy_files_to(file_name, file_name):
+            raise error.TestFail("Fail to copy file from host to guest")
+        if not compare(file_name, file_name):
+            raise error.TestFail("Test nic function after load/unload fail")
+
+    finally:
+        session.get_command_output("rm -rf /tmp/Thread-*")
+        session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 872674e..03d15c0 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -362,6 +362,14 @@ variants:
         filesize = 4000
         scp_timeout = 1000
 
+    - nicdriver_unload:  install setup unattended_install.cdrom
+        type = nicdriver_unload
+        nic_mode = tap
+        file_size = 100
+        connect_time = 4
+        scp_timeout = 300
+        thread_num = 10
+
     - physical_resources_check: install setup unattended_install.cdrom
         type = physical_resources_check
         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
@@ -1038,7 +1046,7 @@ variants:
 
     # Windows section
     - @Windows:
-        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer
+        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload
         shutdown_command = shutdown /s /f /t 0
         reboot_command = shutdown /r /f /t 0
         status_test_command = echo %errorlevel%


WARNING: multiple messages have this Message-ID (diff)
From: Amos Kong <akong@redhat.com>
To: lmr@redhat.com
Cc: autotest@test.kernel.org, qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [Qemu-devel] [RFC PATCH 07/14] KVM-test: Add a subtest of load/unload nic driver
Date: Tue, 20 Jul 2010 09:35:50 +0800	[thread overview]
Message-ID: <20100720013549.2212.18606.stgit@z> (raw)
In-Reply-To: <20100720013414.2212.13476.stgit@z>

Repeatedly load/unload nic driver, try to transfer file between guest and host
by threads at the same time, and check the md5sum.

Signed-off-by: Amos Kong <akong@redhat.com>
---
 0 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/client/tests/kvm/tests/nicdriver_unload.py b/client/tests/kvm/tests/nicdriver_unload.py
new file mode 100644
index 0000000..22f9f44
--- /dev/null
+++ b/client/tests/kvm/tests/nicdriver_unload.py
@@ -0,0 +1,128 @@
+import logging, commands, threading, re, os
+from autotest_lib.client.common_lib import error
+import kvm_utils, kvm_test_utils, kvm_net_utils
+
+def run_nicdriver_unload(test, params, env):
+    """
+    Test nic driver
+
+    1) Boot a vm
+    2) Get the nic driver name
+    3) Repeatedly unload/load nic driver
+    4) Multi-session TCP transfer on test interface
+    5) Check the test interface should still work
+
+    @param test: KVM test object
+    @param params: Dictionary with the test parameters
+    @param env: Dictionary with test environment.
+    """
+    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)
+
+    ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0))
+    try:
+        # FIXME: Try three waies to get nic driver name, because the
+        # modprobe.conf is dropped in latest system, and ethtool method is not
+        # supported by virtio_nic.
+
+        output = session.get_command_output("cat /etc/modprobe.conf")
+        driver = re.findall(r'%s (\w+)' % ethname,output)
+        if not driver:
+            output = session.get_command_output("ethtool -i %s" % ethname)
+            driver = re.findall(r'driver: (\w+)', output)
+        if not driver:
+            output = session.get_command_output("lspci -k")
+            driver = re.findall("Ethernet controller.*\n.*\n.*Kernel driver"
+                                " in use: (\w+)", output)
+        driver = driver[0]
+    except IndexError:
+        raise error.TestError("Could not find driver name")
+
+    logging.info("driver is %s" % driver)
+
+    class ThreadScp(threading.Thread):
+        def run(self):
+            remote_file = '/tmp/' + self.getName()
+            file_list.append(remote_file)
+            ret = vm.copy_files_to(file_name, remote_file, timeout=scp_timeout)
+            logging.debug("Copy result of %s: %s" % (remote_file, ret))
+
+    def compare(origin_file, receive_file):
+        cmd = "md5sum %s"
+        output1 = commands.getstatusoutput(cmd % origin_file)[1].strip()
+        check_sum1 = output1.split()[0]
+        s, output2 = session.get_command_status_output(cmd % receive_file)
+        if s != 0:
+            logging.error("Could not get md5sum of receive_file")
+            return False
+        check_sum2 = output2.strip().split()[0]
+        logging.debug("origin: %s, receive: %s" % (check_sum1, check_sum2))
+        if check_sum1 != check_sum2:
+            logging.error("md5sum doesn't match")
+            return False
+        return True
+
+    #produce sized file in host
+    file_size = params.get("file_size")
+    file_name = "/tmp/nicdriver_unload_file"
+    cmd = "dd if=/dev/urandom of=%s bs=%sM count=1"
+    s, o = commands.getstatusoutput(cmd % (file_name, file_size))
+    if s != 0:
+        raise error.TestFail("Fail to create file by dd")
+
+    connect_time = params.get("connect_time")
+    scp_timeout = int(params.get("scp_timeout"))
+    thread_num = int(params.get("thread_num"))
+    file_list = []
+
+    unload_load_cmd = "sleep %s && ifconfig %s down && modprobe -r %s && "
+    unload_load_cmd += "sleep 1 && modprobe %s && ifconfig %s up"
+    unload_load_cmd = unload_load_cmd % (connect_time, ethname, driver,
+                                         driver, ethname)
+    pid = os.fork()
+    if pid != 0:
+        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:
+                session.get_command_output("rm -rf /tmp/Thread-*")
+                raise error.TestFail("Unload/load nic driver failed")
+            pid, s = os.waitpid(pid, os.WNOHANG)
+            status = os.WEXITSTATUS(s)
+            if (pid, status) != (0, 0):
+                logging.debug("Child process ending")
+                break
+    else:
+        logging.info("Multi-session tcp data transfer")
+        threads = []
+        for i in range(thread_num):
+            t = ThreadScp()
+            t.start()
+            threads.append(t)
+        for t in threads:
+            t.join(timeout = scp_timeout)
+        os._exit(0)
+
+    session2.close()
+
+    try:
+        logging.info("Check md5sum for received files in multi-session")
+        for f in file_list:
+            if not compare(file_name, f):
+                raise error.TestFail("Fail to compare (guest)file %s" % f)
+
+        logging.info("Test nic function after load/unload")
+        if not vm.copy_files_to(file_name, file_name):
+            raise error.TestFail("Fail to copy file from host to guest")
+        if not compare(file_name, file_name):
+            raise error.TestFail("Test nic function after load/unload fail")
+
+    finally:
+        session.get_command_output("rm -rf /tmp/Thread-*")
+        session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 872674e..03d15c0 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -362,6 +362,14 @@ variants:
         filesize = 4000
         scp_timeout = 1000
 
+    - nicdriver_unload:  install setup unattended_install.cdrom
+        type = nicdriver_unload
+        nic_mode = tap
+        file_size = 100
+        connect_time = 4
+        scp_timeout = 300
+        thread_num = 10
+
     - physical_resources_check: install setup unattended_install.cdrom
         type = physical_resources_check
         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
@@ -1038,7 +1046,7 @@ variants:
 
     # Windows section
     - @Windows:
-        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer
+        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload
         shutdown_command = shutdown /s /f /t 0
         reboot_command = shutdown /r /f /t 0
         status_test_command = echo %errorlevel%

  parent reply	other threads:[~2010-07-20  1:35 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-20  1:34 [RFC PATCH 00/14] Patchset of network related subtests Amos Kong
2010-07-20  1:34 ` [Qemu-devel] [Autotest][RFC " Amos Kong
2010-07-20  1:34 ` [RFC PATCH 01/14] KVM-test: Add a new macaddress pool algorithm Amos Kong
2010-07-20  1:34   ` [Qemu-devel] " Amos Kong
2010-07-20 10:19   ` Michael Goldish
2010-07-20 10:19     ` Michael Goldish
2010-07-20 13:44     ` Amos Kong
2010-07-20 15:53       ` Michael Goldish
2010-07-20 15:53         ` Michael Goldish
2010-08-03  1:34         ` Amos Kong
2010-07-27  1:48   ` Lucas Meneghel Rodrigues
2010-07-27  1:48     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-07-20  1:35 ` [RFC PATCH 02/14] KVM Test: Add a function get_interface_name() to kvm_net_utils.py Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27  2:08   ` Lucas Meneghel Rodrigues
2010-07-27  2:08     ` Lucas Meneghel Rodrigues
2010-07-28 10:29     ` Michael Goldish
2010-07-28 10:29       ` Michael Goldish
2010-08-03  1:39       ` Amos Kong
2010-07-20  1:35 ` [RFC PATCH 03/14] KVM Test: Add a common ping module for network related tests Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 13:01   ` Lucas Meneghel Rodrigues
2010-07-28 11:50     ` Michael Goldish
2010-07-28 13:56       ` Michael Goldish
2010-07-28 13:56         ` Michael Goldish
2010-07-20  1:35 ` [RFC PATCH 04/14] KVM-test: Add a new subtest ping Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 13:15   ` Lucas Meneghel Rodrigues
2010-07-27 13:15     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-03  1:54     ` Amos Kong
2010-08-03  1:54       ` [Qemu-devel] " Amos Kong
2010-07-20  1:35 ` [RFC PATCH 05/14] KVM-test: Add a subtest jumbo Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 14:13   ` Lucas Meneghel Rodrigues
2010-07-27 14:13     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-10  7:18     ` Amos Kong
2010-08-10  7:18       ` [Qemu-devel] Re: [Autotest] " Amos Kong
2010-07-20  1:35 ` [RFC PATCH 06/14] KVM-test: Add basic file transfer test Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 14:36   ` Lucas Meneghel Rodrigues
2010-08-10  9:29     ` [Autotest] " Amos Kong
2010-08-10  9:29       ` Amos Kong
2010-07-20  1:35 ` Amos Kong [this message]
2010-07-20  1:35   ` [Qemu-devel] [RFC PATCH 07/14] KVM-test: Add a subtest of load/unload nic driver Amos Kong
2010-07-28 18:12   ` Lucas Meneghel Rodrigues
2010-07-20  1:35 ` [RFC PATCH 08/14] KVM-test: Add a subtest of nic promisc Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-28 21:35   ` Lucas Meneghel Rodrigues
2010-07-28 21:35     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-11  1:34     ` [Autotest] " Amos Kong
2010-08-11  1:34       ` [Qemu-devel] " Amos Kong
2010-07-20  1:36 ` [RFC PATCH 09/14] KVM-test: Add a subtest of multicast Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 21:55   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 10/14] KVM-test: Add a subtest of pxe Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 22:07   ` Lucas Meneghel Rodrigues
2010-08-10  6:11     ` Amos Kong
2010-07-20  1:36 ` [RFC PATCH 11/14] KVM-test: Add a subtest of changing mac address Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 22:30   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 12/14] KVM-test: Add a subtest of netperf Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-30 16:32   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 13/14] KVM-test: Improve vlan subtest Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-20  1:36 ` [RFC PATCH 14/14] KVM-test: Add subtest of testing offload by ethtool Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-08-02 19:10   ` Lucas Meneghel Rodrigues
2010-08-02 19:10     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-10  7:07     ` Amos Kong
2010-08-10  7:07       ` [Qemu-devel] Re: [Autotest] " Amos Kong
2010-07-20 12:12 ` [RFC PATCH 00/14] Patchset of network related subtests Lucas Meneghel Rodrigues
2010-07-20 12:12   ` [Qemu-devel] Re: [Autotest][RFC " Lucas Meneghel Rodrigues
2010-08-02 20:58 ` [RFC " Lucas Meneghel Rodrigues
2010-08-02 20:58   ` [Qemu-devel] Re: [Autotest][RFC " Lucas Meneghel Rodrigues

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100720013549.2212.18606.stgit@z \
    --to=akong@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=lmr@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.