All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: autotest@test.kernel.org, qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: Re: [RFC PATCH 08/14] KVM-test: Add a subtest of nic promisc
Date: Wed, 28 Jul 2010 18:35:26 -0300	[thread overview]
Message-ID: <1280352926.2578.291.camel@freedom> (raw)
In-Reply-To: <20100720013558.2212.32065.stgit@z>

On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote:
> This test mainly covers TCP sent from host to guest and from guest to host
> with repeatedly turn on/off NIC promiscuous mode.
> 
> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
>  0 files changed, 0 insertions(+), 0 deletions(-)
> 
> diff --git a/client/tests/kvm/tests/nic_promisc.py b/client/tests/kvm/tests/nic_promisc.py
> new file mode 100644
> index 0000000..9a0c979
> --- /dev/null
> +++ b/client/tests/kvm/tests/nic_promisc.py
> @@ -0,0 +1,87 @@
> +import logging, commands
> +from autotest_lib.client.common_lib import error
> +import kvm_utils, kvm_test_utils, kvm_net_utils
> +
> +def run_nic_promisc(test, params, env):
> +    """
> +    Test nic driver in promisc mode:
> +
> +    1) Boot up a guest
> +    2) Repeatedly enable/disable promiscuous mode in guest
> +    3) TCP data transmission from host to guest, and from guest to host,
> +       with 1/1460/65000/100000000 bytes payloads
> +    4) Clean temporary files
> +    5) Stop enable/disable promiscuous mode change
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environment
> +    """
> +    timeout = int(params.get("login_timeout", 360))
> +    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
> +    session = kvm_test_utils.wait_for_login(vm, timeout=timeout)
> +    logging.info("Trying to log into guest '%s' by serial", vm.name)
> +    session2 = kvm_utils.wait_for(lambda: vm.serial_login(),
> +                                  timeout, 0, step=2)
> +    if not session2:
> +        raise error.TestFail("Could not log into guest '%s'" % vm.name)
> +
> +    def compare(filename):
> +        cmd = "md5sum %s" % filename
> +        s1, ret_host = commands.getstatusoutput(cmd)
> +        s2, ret_guest = session.get_command_status_output(cmd)
> +        if s1 != 0 or s2 != 0:
> +            logging.debug("ret_host:%s, ret_guest:%s" % (ret_host, ret_guest))
> +            logging.error("Could not get md5, cmd:%s" % cmd)
> +            return False
> +        if ret_host.strip() != ret_guest.strip():
> +            logging.debug("ret_host :%s, ret_guest:%s" % (ret_host, ret_guest))
> +            logging.error("Files' md5sum mismatch" % (receiver))
> +            return False

^ The above debug messages will be confusing when looked by someone who
is not familiar with the test code, so we should make their lives
easier:

    def compare(filename):
        cmd = "md5sum %s" % filename
        rc_host, md5_host = commands.getstatusoutput(cmd)
        rc_guest, md5_guest = session.get_command_status_output(cmd)
        if rc_host:
            logging.debug('Could not get MD5 hash for file %s on host, output: %s', filename, md5_host)
            return False
        if rc_guest:
            logging.debug('Could not get MD5 hash for file %s on guest, output: %s', filename, md5_guest)
            return False
        md5host = md5host.strip()
        md5guest = md5guest.strip()
        if md5host != md5guest:
            logging.error('MD5 hash mismatch between file %s present on guest and on host', filename)
            logging.error('MD5 hash for file on guest: %s, MD5 hash for file on host: %s', md5_host, md5_guest)
            return False
        return True


> +        return True
> +
> +    ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0))
> +    set_promisc_cmd = "ip link set %s promisc on; sleep 0.01;" % ethname
> +    set_promisc_cmd += "ip link set %s promisc off; sleep 0.01" % ethname

^ You could do the above on a single attribution, see comment on patch 7
of the patchseries.

> +    logging.info("Set promisc change repeatedly in guest")
> +    session2.sendline("while true; do %s; done" % set_promisc_cmd)
> +
> +    dd_cmd = "dd if=/dev/urandom of=%s bs=%d count=1"
> +    filename = "/tmp/nic_promisc_file"
> +    file_size = params.get("file_size", "1, 1460, 65000, 100000000").split(",")
> +    try:
> +        for size in file_size:
> +            logging.info("Create %s bytes file on host" % size)
> +            s, o = commands.getstatusoutput(dd_cmd % (filename, int(size)))
> +            if s != 0:
> +                logging.debug("Output: %s"% o)
> +                raise error.TestFail("Create file on host failed")
> +
> +            logging.info("Transfer file from host to guest")
> +            if not vm.copy_files_to(filename, filename):
> +                raise error.TestFail("File transfer failed")
> +            if not compare(filename):
> +                raise error.TestFail("Compare file failed")

^ It'd be better if we don't abruptly fail the whole test if we get a
failure for a single size, what about having a global failure counter,
and increment it if we have failures, making sure we log errors
appropriately?

> +            logging.info("Create %s bytes file on guest" % size)
> +            if session.get_command_status(dd_cmd % (filename, int(size)),
> +                                                    timeout=100) != 0:
> +                raise error.TestFail("Create file on guest failed")
> +
> +            logging.info("Transfer file from guest to host")
> +            if not vm.copy_files_from(filename, filename):
> +                raise error.TestFail("File transfer failed")
> +            if not compare(filename):
> +                raise error.TestFail("Compare file failed")

^ Same comment as above.

> +            logging.info("Clean temporal files")

^ Typo, temporary

> +            cmd = "rm -f %s" % filename
> +            s1, o = commands.getstatusoutput(cmd)
> +            s2 = session.get_command_status(cmd)
> +            if s1 != 0 or s2 != 0:
> +                raise error.TestError("Fail to clean temporal files")

^ Same as above, with the exception that maybe a failure during cleanup
is not something so bad we'd need to fail the entire test because of it.

> +    finally:
> +        logging.info("Restore the %s to the nonpromisc mode" % ethname)
> +        session2.close()
> +        session.get_command_status("ip link set %s promisc off" % ethname)
> +        session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 03d15c0..9e2b9a0 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -370,6 +370,10 @@ variants:
>          scp_timeout = 300
>          thread_num = 10
>  
> +    - nic_promisc:  install setup unattended_install.cdrom
> +        type = nic_promisc
> +        file_size = 1, 1460, 65000, 100000000
> +
>      - physical_resources_check: install setup unattended_install.cdrom
>          type = physical_resources_check
>          catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
> @@ -1046,7 +1050,7 @@ variants:
>  
>      # Windows section
>      - @Windows:
> -        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload
> +        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload nic_promisc
>          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



WARNING: multiple messages have this Message-ID (diff)
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: autotest@test.kernel.org, qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [Qemu-devel] Re: [RFC PATCH 08/14] KVM-test: Add a subtest of nic promisc
Date: Wed, 28 Jul 2010 18:35:26 -0300	[thread overview]
Message-ID: <1280352926.2578.291.camel@freedom> (raw)
In-Reply-To: <20100720013558.2212.32065.stgit@z>

On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote:
> This test mainly covers TCP sent from host to guest and from guest to host
> with repeatedly turn on/off NIC promiscuous mode.
> 
> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
>  0 files changed, 0 insertions(+), 0 deletions(-)
> 
> diff --git a/client/tests/kvm/tests/nic_promisc.py b/client/tests/kvm/tests/nic_promisc.py
> new file mode 100644
> index 0000000..9a0c979
> --- /dev/null
> +++ b/client/tests/kvm/tests/nic_promisc.py
> @@ -0,0 +1,87 @@
> +import logging, commands
> +from autotest_lib.client.common_lib import error
> +import kvm_utils, kvm_test_utils, kvm_net_utils
> +
> +def run_nic_promisc(test, params, env):
> +    """
> +    Test nic driver in promisc mode:
> +
> +    1) Boot up a guest
> +    2) Repeatedly enable/disable promiscuous mode in guest
> +    3) TCP data transmission from host to guest, and from guest to host,
> +       with 1/1460/65000/100000000 bytes payloads
> +    4) Clean temporary files
> +    5) Stop enable/disable promiscuous mode change
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environment
> +    """
> +    timeout = int(params.get("login_timeout", 360))
> +    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
> +    session = kvm_test_utils.wait_for_login(vm, timeout=timeout)
> +    logging.info("Trying to log into guest '%s' by serial", vm.name)
> +    session2 = kvm_utils.wait_for(lambda: vm.serial_login(),
> +                                  timeout, 0, step=2)
> +    if not session2:
> +        raise error.TestFail("Could not log into guest '%s'" % vm.name)
> +
> +    def compare(filename):
> +        cmd = "md5sum %s" % filename
> +        s1, ret_host = commands.getstatusoutput(cmd)
> +        s2, ret_guest = session.get_command_status_output(cmd)
> +        if s1 != 0 or s2 != 0:
> +            logging.debug("ret_host:%s, ret_guest:%s" % (ret_host, ret_guest))
> +            logging.error("Could not get md5, cmd:%s" % cmd)
> +            return False
> +        if ret_host.strip() != ret_guest.strip():
> +            logging.debug("ret_host :%s, ret_guest:%s" % (ret_host, ret_guest))
> +            logging.error("Files' md5sum mismatch" % (receiver))
> +            return False

^ The above debug messages will be confusing when looked by someone who
is not familiar with the test code, so we should make their lives
easier:

    def compare(filename):
        cmd = "md5sum %s" % filename
        rc_host, md5_host = commands.getstatusoutput(cmd)
        rc_guest, md5_guest = session.get_command_status_output(cmd)
        if rc_host:
            logging.debug('Could not get MD5 hash for file %s on host, output: %s', filename, md5_host)
            return False
        if rc_guest:
            logging.debug('Could not get MD5 hash for file %s on guest, output: %s', filename, md5_guest)
            return False
        md5host = md5host.strip()
        md5guest = md5guest.strip()
        if md5host != md5guest:
            logging.error('MD5 hash mismatch between file %s present on guest and on host', filename)
            logging.error('MD5 hash for file on guest: %s, MD5 hash for file on host: %s', md5_host, md5_guest)
            return False
        return True


> +        return True
> +
> +    ethname = kvm_net_utils.get_linux_ifname(session, vm.get_macaddr(0))
> +    set_promisc_cmd = "ip link set %s promisc on; sleep 0.01;" % ethname
> +    set_promisc_cmd += "ip link set %s promisc off; sleep 0.01" % ethname

^ You could do the above on a single attribution, see comment on patch 7
of the patchseries.

> +    logging.info("Set promisc change repeatedly in guest")
> +    session2.sendline("while true; do %s; done" % set_promisc_cmd)
> +
> +    dd_cmd = "dd if=/dev/urandom of=%s bs=%d count=1"
> +    filename = "/tmp/nic_promisc_file"
> +    file_size = params.get("file_size", "1, 1460, 65000, 100000000").split(",")
> +    try:
> +        for size in file_size:
> +            logging.info("Create %s bytes file on host" % size)
> +            s, o = commands.getstatusoutput(dd_cmd % (filename, int(size)))
> +            if s != 0:
> +                logging.debug("Output: %s"% o)
> +                raise error.TestFail("Create file on host failed")
> +
> +            logging.info("Transfer file from host to guest")
> +            if not vm.copy_files_to(filename, filename):
> +                raise error.TestFail("File transfer failed")
> +            if not compare(filename):
> +                raise error.TestFail("Compare file failed")

^ It'd be better if we don't abruptly fail the whole test if we get a
failure for a single size, what about having a global failure counter,
and increment it if we have failures, making sure we log errors
appropriately?

> +            logging.info("Create %s bytes file on guest" % size)
> +            if session.get_command_status(dd_cmd % (filename, int(size)),
> +                                                    timeout=100) != 0:
> +                raise error.TestFail("Create file on guest failed")
> +
> +            logging.info("Transfer file from guest to host")
> +            if not vm.copy_files_from(filename, filename):
> +                raise error.TestFail("File transfer failed")
> +            if not compare(filename):
> +                raise error.TestFail("Compare file failed")

^ Same comment as above.

> +            logging.info("Clean temporal files")

^ Typo, temporary

> +            cmd = "rm -f %s" % filename
> +            s1, o = commands.getstatusoutput(cmd)
> +            s2 = session.get_command_status(cmd)
> +            if s1 != 0 or s2 != 0:
> +                raise error.TestError("Fail to clean temporal files")

^ Same as above, with the exception that maybe a failure during cleanup
is not something so bad we'd need to fail the entire test because of it.

> +    finally:
> +        logging.info("Restore the %s to the nonpromisc mode" % ethname)
> +        session2.close()
> +        session.get_command_status("ip link set %s promisc off" % ethname)
> +        session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 03d15c0..9e2b9a0 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -370,6 +370,10 @@ variants:
>          scp_timeout = 300
>          thread_num = 10
>  
> +    - nic_promisc:  install setup unattended_install.cdrom
> +        type = nic_promisc
> +        file_size = 1, 1460, 65000, 100000000
> +
>      - physical_resources_check: install setup unattended_install.cdrom
>          type = physical_resources_check
>          catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
> @@ -1046,7 +1050,7 @@ variants:
>  
>      # Windows section
>      - @Windows:
> -        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload
> +        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer nicdriver_unload nic_promisc
>          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

  reply	other threads:[~2010-07-28 21:35 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-20  1:34 [RFC PATCH 00/14] Patchset of network related subtests Amos Kong
2010-07-20  1:34 ` [Qemu-devel] [Autotest][RFC " Amos Kong
2010-07-20  1:34 ` [RFC PATCH 01/14] KVM-test: Add a new macaddress pool algorithm Amos Kong
2010-07-20  1:34   ` [Qemu-devel] " Amos Kong
2010-07-20 10:19   ` Michael Goldish
2010-07-20 10:19     ` Michael Goldish
2010-07-20 13:44     ` Amos Kong
2010-07-20 15:53       ` Michael Goldish
2010-07-20 15:53         ` Michael Goldish
2010-08-03  1:34         ` Amos Kong
2010-07-27  1:48   ` Lucas Meneghel Rodrigues
2010-07-27  1:48     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-07-20  1:35 ` [RFC PATCH 02/14] KVM Test: Add a function get_interface_name() to kvm_net_utils.py Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27  2:08   ` Lucas Meneghel Rodrigues
2010-07-27  2:08     ` Lucas Meneghel Rodrigues
2010-07-28 10:29     ` Michael Goldish
2010-07-28 10:29       ` Michael Goldish
2010-08-03  1:39       ` Amos Kong
2010-07-20  1:35 ` [RFC PATCH 03/14] KVM Test: Add a common ping module for network related tests Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 13:01   ` Lucas Meneghel Rodrigues
2010-07-28 11:50     ` Michael Goldish
2010-07-28 13:56       ` Michael Goldish
2010-07-28 13:56         ` Michael Goldish
2010-07-20  1:35 ` [RFC PATCH 04/14] KVM-test: Add a new subtest ping Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 13:15   ` Lucas Meneghel Rodrigues
2010-07-27 13:15     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-03  1:54     ` Amos Kong
2010-08-03  1:54       ` [Qemu-devel] " Amos Kong
2010-07-20  1:35 ` [RFC PATCH 05/14] KVM-test: Add a subtest jumbo Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 14:13   ` Lucas Meneghel Rodrigues
2010-07-27 14:13     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-10  7:18     ` Amos Kong
2010-08-10  7:18       ` [Qemu-devel] Re: [Autotest] " Amos Kong
2010-07-20  1:35 ` [RFC PATCH 06/14] KVM-test: Add basic file transfer test Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-27 14:36   ` Lucas Meneghel Rodrigues
2010-08-10  9:29     ` [Autotest] " Amos Kong
2010-08-10  9:29       ` Amos Kong
2010-07-20  1:35 ` [RFC PATCH 07/14] KVM-test: Add a subtest of load/unload nic driver Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-28 18:12   ` Lucas Meneghel Rodrigues
2010-07-20  1:35 ` [RFC PATCH 08/14] KVM-test: Add a subtest of nic promisc Amos Kong
2010-07-20  1:35   ` [Qemu-devel] " Amos Kong
2010-07-28 21:35   ` Lucas Meneghel Rodrigues [this message]
2010-07-28 21:35     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-11  1:34     ` [Autotest] " Amos Kong
2010-08-11  1:34       ` [Qemu-devel] " Amos Kong
2010-07-20  1:36 ` [RFC PATCH 09/14] KVM-test: Add a subtest of multicast Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 21:55   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 10/14] KVM-test: Add a subtest of pxe Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 22:07   ` Lucas Meneghel Rodrigues
2010-08-10  6:11     ` Amos Kong
2010-07-20  1:36 ` [RFC PATCH 11/14] KVM-test: Add a subtest of changing mac address Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-28 22:30   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 12/14] KVM-test: Add a subtest of netperf Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-30 16:32   ` Lucas Meneghel Rodrigues
2010-07-20  1:36 ` [RFC PATCH 13/14] KVM-test: Improve vlan subtest Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-07-20  1:36 ` [RFC PATCH 14/14] KVM-test: Add subtest of testing offload by ethtool Amos Kong
2010-07-20  1:36   ` [Qemu-devel] " Amos Kong
2010-08-02 19:10   ` Lucas Meneghel Rodrigues
2010-08-02 19:10     ` [Qemu-devel] " Lucas Meneghel Rodrigues
2010-08-10  7:07     ` Amos Kong
2010-08-10  7:07       ` [Qemu-devel] Re: [Autotest] " Amos Kong
2010-07-20 12:12 ` [RFC PATCH 00/14] Patchset of network related subtests Lucas Meneghel Rodrigues
2010-07-20 12:12   ` [Qemu-devel] Re: [Autotest][RFC " Lucas Meneghel Rodrigues
2010-08-02 20:58 ` [RFC " Lucas Meneghel Rodrigues
2010-08-02 20:58   ` [Qemu-devel] Re: [Autotest][RFC " Lucas Meneghel Rodrigues

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=1280352926.2578.291.camel@freedom \
    --to=lmr@redhat.com \
    --cc=akong@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=qemu-devel@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.