Re: [Autotest] [PATCH] KVM test: Add test for regression found killing guest during netload v2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Sep 5, 2011 at 4:43 PM, Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx> wrote:
> This patch contain two tests:
>
> 1) Try kill guest when guest netwok is under loading.
> 2) Try kill guest after multiple adding and removing network drivers.

Ok Jiri, applied, thanks!

http://autotest.kernel.org/changeset/5543

> Changes from v1:
>  * Use --color=never on ls command to correctly determine nw drivers
>
> Signed-off-by: Jiri Zupka <jzupka@xxxxxxxxxx>
> ---
>  client/tests/kvm/subtests.cfg.sample      |   18 ++++
>  client/virt/tests/netstress_kill_guest.py |  148 +++++++++++++++++++++++++++++
>  2 files changed, 166 insertions(+), 0 deletions(-)
>  create mode 100644 client/virt/tests/netstress_kill_guest.py
>
> diff --git a/client/tests/kvm/subtests.cfg.sample b/client/tests/kvm/subtests.cfg.sample
> index f1e2765..9d9dbba 100644
> --- a/client/tests/kvm/subtests.cfg.sample
> +++ b/client/tests/kvm/subtests.cfg.sample
> @@ -777,6 +777,24 @@ variants:
>         transfer_type = remote
>         kill_vm =yes
>
> +    - netstress_kill_guest: install setup unattended_install.cdrom
> +        only Linux
> +        type = netstress_kill_guest
> +        image_snapshot = yes
> +        nic_mode = tap
> +        # There should be enough vms for build topology.
> +        variants:
> +            -driver:
> +                mode = driver
> +            -load:
> +                mode = load
> +                netperf_files = netperf-2.4.5.tar.bz2 wait_before_data.patch
> +                packet_size = 1500
> +                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"
> +                clean_cmd = " while killall -9 netserver; do True test; done;"
> +                netserver_cmd =  %s/netperf-2.4.5/src/netserver
> +                netperf_cmd = %s/netperf-2.4.5/src/netperf -t %s -H %s -l 60 -- -m %s
> +
>     - physical_resources_check: install setup image_copy unattended_install.cdrom
>         type = physical_resources_check
>         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
> diff --git a/client/virt/tests/netstress_kill_guest.py b/client/virt/tests/netstress_kill_guest.py
> new file mode 100644
> index 0000000..e7e0116
> --- /dev/null
> +++ b/client/virt/tests/netstress_kill_guest.py
> @@ -0,0 +1,148 @@
> +import logging, os, signal, re, time
> +from autotest_lib.client.common_lib import error
> +from autotest_lib.client.bin import utils
> +from autotest_lib.client.virt import aexpect, virt_utils
> +
> +
> +def run_netstress_kill_guest(test, params, env):
> +    """
> +    Try stop network interface in VM when other VM try to communicate.
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environment.
> +    """
> +    def get_corespond_ip(ip):
> +        """
> +        Get local ip address which is used for contact ip.
> +
> +        @param ip: Remote ip
> +        @return: Local corespond IP.
> +        """
> +        result = utils.run("ip route get %s" % (ip)).stdout
> +        ip = re.search("src (.+)", result)
> +        if ip is not None:
> +            ip = ip.groups()[0]
> +        return ip
> +
> +
> +    def get_ethernet_driver(session):
> +        """
> +        Get driver of network cards.
> +
> +        @param session: session to machine
> +        """
> +        modules = []
> +        out = session.cmd("ls -l --color=never "
> +                          "/sys/class/net/*/device/driver/module")
> +        for module in out.split("\n"):
> +            modules.append(module.split("/")[-1])
> +        modules.remove("")
> +        return set(modules)
> +
> +
> +    def kill_and_check(vm):
> +        vm_pid = vm.get_pid()
> +        vm.destroy(gracefully=False)
> +        time.sleep(2)
> +        try:
> +            os.kill(vm_pid, 0)
> +            logging.error("VM is not dead")
> +            raise error.TestFail("VM is not dead after sending signal 0 to it")
> +        except OSError:
> +            logging.info("VM is dead")
> +
> +
> +    def netload_kill_problem(session_serial):
> +        netperf_dir = os.path.join(os.environ['AUTODIR'], "tests/netperf2")
> +        setup_cmd = params.get("setup_cmd")
> +        clean_cmd = params.get("clean_cmd")
> +        firewall_flush = "iptables -F"
> +
> +        try:
> +            utils.run(firewall_flush)
> +        except:
> +            logging.warning("Could not flush firewall rules on guest")
> +
> +        try:
> +            session_serial.cmd(firewall_flush)
> +        except aexpect.ShellError:
> +            logging.warning("Could not flush firewall rules on guest")
> +
> +        for i in params.get("netperf_files").split():
> +            vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp")
> +
> +        guest_ip = vm.get_address(0)
> +        server_ip = get_corespond_ip(guest_ip)
> +
> +        logging.info("Setup and run netperf on host and guest")
> +        session_serial.cmd(setup_cmd % "/tmp", timeout=200)
> +        utils.run(setup_cmd % netperf_dir)
> +
> +        try:
> +            session_serial.cmd(clean_cmd)
> +        except:
> +            pass
> +        session_serial.cmd(params.get("netserver_cmd") % "/tmp")
> +
> +        utils.run(clean_cmd, ignore_status=True)
> +        utils.run(params.get("netserver_cmd") % netperf_dir)
> +
> +        server_netperf_cmd = params.get("netperf_cmd") % (netperf_dir, "TCP_STREAM",
> +                                        guest_ip, params.get("packet_size", "1500"))
> +        quest_netperf_cmd = params.get("netperf_cmd") % ("/tmp", "TCP_STREAM",
> +                                       server_ip, params.get("packet_size", "1500"))
> +
> +        tcpdump = env.get("tcpdump")
> +        pid = None
> +        if tcpdump:
> +            # Stop the background tcpdump process
> +            try:
> +                pid = int(utils.system_output("pidof tcpdump"))
> +                logging.debug("Stopping the background tcpdump")
> +                os.kill(pid, signal.SIGSTOP)
> +            except:
> +                pass
> +
> +        try:
> +            logging.info("Start heavy network load host <=> guest.")
> +            session_serial.sendline(quest_netperf_cmd)
> +            utils.BgJob(server_netperf_cmd)
> +
> +            #Wait for create big network usage.
> +            time.sleep(10)
> +            kill_and_check(vm)
> +
> +        finally:
> +            utils.run(clean_cmd, ignore_status=True)
> +            if tcpdump and pid:
> +                logging.debug("Resuming the background tcpdump")
> +                logging.info("pid is %s" % pid)
> +                os.kill(pid, signal.SIGCONT)
> +
> +
> +    def netdriver_kill_problem(session_serial):
> +        modules = get_ethernet_driver(session_serial)
> +        logging.debug(modules)
> +        for _ in range(50):
> +            for module in modules:
> +                session_serial.cmd("rmmod %s" % (module))
> +                time.sleep(0.2)
> +            for module in modules:
> +                session_serial.cmd("modprobe %s" % (module))
> +                time.sleep(0.2)
> +        kill_and_check(vm)
> +
> +
> +    vm = env.get_vm(params["main_vm"])
> +    vm.verify_alive()
> +    login_timeout = int(params.get("login_timeout", 360))
> +    session = vm.wait_for_login(timeout=login_timeout)
> +    session.close()
> +    session_serial = vm.wait_for_serial_login(timeout=login_timeout)
> +
> +    mode = params.get("mode")
> +    if mode == "driver":
> +        netdriver_kill_problem(session_serial)
> +    elif mode == "load":
> +        netload_kill_problem(session_serial)
> --
> 1.7.6
>
> _______________________________________________
> Autotest mailing list
> Autotest@xxxxxxxxxxxxxxx
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>



-- 
Lucas
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux