In this test, execute run_guest_test() to setup bonding, ping guest from
host when repeatedly down/up interfaces, and check the lost packet ratio.
But this test always fail of lose packets, we maybe need adjust the
check_ratio in config file.

Signed-off-by: Feng Yang <[email protected]>
Signed-off-by: Amos Kong <[email protected]>
---
 0 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/client/tests/kvm/scripts/bonding_setup.py 
b/client/tests/kvm/scripts/bonding_setup.py
new file mode 100644
index 0000000..bc50ea0
--- /dev/null
+++ b/client/tests/kvm/scripts/bonding_setup.py
@@ -0,0 +1,30 @@
+import os, re, commands
+eth_nums = 0
+ifconfig_output = commands.getoutput("ifconfig")
+re_eth = "^eth[0-9]*"
+for ename in re.findall(re_eth, ifconfig_output):
+    eth_config_file = "/etc/sysconfig/network-scripts/ifcfg-%s" % ename
+    eth_config = """DEVICE=%s
+USERCTL=no
+ONBOOT=yes
+MASTER=bond0
+SLAVE=yes
+BOOTPROTO=none
+""" % ename
+    f = file(eth_config_file,'w')
+    f.write(eth_config)
+    f.close()
+
+bonding_config_file = "/etc/sysconfig/network-scripts/ifcfg-bond0"
+bond_config = """DEVICE=bond0
+BOOTPROTO=dhcp
+ONBOOT=yes
+USERCTL=no
+"""
+f = file(bonding_config_file, "w")
+f.write(bond_config)
+f.close()
+os.system("modprobe bonding")
+os.system("service network restart")
+
+
diff --git a/client/tests/kvm/tests/nic_bonding.py 
b/client/tests/kvm/tests/nic_bonding.py
new file mode 100644
index 0000000..1c6e674
--- /dev/null
+++ b/client/tests/kvm/tests/nic_bonding.py
@@ -0,0 +1,93 @@
+import logging, re, os, subprocess, time, commands
+from autotest_lib.client.common_lib import error
+from tests import guest_test
+import kvm_test_utils, kvm_subprocess, kvm_net_utils, kvm_utils
+
+def run_nic_bonding(test, params, env):
+    """
+    Nic bonding test in guest.
+
+    1) Start guest with four nic models.
+    2) Setup bond0 in guest by script bonding_setup.py.
+    3) Run test.sh in guest to down/up all the interfaces
+    4) Ping bond0 of guest for setting times to check packet loss ratio.
+    5) Flood ping bond0 of guest for setting seconds.
+    6) Ping bond0 of guest for another setting times to check packet loss 
ratio.
+    7) Run set_link monitor command in guest.
+    8) Ping bond0 of guest for setting times to check packet loss ratio.
+    9) Flood ping bond0 of guest for setting seconds.
+    10) Ping bond0 of guest for setting times to check packet loss ratio.
+
+    @param test: Kvm test object.
+    @param params: Dictionary with the test parameters.
+    @param env: Dictionary with test environment.
+    """
+    timeout = int(params.get("login_timeout", 1200))
+    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+    session = kvm_test_utils.wait_for_login(vm, 0, timeout, 0, 2, serial=True)
+
+    try:
+        cmd_timeout = float(params.get("cmd_timeout", 1000))
+        guest_test.run_guest_test(test, params, env)
+        o = session.get_command_output("ifconfig bond0", timeout=cmd_timeout)
+        if "bond0" not in o:
+            raise error.TestFail("Fail to setup bond0 device!")
+
+        re_ip = "inet addr:(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})"
+        bond_ip = re.findall(re_ip, o)[0]
+        eth_num = len(params.get("nics").split())
+        cmd = 'while true;do '
+        for i in range(eth_num):
+            ethname = kvm_net_utils.get_linux_ifname(session,
+                                                     vm.get_mac_address(i))
+            cmd += 'ifconfig %s down;ifconfig %s up;' % (ethname, ethname)
+        session.get_command_status_output("echo '%s done' > test.sh" % cmd)
+        cmd = 'ps aux|grep "bash test.sh"|grep -v grep'
+
+        for i in range(10):
+            session.get_command_output("bash test.sh&")
+            time.sleep(5)
+            if session.get_command_status(cmd) == 0:
+                break;
+            logging.info("Fail to run test.sh script in guest, try again!")
+        if session.get_command_status(cmd) != 0:
+            raise error.TestFail("Fail to launch test.sh in guest")
+
+        check_ratio = params.get("check_ratio", 0)
+        ping_times = float(params.get("ping_times", 1500))
+        flood_ping_time = float(params.get("flood_ping_time", 120))
+
+        def passed_ping_test():
+            logging.info("Ping the guest for %s times!" % ping_times)
+            (s, o) = kvm_net_utils.ping(dest=bond_ip, count=ping_times,
+                                        timeout=cmd_timeout)
+            loss_ratio = kvm_net_utils.get_loss_ratio(o)
+            if loss_ratio < 0:
+                logging.error("Fail to get packets loss ratio!")
+                return False
+            elif loss_ratio > check_ratio:
+                logging.error("%s%% packet are lost!" % loss_ratio)
+                return False
+            else:
+                return True
+
+        if not passed_ping_test():
+            raise error.TestFail("Ping test failed.")
+        logging.info("Flood ping the guest for %s seconds!" % flood_ping_time)
+        kvm_net_utils.ping(dest=bond_ip, flood=True, timeout=flood_ping_time)
+        if not passed_ping_test():
+            raise error.TestFail("Ping test failed.")
+
+        cmd = "set_link %s.0 down" % params.get("nic_model")
+        vm.monitor.cmd(cmd, timeout=cmd_timeout)
+
+        if not passed_ping_test():
+            raise error.TestFail("Ping test failed.")
+        logging.info("Flood ping the guest for %s seconds!" % flood_ping_time)
+        kvm_net_utils.ping(dest=bond_ip, flood=True, timeout=flood_ping_time)
+        if not passed_ping_test():
+            raise error.TestFail("Ping test failed.")
+
+    finally:
+        session.close()
+        vm.destroy()
diff --git a/client/tests/kvm/tests_base.cfg.sample 
b/client/tests/kvm/tests_base.cfg.sample
index 87fd51d..df8216e 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -539,6 +539,19 @@ variants:
         filesize = 512
         nic_mode = tap
 
+    - nic_bonding:
+        type = nic_bonding
+        nics += ' nic2 nic3 nic4'
+        image_snapshot = yes
+        cmd_timeout = 360
+        interpreter = "python"
+        guest_script = "scripts/bonding_setup.py"
+        test_timeout = 1000
+        dst_rsc_path = "/root/bonding_setup.py"
+        rsc_args = ""
+        ping_times = 1500
+        flood_ping_time = 120
+
     - physical_resources_check: install setup unattended_install.cdrom
         type = physical_resources_check
         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to