public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: autotest@test.kernel.org
Cc: kvm@vger.kernel.org, Lucas Meneghel Rodrigues <lmr@redhat.com>,
	Alexey Eromenko <aeromenk@redhat.com>
Subject: [KVM-AUTOTEST PATCH] Adding iperf test
Date: Tue, 16 Jun 2009 18:29:59 -0300	[thread overview]
Message-ID: <1245187799-7757-1-git-send-email-lmr@redhat.com> (raw)

Adding iperf network performance test. Basically it tests
networking functionality, stability and performance of guest OSes.
This test is cross-platform -- i.e. it works on both Linux and
Windows VMs.

Signed-off-by: Alexey Eromenko <aeromenk@redhat.com>
---
 client/tests/kvm/kvm.py               |    1 +
 client/tests/kvm/kvm_iperf.py         |  105 +++++++++++++++++++++++++++++++++
 client/tests/kvm/kvm_tests.cfg.sample |    8 +++
 3 files changed, 114 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/kvm_iperf.py

diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
index 9428162..e1a6e27 100644
--- a/client/tests/kvm/kvm.py
+++ b/client/tests/kvm/kvm.py
@@ -53,6 +53,7 @@ class kvm(test.test):
                 "autotest":     test_routine("kvm_tests", "run_autotest"),
                 "kvm_install":  test_routine("kvm_install", "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests", "run_linux_s3"),
+                "iperf":        test_routine("kvm_iperf", "run_iperf"),
                 }
 
         # Make it possible to import modules from the test's bindir
diff --git a/client/tests/kvm/kvm_iperf.py b/client/tests/kvm/kvm_iperf.py
new file mode 100644
index 0000000..927c9e5
--- /dev/null
+++ b/client/tests/kvm/kvm_iperf.py
@@ -0,0 +1,105 @@
+import time, os, logging
+from autotest_lib.client.common_lib import utils, error
+import kvm_utils
+
+def run_iperf(test, params, env):
+    """
+    Runs iperf on the guest system and brings back the result.
+
+    @see: http://sourceforge.net/projects/iperf
+    @param test: kvm test object
+    @param params: Dictionary with test parameters
+    @param env: Test environment
+    """
+    vm = kvm_utils.env_get_vm(env,  params.get("main_vm"))
+    if not vm:
+        message = "VM object not found in environment"
+        logging.error(message)
+        raise error.TestError, message
+    if not vm.is_alive():
+        message = "VM seems to be dead; Test requires a living VM"
+        logging.error(message)
+        raise error.TestError(message)
+
+    logging.info("Waiting for guest to be up...")
+
+    session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+    if not session:
+        message = "Could not log into guest"
+        logging.error(message)
+        raise error.TestFail, message
+
+    logging.info("Logged in")
+
+    # Checking for GuestOS-compatible iPerf binary existence on host.
+    iperf_binary = params.get("iperf_binary", "misc/iperf")
+    iperf_duration = params.get("iperf_duration", 5)
+    iperf_parallel_threads = params.get("iperf_parallel_threads", 1)
+    iperf_dest_ip = params.get("iperf_dest_ip", "10.0.2.2")
+    iperf_binary = os.path.join(test.bindir, iperf_binary)
+    if not os.path.exists(iperf_binary):
+        message = "iPerf binary: %s was not found on host" % iperf_binary
+        logging.error(message)
+        raise error.TestError, message
+    else:
+        logging.info("iPerf binary: %s was found on host" % iperf_binary)
+
+    # Starting HostOS-compatible iPerf Server on host
+    logging.info('VM is up ... \n starting iPerf Server on host')
+    kvm_utils.run_bg("iperf -s", timeout=5)
+
+    # Detecting GuestOS
+    if iperf_binary.__contains__("exe"):
+        vm_type="win32"
+    else:
+        vm_type="linux32"
+
+    # Copying GuestOS-compatible iPerf binary to guest.
+    # Starting iPerf Client on guest, plus connect to host.
+    if vm_type == "win32":
+        win_dir = "/cygdrive/c/"
+        logging.info('starting copying %s to Windows VM to %s' % (iperf_binary,
+                                                                  win_dir))
+        if not vm.scp_to_remote(iperf_binary, win_dir):
+            message = "Could not copy Win32 iPerf to guest"
+            logging.error(message)
+            raise error.TestError(message)
+        logging.debug("Enabling file permissions of iPerf.exe on Windows VM...")
+        session.sendline('cacls C:\iperf.exe /P Administrator:F')
+        session.sendline('y')
+        session.sendline('')
+        time.sleep(2)
+        session.sendline('')
+        logging.info("starting iPerf client on Windows VM, connecting to host")
+        session.sendline('C:\iperf -t %s -c %s -P %s' % (int(iperf_duration),
+                                                         iperf_dest_ip,
+                                                   int(iperf_parallel_threads)))
+    else:
+        logging.info('starting copying %s to Linux VM ' % iperf_binary)
+        if not vm.scp_to_remote(iperf_binary, "/usr/local/bin"):
+            message = "Could not copy Linux iPerf to guest"
+            logging.error(message)
+            raise error.TestError, message
+        print "starting iPerf client on VM, connecting to host"
+        session.sendline('iperf -t %s -c %s -P %s' % (int(iperf_duration),
+                                                      iperf_dest_ip,
+                                                   int(iperf_parallel_threads)))
+
+    # Analyzing results
+    iperf_result_match, iperf_result = session.read_up_to_prompt()
+    logging.debug("iperf_result =", iperf_result)
+
+    if iperf_result.__contains__(" 0.00 bits/sec"):
+        msg = 'Guest returned 0.00 bits/sec during iperf test.'
+        raise error.TestError(msg)
+    elif iperf_result.__contains__("No route to host"):
+        msg = 'SSH to guest returned: No route to host.'
+        raise error.TestError(msg)
+    elif iperf_result.__contains__("Access is denied"):
+        msg = 'SSH to guest returned: Access is denied.'
+        raise error.TestError(msg)
+    elif not iperf_result.__contains__("bits/sec"):
+        msg = 'SSH result unrecognizeable.'
+        raise error.TestError(msg)
+
+    session.close()
diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index 2c0b321..931f748 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -82,6 +82,10 @@ variants:
     - linux_s3:      install setup
         type = linux_s3
 
+    - iperf:        install setup
+        type = iperf
+        extra_params += " -snapshot"
+
 # NICs
 variants:
     - @rtl8139:
@@ -102,6 +106,8 @@ variants:
         ssh_status_test_command = echo $?
         username = root
         password = 123456
+        iperf:
+          iperf_binary = misc/iperf
 
         variants:
             - Fedora:
@@ -292,6 +298,8 @@ variants:
         password = 123456
         migrate:
             migration_test_command = ver && vol
+        iperf:
+            iperf_binary = misc/iperf.exe
 
         variants:
             - Win2000:
-- 
1.6.2.2


             reply	other threads:[~2009-06-16 21:30 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-16 21:29 Lucas Meneghel Rodrigues [this message]
2009-06-16 21:40 ` [KVM-AUTOTEST PATCH] Adding iperf test Lucas Meneghel Rodrigues
2009-06-16 23:43   ` Lucas Meneghel Rodrigues
2009-06-25 15:54 ` [KVM-AUTOTEST PATCH] bugfix for changing kvm_log to logging Yolkfull Chow
2009-07-01  3:24   ` Lucas Meneghel Rodrigues
2009-06-30  8:52 ` [KVM-AUTOTEST PATCH] Adding iperf test sudhir kumar
2009-06-30 22:46   ` Lucas Meneghel Rodrigues
2009-07-01 11:43   ` Alexey Eremenko
2009-07-01 15:57     ` Lucas Meneghel Rodrigues
2009-07-01 16:18       ` [Autotest] " Martin Bligh
2009-07-01 17:14         ` Avi Kivity
2009-07-01 17:16           ` Martin Bligh
2009-07-01 20:29             ` Lucas Meneghel Rodrigues
2009-07-02  8:26             ` Avi Kivity

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=1245187799-7757-1-git-send-email-lmr@redhat.com \
    --to=lmr@redhat.com \
    --cc=aeromenk@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=kvm@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox