diff mbox

[RFC,06/14] KVM-test: Add basic file transfer test

Message ID 20100720013541.2212.76461.stgit@z
State Not Applicable
Headers show

Commit Message

Amos Kong July 20, 2010, 1:35 a.m. UTC
This test is the basic test of transfering file between host and guest. Try to
transfer a large file from host to guest, and transfer it back to host, then
compare the files by diff command.
The default file size is 4000M, scp timeout is 1000s. It means if the average
speed is less than 4M/s, this test will be fail.
We can extend this test by using another disk later, then we can transfer larger
files without the limit of first disk size.

Signed-off-by: Amos Kong <akong@redhat.com>
---
 0 files changed, 0 insertions(+), 0 deletions(-)

Comments

Lucas Meneghel Rodrigues July 27, 2010, 2:36 p.m. UTC | #1
On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote:
> This test is the basic test of transfering file between host and guest. Try to
> transfer a large file from host to guest, and transfer it back to host, then
> compare the files by diff command.
> The default file size is 4000M, scp timeout is 1000s. It means if the average
> speed is less than 4M/s, this test will be fail.

^ About this average 4MB/s throughput, is there some sort of
agreement/standard I'm not aware of?

> We can extend this test by using another disk later, then we can transfer larger
> files without the limit of first disk size.
> 
> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
>  0 files changed, 0 insertions(+), 0 deletions(-)
> 
> diff --git a/client/tests/kvm/tests/file_transfer.py b/client/tests/kvm/tests/file_transfer.py
> new file mode 100644
> index 0000000..a20e62e
> --- /dev/null
> +++ b/client/tests/kvm/tests/file_transfer.py
> @@ -0,0 +1,54 @@
> +import logging, commands
> +from autotest_lib.client.common_lib import error
> +import kvm_utils, kvm_test_utils
> +
> +def run_file_transfer(test, params, env):
> +    """
> +    Test ethrnet device function by ethtool
> +
> +    1) Boot up a virtual machine
> +    2) Create a large file by dd on host
> +    3) Copy this file from host to guest
> +    4) Copy this file from guest to host
> +    5) Check if file transfers good
> +
> +    @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"))
> +    timeout=int(params.get("login_timeout", 360))
> +    logging.info("Trying to log into guest '%s' by serial", vm.name)
> +    session = kvm_utils.wait_for(lambda: vm.serial_login(),
> +                                 timeout, 0, step=2)

^ I assume the serial session is being used here to avoid interfering
with the bandwidth required for the test to complete as little as
possible, right?

> +    if not session:
> +        raise error.TestFail("Could not log into guest '%s'" % vm.name)
> +
> +    dir = test.tmpdir
> +    scp_timeout = int(params.get("scp_timeout"))
> +    cmd = "dd if=/dev/urandom of=%s/a.out bs=1M count=%d" %  (dir, int(
> +                                         params.get("filesize", 4000)))
> +    try:
> +        logging.info("Create file by dd command on host, cmd: %s" % cmd)
> +        s, o = commands.getstatusoutput(cmd)
> +        if s != 0:
> +            raise error.TestError("Fail to create file, output:%s" % o)

^ I've seen this throughout the patchseries, the use of functions
present on commands rather than utils.system, or utils.run. The former
are preferable on autotest tests, that's important to have in mind.
Would you consider changing those calls to the autotest API functions?

> +        logging.info("Transfer file from host to guest")
> +        if not vm.copy_files_to("%s/a.out" % dir, "/tmp/b.out",
> +                                                        timeout=scp_timeout):
> +            raise error.TestFail("Fail to transfer file from host to guest")
> +
> +        logging.info("Transfer file from guest to host")
> +        if not vm.copy_files_from("/tmp/b.out", "%s/c.out" % dir,
> +                                                        timeout=scp_timeout):
> +            raise error.TestFail("Fail to transfer file from guest to host")
> +
> +        logging.debug(commands.getoutput("ls -l %s/[ac].out" % dir))
> +        s, o = commands.getstatusoutput("diff %s/a.out %s/c.out" % (dir, dir))
> +        if s != 0:
> +            raise error.TestFail("File changed after transfer. Output:%s" % o)

^ It seems faster to use md5 or sha1 to verify the integrity of the
files rather than diff. Unless there's a good reason to use diff, I'd
like you to change it to one of the programs mentioned above.

> +    finally:
> +        session.get_command_status("rm -f /tmp/b.out")
> +        commands.getoutput("rm -f %s/[ac].out" % dir)
> +        session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 7f7b56a..872674e 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -357,6 +357,11 @@ variants:
>      - jumbo: install setup unattended_install.cdrom
>          type = jumbo
>  
> +    - file_transfer: install setup unattended_install.cdrom
> +        type = file_transfer
> +        filesize = 4000
> +        scp_timeout = 1000
> +
>      - physical_resources_check: install setup unattended_install.cdrom
>          type = physical_resources_check
>          catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
> @@ -1033,7 +1038,7 @@ variants:
>  
>      # Windows section
>      - @Windows:
> -        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo
> +        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer
>          shutdown_command = shutdown /s /f /t 0
>          reboot_command = shutdown /r /f /t 0
>          status_test_command = echo %errorlevel%
> 
>
Jianjun Kong Aug. 10, 2010, 9:29 a.m. UTC | #2
On Tue, Jul 27, 2010 at 10:36 PM, Lucas Meneghel Rodrigues
<lmr@redhat.com> wrote:
> On Tue, 2010-07-20 at 09:35 +0800, Amos Kong wrote:
>> This test is the basic test of transfering file between host and guest. Try to
>> transfer a large file from host to guest, and transfer it back to host, then
>> compare the files by diff command.
>> The default file size is 4000M, scp timeout is 1000s. It means if the average
>> speed is less than 4M/s, this test will be fail.
>
> ^ About this average 4MB/s throughput, is there some sort of
> agreement/standard I'm not aware of?

Also an 'experimental' standard.
The most important purpose is not check the transfer result, but catch
the bug during file transfer.
If case fail of transfer timeout, we need try to augment the timeout,
and compare the test result.

>> We can extend this test by using another disk later, then we can transfer larger
>> files without the limit of first disk size.
>>
>> Signed-off-by: Amos Kong <akong@redhat.com>
>> ---
>>  0 files changed, 0 insertions(+), 0 deletions(-)
>>
>> diff --git a/client/tests/kvm/tests/file_transfer.py b/client/tests/kvm/tests/file_transfer.py
>> new file mode 100644
>> index 0000000..a20e62e
>> --- /dev/null
>> +++ b/client/tests/kvm/tests/file_transfer.py
>> @@ -0,0 +1,54 @@
>> +import logging, commands
>> +from autotest_lib.client.common_lib import error
>> +import kvm_utils, kvm_test_utils
>> +
>> +def run_file_transfer(test, params, env):
>> +    """
>> +    Test ethrnet device function by ethtool
>> +
>> +    1) Boot up a virtual machine
>> +    2) Create a large file by dd on host
>> +    3) Copy this file from host to guest
>> +    4) Copy this file from guest to host
>> +    5) Check if file transfers good
>> +
>> +    @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"))
>> +    timeout=int(params.get("login_timeout", 360))
>> +    logging.info("Trying to log into guest '%s' by serial", vm.name)
>> +    session = kvm_utils.wait_for(lambda: vm.serial_login(),
>> +                                 timeout, 0, step=2)
>
> ^ I assume the serial session is being used here to avoid interfering
> with the bandwidth required for the test to complete as little as
> possible, right?

Just want to split the control connection and data connection, if
network is down, some clean work would not be done.
But there is only one serial console session per VM, when we use
serial_login, serial console log would be disabled.

>> +    if not session:
>> +        raise error.TestFail("Could not log into guest '%s'" % vm.name)
>> +
>> +    dir = test.tmpdir
>> +    scp_timeout = int(params.get("scp_timeout"))
>> +    cmd = "dd if=/dev/urandom of=%s/a.out bs=1M count=%d" %  (dir, int(
>> +                                         params.get("filesize", 4000)))
>> +    try:
>> +        logging.info("Create file by dd command on host, cmd: %s" % cmd)
>> +        s, o = commands.getstatusoutput(cmd)
>> +        if s != 0:
>> +            raise error.TestError("Fail to create file, output:%s" % o)
>
> ^ I've seen this throughout the patchseries, the use of functions
> present on commands rather than utils.system, or utils.run. The former
> are preferable on autotest tests, that's important to have in mind.
> Would you consider changing those calls to the autotest API functions?

ok, I will try to use autotest API.

>> +        logging.info("Transfer file from host to guest")
>> +        if not vm.copy_files_to("%s/a.out" % dir, "/tmp/b.out",
>> +                                                        timeout=scp_timeout):
>> +            raise error.TestFail("Fail to transfer file from host to guest")
>> +
>> +        logging.info("Transfer file from guest to host")
>> +        if not vm.copy_files_from("/tmp/b.out", "%s/c.out" % dir,
>> +                                                        timeout=scp_timeout):
>> +            raise error.TestFail("Fail to transfer file from guest to host")
>> +
>> +        logging.debug(commands.getoutput("ls -l %s/[ac].out" % dir))
>> +        s, o = commands.getstatusoutput("diff %s/a.out %s/c.out" % (dir, dir))
>> +        if s != 0:
>> +            raise error.TestFail("File changed after transfer. Output:%s" % o)
>
> ^ It seems faster to use md5 or sha1 to verify the integrity of the
> files rather than diff. Unless there's a good reason to use diff, I'd
> like you to change it to one of the programs mentioned above.

I would change it to md5.

>> +    finally:
>> +        session.get_command_status("rm -f /tmp/b.out")
>> +        commands.getoutput("rm -f %s/[ac].out" % dir)
>> +        session.close()
>> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
>> index 7f7b56a..872674e 100644
>> --- a/client/tests/kvm/tests_base.cfg.sample
>> +++ b/client/tests/kvm/tests_base.cfg.sample
>> @@ -357,6 +357,11 @@ variants:
>>      - jumbo: install setup unattended_install.cdrom
>>          type = jumbo
>>
>> +    - file_transfer: install setup unattended_install.cdrom
>> +        type = file_transfer
>> +        filesize = 4000
>> +        scp_timeout = 1000
>> +
>>      - physical_resources_check: install setup unattended_install.cdrom
>>          type = physical_resources_check
>>          catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
>> @@ -1033,7 +1038,7 @@ variants:
>>
>>      # Windows section
>>      - @Windows:
>> -        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo
>> +        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer
>>          shutdown_command = shutdown /s /f /t 0
>>          reboot_command = shutdown /r /f /t 0
>>          status_test_command = echo %errorlevel%
>>
>>
>
>
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
diff mbox

Patch

diff --git a/client/tests/kvm/tests/file_transfer.py b/client/tests/kvm/tests/file_transfer.py
new file mode 100644
index 0000000..a20e62e
--- /dev/null
+++ b/client/tests/kvm/tests/file_transfer.py
@@ -0,0 +1,54 @@ 
+import logging, commands
+from autotest_lib.client.common_lib import error
+import kvm_utils, kvm_test_utils
+
+def run_file_transfer(test, params, env):
+    """
+    Test ethrnet device function by ethtool
+
+    1) Boot up a virtual machine
+    2) Create a large file by dd on host
+    3) Copy this file from host to guest
+    4) Copy this file from guest to host
+    5) Check if file transfers good
+
+    @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"))
+    timeout=int(params.get("login_timeout", 360))
+    logging.info("Trying to log into guest '%s' by serial", vm.name)
+    session = kvm_utils.wait_for(lambda: vm.serial_login(),
+                                 timeout, 0, step=2)
+    if not session:
+        raise error.TestFail("Could not log into guest '%s'" % vm.name)
+
+    dir = test.tmpdir
+    scp_timeout = int(params.get("scp_timeout"))
+    cmd = "dd if=/dev/urandom of=%s/a.out bs=1M count=%d" %  (dir, int(
+                                         params.get("filesize", 4000)))
+    try:
+        logging.info("Create file by dd command on host, cmd: %s" % cmd)
+        s, o = commands.getstatusoutput(cmd)
+        if s != 0:
+            raise error.TestError("Fail to create file, output:%s" % o)
+
+        logging.info("Transfer file from host to guest")
+        if not vm.copy_files_to("%s/a.out" % dir, "/tmp/b.out",
+                                                        timeout=scp_timeout):
+            raise error.TestFail("Fail to transfer file from host to guest")
+
+        logging.info("Transfer file from guest to host")
+        if not vm.copy_files_from("/tmp/b.out", "%s/c.out" % dir,
+                                                        timeout=scp_timeout):
+            raise error.TestFail("Fail to transfer file from guest to host")
+
+        logging.debug(commands.getoutput("ls -l %s/[ac].out" % dir))
+        s, o = commands.getstatusoutput("diff %s/a.out %s/c.out" % (dir, dir))
+        if s != 0:
+            raise error.TestFail("File changed after transfer. Output:%s" % o)
+    finally:
+        session.get_command_status("rm -f /tmp/b.out")
+        commands.getoutput("rm -f %s/[ac].out" % dir)
+        session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 7f7b56a..872674e 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -357,6 +357,11 @@  variants:
     - jumbo: install setup unattended_install.cdrom
         type = jumbo
 
+    - file_transfer: install setup unattended_install.cdrom
+        type = file_transfer
+        filesize = 4000
+        scp_timeout = 1000
+
     - physical_resources_check: install setup unattended_install.cdrom
         type = physical_resources_check
         catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
@@ -1033,7 +1038,7 @@  variants:
 
     # Windows section
     - @Windows:
-        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo
+        no autotest linux_s3 vlan_tag ioquit unattended_install.(url|nfs|remote_ks) jumbo file_transfer
         shutdown_command = shutdown /s /f /t 0
         reboot_command = shutdown /r /f /t 0
         status_test_command = echo %errorlevel%