diff mbox

[RFC,12/14] KVM-test: Add a subtest of netperf

Message ID 20100720013632.2212.40372.stgit@z
State Not Applicable
Headers show

Commit Message

Amos Kong July 20, 2010, 1:36 a.m. UTC
Add network load by netperf, server is launched on guest, execute netperf
client with different protocols on host. if all clients execute successfully,
case will be pass. Test result will be record into result.txt.
Now this case only tests with "TCP_RR TCP_CRR UDP_RR TCP_STREAM TCP_MAERTS
TCP_SENDFILE UDP_STREAM". DLPI only supported by Unix, unix domain test is
not necessary, so drop test of DLPI and unix domain.

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

Comments

Lucas Meneghel Rodrigues July 30, 2010, 4:32 p.m. UTC | #1
On Tue, 2010-07-20 at 09:36 +0800, Amos Kong wrote:
> Add network load by netperf, server is launched on guest, execute netperf
> client with different protocols on host. if all clients execute successfully,
> case will be pass. Test result will be record into result.txt.
> Now this case only tests with "TCP_RR TCP_CRR UDP_RR TCP_STREAM TCP_MAERTS
> TCP_SENDFILE UDP_STREAM". DLPI only supported by Unix, unix domain test is
> not necessary, so drop test of DLPI and unix domain.

Some general thoughts about this test:
 * netperf2 has a fairly good wrapper code, that can do postprocessing
of the results. It'd be good to make use of it. What I was thinking:
   - Import the netperf2 wrapper class on host and call run_once with
appropriate parameters on host
   - Create a client control file and run it on guest using
kvm_test_utils.run_autotest()
   - As this approach wouldn't work on windows, we could make a
netperf_windows test that would be very much like this test.

Of course, we could do that on a later time, I don't think it is
something urgent anyway.

> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
>  0 files changed, 0 insertions(+), 0 deletions(-)
> 
> diff --git a/client/tests/kvm/tests/netperf.py b/client/tests/kvm/tests/netperf.py
> new file mode 100644
> index 0000000..00a91f0
> --- /dev/null
> +++ b/client/tests/kvm/tests/netperf.py
> @@ -0,0 +1,56 @@
> +import logging, commands, os
> +from autotest_lib.client.common_lib import error
> +import kvm_subprocess, kvm_test_utils, kvm_utils
> +
> +def run_netperf(test, params, env):
> +    """
> +    Network stress test with netperf
> +
> +    1) Boot up a virtual machine
> +    2) Launch netserver on guest
> +    3) Execute netperf client on host with different protocols
> +    4) Outout the test result
> +
> +    @param test: Kvm test object
> +    @param params: Dictionary with the test parameters.
> +    @param env: Dictionary with test environment.
> +    """
> +    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
> +    session = kvm_test_utils.wait_for_login(vm,
> +                   timeout=int(params.get("login_timeout", 360)))
> +    netperf_dir = os.path.join(os.environ['AUTODIR'], "tests/netperf2")
> +    setup_cmd = params.get("setup_cmd")
> +    guest_ip = vm.get_address()
> +    result_file = os.path.join(test.debugdir, "result.txt")

^ test.resultsdir would be better. Also, it's better if we take into
account the fact that we can have more than one iteration of the test,
so we'd have something like:

self.results_path = os.path.join(self.resultsdir, 'raw_output_%s' %self.iteration)

Which is what we are doing currently for other benchmarks.

> +    session.get_command_output("service iptables stop")

^ Again I think it'd be better to simply flush the firewall rules with
iptables -F because that's more likely to work on different linux
guests.

Also, this linux specific command makes the entire test linux specific,
so we have to put a rule telling the kvm autotest to not run it on
windows guests.

> +    for i in params.get("netperf_files").split():
> +        if not vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp"):
> +            raise error.TestError("Could not copy files to guest")
> +    if session.get_command_status(setup_cmd % "/tmp", timeout=100) != 0:
> +        raise error.TestFail("Fail to setup netperf on guest")
> +    if session.get_command_status(params.get("netserver_cmd") % "/tmp") != 0:
> +        raise error.TestFail("Fail to start netperf server on guest")
> +
> +    try:
> +        logging.info("Setup and run netperf client on host")
> +        s, o = commands.getstatusoutput(setup_cmd % netperf_dir)
> +        if s != 0:
> +            raise error.TestFail("Fail to setup netperf on host, o: %s" % o)
> +        success = True
> +        file(result_file, "w").write("Netperf Test Result\n")
> +        for i in params.get("protocols").split():
> +            cmd = params.get("netperf_cmd") % (netperf_dir, i, guest_ip)
> +            logging.debug("Execute netperf client test: %s" % cmd)
> +            s, o = commands.getstatusoutput(cmd)
> +            if s != 0:
> +                logging.error("Fail to execute netperf test, protocol:%s" % i)
> +                success = False
> +            else:
> +                logging.info(o)
> +                file(result_file, "a+").write("%s\n" % o)
> +        if not success:
> +            raise error.TestFail("Not all the test passed")

^ "Some of the netperf tests failed"

> +    finally:
> +        session.get_command_output("killall netserver")
> +        session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 7716d48..dec988e 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -398,6 +398,16 @@ variants:
>          type = mac_change
>          kill_vm = yes
>  
> +    - netperf: install setup unattended_install.cdrom
> +        type = netperf
> +        nic_mode = tap
> +        netperf_files = netperf-2.4.5.tar.bz2 wait_before_data.patch
> +        setup_cmd = "cd %s && tar xvfj netperf-2.4.5.tar.bz2 && cd netperf-2.4.5 && patch -p0 < ../wait_before_data.patch && ./configure && make"
> +        netserver_cmd =  %s/netperf-2.4.5/src/netserver
> +        # test time is 60 seconds, set the buffer size to 1 for more hardware interrupt
> +        netperf_cmd = %s/netperf-2.4.5/src/netperf -t %s -H %s -l 60 -- -m 1
> +        protocols = "TCP_STREAM TCP_MAERTS TCP_RR TCP_CRR UDP_RR TCP_SENDFILE UDP_STREAM"
> +
>      - physical_resources_check: install setup unattended_install.cdrom
>          type = physical_resources_check
>          catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
> 
>
diff mbox

Patch

diff --git a/client/tests/kvm/tests/netperf.py b/client/tests/kvm/tests/netperf.py
new file mode 100644
index 0000000..00a91f0
--- /dev/null
+++ b/client/tests/kvm/tests/netperf.py
@@ -0,0 +1,56 @@ 
+import logging, commands, os
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils
+
+def run_netperf(test, params, env):
+    """
+    Network stress test with netperf
+
+    1) Boot up a virtual machine
+    2) Launch netserver on guest
+    3) Execute netperf client on host with different protocols
+    4) Outout the test result
+
+    @param test: Kvm test object
+    @param params: Dictionary with the test parameters.
+    @param env: Dictionary with test environment.
+    """
+    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+    session = kvm_test_utils.wait_for_login(vm,
+                   timeout=int(params.get("login_timeout", 360)))
+    netperf_dir = os.path.join(os.environ['AUTODIR'], "tests/netperf2")
+    setup_cmd = params.get("setup_cmd")
+    guest_ip = vm.get_address()
+    result_file = os.path.join(test.debugdir, "result.txt")
+
+    session.get_command_output("service iptables stop")
+    for i in params.get("netperf_files").split():
+        if not vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp"):
+            raise error.TestError("Could not copy files to guest")
+    if session.get_command_status(setup_cmd % "/tmp", timeout=100) != 0:
+        raise error.TestFail("Fail to setup netperf on guest")
+    if session.get_command_status(params.get("netserver_cmd") % "/tmp") != 0:
+        raise error.TestFail("Fail to start netperf server on guest")
+
+    try:
+        logging.info("Setup and run netperf client on host")
+        s, o = commands.getstatusoutput(setup_cmd % netperf_dir)
+        if s != 0:
+            raise error.TestFail("Fail to setup netperf on host, o: %s" % o)
+        success = True
+        file(result_file, "w").write("Netperf Test Result\n")
+        for i in params.get("protocols").split():
+            cmd = params.get("netperf_cmd") % (netperf_dir, i, guest_ip)
+            logging.debug("Execute netperf client test: %s" % cmd)
+            s, o = commands.getstatusoutput(cmd)
+            if s != 0:
+                logging.error("Fail to execute netperf test, protocol:%s" % i)
+                success = False
+            else:
+                logging.info(o)
+                file(result_file, "a+").write("%s\n" % o)
+        if not success:
+            raise error.TestFail("Not all the test passed")
+    finally:
+        session.get_command_output("killall netserver")
+        session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 7716d48..dec988e 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -398,6 +398,16 @@  variants:
         type = mac_change
         kill_vm = yes
 
+    - netperf: install setup unattended_install.cdrom
+        type = netperf
+        nic_mode = tap
+        netperf_files = netperf-2.4.5.tar.bz2 wait_before_data.patch
+        setup_cmd = "cd %s && tar xvfj netperf-2.4.5.tar.bz2 && cd netperf-2.4.5 && patch -p0 < ../wait_before_data.patch && ./configure && make"
+        netserver_cmd =  %s/netperf-2.4.5/src/netserver
+        # test time is 60 seconds, set the buffer size to 1 for more hardware interrupt
+        netperf_cmd = %s/netperf-2.4.5/src/netperf -t %s -H %s -l 60 -- -m 1
+        protocols = "TCP_STREAM TCP_MAERTS TCP_RR TCP_CRR UDP_RR TCP_SENDFILE UDP_STREAM"
+
     - physical_resources_check: install setup unattended_install.cdrom
         type = physical_resources_check
         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'