Message ID | 20100720013532.2212.70315.stgit@z |
---|---|
State | Not Applicable |
Headers | show |
On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote: > According to different nic model set different MTU for it. And ping from guest > to host, to see whether tested size can be received by host. > > Signed-off-by: Jason Wang <jasowang@redhat.com> > Signed-off-by: Amos Kong <akong@redhat.com> > --- > 0 files changed, 0 insertions(+), 0 deletions(-) > > diff --git a/client/tests/kvm/tests/jumbo.py b/client/tests/kvm/tests/jumbo.py > new file mode 100644 > index 0000000..9f56a87 > --- /dev/null > +++ b/client/tests/kvm/tests/jumbo.py > @@ -0,0 +1,133 @@ > +import os, re, logging, commands, time, random > +from autotest_lib.client.common_lib import error > +import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_net_utils > + > +def run_jumbo(test, params, env): > + """ > + Test the RX jumbo frame function of vnics: > + 1) boot the vm > + 2) change the MTU of guest nics and host taps depends on the nic model ^ I think you meant 'depending on the nic model' > + 3) add the static arp entry for guest nic > + 4) wait for the MTU ok > + 5) verify the patch mtu using ping > + 6) ping the guest with large frames > + 7) increament size ping ^ typo, increment > + 8) flood ping the guest with large frames > + 9) verify the path mtu > + 10) revocer the mtu ^ maybe a typo, restore? > + > + @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) > + mtu = params.get("mtu", "1500") > + flood_time = params.get("flood_time", "300") > + max_icmp_pkt_size = int(mtu) - 28 > + > + ifname = vm.get_ifname(0) > + ip = vm.get_address(0) > + if ip is None: > + raise error.TestError("Could not get the ip address") > + > + try: > + # Environment preparartion ^ typo, preparation > + ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0)) > + > + logging.info("Changing the mtu of guest ...") > + guest_mtu_cmd = "ifconfig %s mtu %s" % (ethname , mtu) > + s, o = session.get_command_status_output(guest_mtu_cmd) > + if s != 0: > + logging.error(o) > + raise error.TestError("Fail to set the mtu of guest nic: %s" > + % ethname) > + > + logging.info("Chaning the mtu of host tap ...") > + host_mtu_cmd = "ifconfig %s mtu %s" % (ifname, mtu) > + s, o = commands.getstatusoutput(host_mtu_cmd) > + if s != 0: > + raise error.TestError("Fail to set the mtu of %s" % ifname) > + > + logging.info("Add a temporary static arp entry ...") > + arp_add_cmd = "arp -s %s %s -i %s" % (ip, vm.get_macaddr(0), ifname) > + s, o = commands.getstatusoutput(arp_add_cmd) > + if s != 0 : > + raise error.TestError("Fail to add temporary arp entry") > + > + def is_mtu_ok(): > + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, > + packetsize = max_icmp_pkt_size, > + hint = "do", timeout = 2) ^ please fix the default argument attribution, here and all subsequent calls > + if s != 0: > + return False > + else: > + return True ^ Here you could simple use return s != 0 > + > + def verify_mtu(): > + logging.info("Verify the path mtu") > + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, > + packetsize = max_icmp_pkt_size, > + hint = "do", timeout = 15) > + if s != 0 : > + logging.error(o) > + raise error.TestFail("Path MTU is not as expected") > + if kvm_net_utils.get_loss_ratio(o) != 0: > + logging.error(o) > + raise error.TestFail("Packet loss ratio during mtu verification" > + " is not zero") > + > + def flood_ping(): > + logging.info("Flood with large frames") > + kvm_net_utils.ping(ip, interface = ifname, > + packetsize = max_icmp_pkt_size, > + flood = True, timeout = float(flood_time)) > + > + def large_frame_ping(count = 100): > + logging.info("Large frame ping") > + s, o = kvm_net_utils.ping(ip, count, interface = ifname, > + packetsize = max_icmp_pkt_size, > + timeout = float(count) * 2) > + ratio = kvm_net_utils.get_loss_ratio(o) > + if ratio != 0: > + raise error.TestFail("Loss ratio of large frame ping is %s" \ > + % ratio) ^ No need to use the backslash to end line here > + def size_increase_ping(step = random.randrange(90, 110)): > + logging.info("Size increase ping") > + for size in range(0, max_icmp_pkt_size + 1, step): > + logging.info("Ping %s with size %s" % (ip, size)) > + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, > + packetsize = size, > + hint = "do", timeout = 1) > + if s != 0: > + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, > + packetsize = size, > + adaptive = True, hint = "do", > + timeout = 20) > + if kvm_net_utils.get_loss_ratio(o) > 50: > + raise error.TestFail("ping loss ratio is greater " > + "than 50% for size %s" % size) ^ How do we stablish 50% as an acceptable packet loss ratio for this test? Seems high to me, but I might be missing something > + > + logging.info("Waiting for the MTU to be OK") > + # Wait for the MTU is OK ^ Unneeded comment, as we have an info message stating the same thing > + if not kvm_utils.wait_for(is_mtu_ok, 10, 0, 1): > + logging.debug(commands.getoutput("ifconfig -a")) > + raise error.TestError("10 seconds elapsed while the mtu is not" > + " as expected") > + > + # Functional Test > + verify_mtu() > + large_frame_ping() > + size_increase_ping() > + > + # Stress test > + flood_ping() > + verify_mtu() > + > + finally: > + # Environment clean > + session.close() > + logging.info("Removing the temporary arp entry") > + commands.getstatusoutput("arp -d %s -i %s" % (ip, ifname)) > diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample > index 4f58dc0..7f7b56a 100644 > --- a/client/tests/kvm/tests_base.cfg.sample > +++ b/client/tests/kvm/tests_base.cfg.sample > @@ -354,6 +354,9 @@ variants: > counts = 100 > flood_minutes = 10 > > + - jumbo: install setup unattended_install.cdrom > + type = jumbo > + > - physical_resources_check: install setup unattended_install.cdrom > type = physical_resources_check > catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}' > @@ -489,10 +492,16 @@ variants: > variants: > - @rtl8139: > nic_model = rtl8139 > + jumbo: > + mtu = 1500 > - e1000: > nic_model = e1000 > + jumbo: > + mtu = 16110 > - virtio: > nic_model = virtio > + jumbo: > + mtu = 65520 > > > # Guests > @@ -1024,7 +1033,7 @@ variants: > > # Windows section > - @Windows: > - no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) > + no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo > shutdown_command = shutdown /s /f /t 0 > reboot_command = shutdown /r /f /t 0 > status_test_command = echo %errorlevel% > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jul 27, 2010 at 10:13 PM, Lucas Meneghel Rodrigues <lmr@redhat.com> wrote: > On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote: >> According to different nic model set different MTU for it. And ping from guest >> to host, to see whether tested size can be received by host. >> >> Signed-off-by: Jason Wang <jasowang@redhat.com> >> Signed-off-by: Amos Kong <akong@redhat.com> >> --- >> 0 files changed, 0 insertions(+), 0 deletions(-) >> >> diff --git a/client/tests/kvm/tests/jumbo.py b/client/tests/kvm/tests/jumbo.py >> new file mode 100644 >> index 0000000..9f56a87 >> --- /dev/null >> +++ b/client/tests/kvm/tests/jumbo.py >> @@ -0,0 +1,133 @@ >> +import os, re, logging, commands, time, random >> +from autotest_lib.client.common_lib import error >> +import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_net_utils >> + >> +def run_jumbo(test, params, env): >> + """ >> + Test the RX jumbo frame function of vnics: >> + 1) boot the vm >> + 2) change the MTU of guest nics and host taps depends on the nic model > > ^ I think you meant 'depending on the nic model' > >> + 3) add the static arp entry for guest nic >> + 4) wait for the MTU ok >> + 5) verify the patch mtu using ping >> + 6) ping the guest with large frames >> + 7) increament size ping > > ^ typo, increment > >> + 8) flood ping the guest with large frames >> + 9) verify the path mtu >> + 10) revocer the mtu > > ^ maybe a typo, restore? > >> + >> + @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) >> + mtu = params.get("mtu", "1500") >> + flood_time = params.get("flood_time", "300") >> + max_icmp_pkt_size = int(mtu) - 28 >> + >> + ifname = vm.get_ifname(0) >> + ip = vm.get_address(0) >> + if ip is None: >> + raise error.TestError("Could not get the ip address") >> + >> + try: >> + # Environment preparartion > > ^ typo, preparation > >> + ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0)) >> + >> + logging.info("Changing the mtu of guest ...") >> + guest_mtu_cmd = "ifconfig %s mtu %s" % (ethname , mtu) >> + s, o = session.get_command_status_output(guest_mtu_cmd) >> + if s != 0: >> + logging.error(o) >> + raise error.TestError("Fail to set the mtu of guest nic: %s" >> + % ethname) >> + >> + logging.info("Chaning the mtu of host tap ...") >> + host_mtu_cmd = "ifconfig %s mtu %s" % (ifname, mtu) >> + s, o = commands.getstatusoutput(host_mtu_cmd) >> + if s != 0: >> + raise error.TestError("Fail to set the mtu of %s" % ifname) >> + >> + logging.info("Add a temporary static arp entry ...") >> + arp_add_cmd = "arp -s %s %s -i %s" % (ip, vm.get_macaddr(0), ifname) >> + s, o = commands.getstatusoutput(arp_add_cmd) >> + if s != 0 : >> + raise error.TestError("Fail to add temporary arp entry") >> + >> + def is_mtu_ok(): >> + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, >> + packetsize = max_icmp_pkt_size, >> + hint = "do", timeout = 2) > > ^ please fix the default argument attribution, here and all subsequent > calls > >> + if s != 0: >> + return False >> + else: >> + return True > > ^ Here you could simple use return s != 0 > >> + >> + def verify_mtu(): >> + logging.info("Verify the path mtu") >> + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, >> + packetsize = max_icmp_pkt_size, >> + hint = "do", timeout = 15) >> + if s != 0 : >> + logging.error(o) >> + raise error.TestFail("Path MTU is not as expected") >> + if kvm_net_utils.get_loss_ratio(o) != 0: >> + logging.error(o) >> + raise error.TestFail("Packet loss ratio during mtu verification" >> + " is not zero") >> + >> + def flood_ping(): >> + logging.info("Flood with large frames") >> + kvm_net_utils.ping(ip, interface = ifname, >> + packetsize = max_icmp_pkt_size, >> + flood = True, timeout = float(flood_time)) >> + >> + def large_frame_ping(count = 100): >> + logging.info("Large frame ping") >> + s, o = kvm_net_utils.ping(ip, count, interface = ifname, >> + packetsize = max_icmp_pkt_size, >> + timeout = float(count) * 2) >> + ratio = kvm_net_utils.get_loss_ratio(o) >> + if ratio != 0: >> + raise error.TestFail("Loss ratio of large frame ping is %s" \ >> + % ratio) > > ^ No need to use the backslash to end line here > >> + def size_increase_ping(step = random.randrange(90, 110)): >> + logging.info("Size increase ping") >> + for size in range(0, max_icmp_pkt_size + 1, step): >> + logging.info("Ping %s with size %s" % (ip, size)) >> + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, >> + packetsize = size, >> + hint = "do", timeout = 1) >> + if s != 0: >> + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, >> + packetsize = size, >> + adaptive = True, hint = "do", >> + timeout = 20) >> + if kvm_net_utils.get_loss_ratio(o) > 50: >> + raise error.TestFail("ping loss ratio is greater " >> + "than 50% for size %s" % size) > > ^ How do we stablish 50% as an acceptable packet loss ratio for this > test? Seems high to me, but I might be missing something It's just a 'experimental' standard, we can also make it can be setup in config file. (missing some email, reply by personal Email :)
diff --git a/client/tests/kvm/tests/jumbo.py b/client/tests/kvm/tests/jumbo.py new file mode 100644 index 0000000..9f56a87 --- /dev/null +++ b/client/tests/kvm/tests/jumbo.py @@ -0,0 +1,133 @@ +import os, re, logging, commands, time, random +from autotest_lib.client.common_lib import error +import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_net_utils + +def run_jumbo(test, params, env): + """ + Test the RX jumbo frame function of vnics: + 1) boot the vm + 2) change the MTU of guest nics and host taps depends on the nic model + 3) add the static arp entry for guest nic + 4) wait for the MTU ok + 5) verify the patch mtu using ping + 6) ping the guest with large frames + 7) increament size ping + 8) flood ping the guest with large frames + 9) verify the path mtu + 10) revocer the mtu + + @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) + mtu = params.get("mtu", "1500") + flood_time = params.get("flood_time", "300") + max_icmp_pkt_size = int(mtu) - 28 + + ifname = vm.get_ifname(0) + ip = vm.get_address(0) + if ip is None: + raise error.TestError("Could not get the ip address") + + try: + # Environment preparartion + ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0)) + + logging.info("Changing the mtu of guest ...") + guest_mtu_cmd = "ifconfig %s mtu %s" % (ethname , mtu) + s, o = session.get_command_status_output(guest_mtu_cmd) + if s != 0: + logging.error(o) + raise error.TestError("Fail to set the mtu of guest nic: %s" + % ethname) + + logging.info("Chaning the mtu of host tap ...") + host_mtu_cmd = "ifconfig %s mtu %s" % (ifname, mtu) + s, o = commands.getstatusoutput(host_mtu_cmd) + if s != 0: + raise error.TestError("Fail to set the mtu of %s" % ifname) + + logging.info("Add a temporary static arp entry ...") + arp_add_cmd = "arp -s %s %s -i %s" % (ip, vm.get_macaddr(0), ifname) + s, o = commands.getstatusoutput(arp_add_cmd) + if s != 0 : + raise error.TestError("Fail to add temporary arp entry") + + def is_mtu_ok(): + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, + packetsize = max_icmp_pkt_size, + hint = "do", timeout = 2) + if s != 0: + return False + else: + return True + + def verify_mtu(): + logging.info("Verify the path mtu") + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, + packetsize = max_icmp_pkt_size, + hint = "do", timeout = 15) + if s != 0 : + logging.error(o) + raise error.TestFail("Path MTU is not as expected") + if kvm_net_utils.get_loss_ratio(o) != 0: + logging.error(o) + raise error.TestFail("Packet loss ratio during mtu verification" + " is not zero") + + def flood_ping(): + logging.info("Flood with large frames") + kvm_net_utils.ping(ip, interface = ifname, + packetsize = max_icmp_pkt_size, + flood = True, timeout = float(flood_time)) + + def large_frame_ping(count = 100): + logging.info("Large frame ping") + s, o = kvm_net_utils.ping(ip, count, interface = ifname, + packetsize = max_icmp_pkt_size, + timeout = float(count) * 2) + ratio = kvm_net_utils.get_loss_ratio(o) + if ratio != 0: + raise error.TestFail("Loss ratio of large frame ping is %s" \ + % ratio) + + def size_increase_ping(step = random.randrange(90, 110)): + logging.info("Size increase ping") + for size in range(0, max_icmp_pkt_size + 1, step): + logging.info("Ping %s with size %s" % (ip, size)) + s, o = kvm_net_utils.ping(ip, 1, interface = ifname, + packetsize = size, + hint = "do", timeout = 1) + if s != 0: + s, o = kvm_net_utils.ping(ip, 10, interface = ifname, + packetsize = size, + adaptive = True, hint = "do", + timeout = 20) + if kvm_net_utils.get_loss_ratio(o) > 50: + raise error.TestFail("ping loss ratio is greater " + "than 50% for size %s" % size) + + logging.info("Waiting for the MTU to be OK") + # Wait for the MTU is OK + if not kvm_utils.wait_for(is_mtu_ok, 10, 0, 1): + logging.debug(commands.getoutput("ifconfig -a")) + raise error.TestError("10 seconds elapsed while the mtu is not" + " as expected") + + # Functional Test + verify_mtu() + large_frame_ping() + size_increase_ping() + + # Stress test + flood_ping() + verify_mtu() + + finally: + # Environment clean + session.close() + logging.info("Removing the temporary arp entry") + commands.getstatusoutput("arp -d %s -i %s" % (ip, ifname)) diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample index 4f58dc0..7f7b56a 100644 --- a/client/tests/kvm/tests_base.cfg.sample +++ b/client/tests/kvm/tests_base.cfg.sample @@ -354,6 +354,9 @@ variants: counts = 100 flood_minutes = 10 + - jumbo: install setup unattended_install.cdrom + type = jumbo + - physical_resources_check: install setup unattended_install.cdrom type = physical_resources_check catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}' @@ -489,10 +492,16 @@ variants: variants: - @rtl8139: nic_model = rtl8139 + jumbo: + mtu = 1500 - e1000: nic_model = e1000 + jumbo: + mtu = 16110 - virtio: nic_model = virtio + jumbo: + mtu = 65520 # Guests @@ -1024,7 +1033,7 @@ variants: # Windows section - @Windows: - no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) + no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo shutdown_command = shutdown /s /f /t 0 reboot_command = shutdown /r /f /t 0 status_test_command = echo %errorlevel%