Add image_copy subtest for convenient KVM functional testing.

The target image will be copied into the linked directory if link 'images'
is created, and copied to the directory specified in config file otherwise.

Signed-off-by: Yolkfull Chow <yz...@redhat.com>
---
 client/tests/kvm/kvm_utils.py          |   64 ++++++++++++++++++++++++++++++++
 client/tests/kvm/tests/image_copy.py   |   42 +++++++++++++++++++++
 client/tests/kvm/tests_base.cfg.sample |    6 +++
 3 files changed, 112 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/tests/image_copy.py

diff --git a/client/tests/kvm/kvm_utils.py b/client/tests/kvm/kvm_utils.py
index 2bbbe22..1e11441 100644
--- a/client/tests/kvm/kvm_utils.py
+++ b/client/tests/kvm/kvm_utils.py
@@ -924,3 +924,67 @@ def create_report(report_dir, results_dir):
     reporter = os.path.join(report_dir, 'html_report.py')
     html_file = os.path.join(results_dir, 'results.html')
     os.system('%s -r %s -f %s -R' % (reporter, results_dir, html_file))
+
+
+def is_dir_mounted(source, dest, type, perm):
+    """
+    Check whether `source' is mounted on `dest' with right permission.
+
+    @source: mount source
+    @dest:   mount point
+    @type:   file system type
+    """
+    match_string = "%s %s %s %s" % (source, dest, type, perm)
+    try:
+        f = open("/etc/mtab", "r")
+    except IOError:
+        pass
+    mounted = f.read()
+    f.close()
+    if match_string in mounted: 
+        return True
+    return False
+
+
+def umount(mount_point):
+    """
+    Umount `mount_point'.
+
+    @mount_point: mount point
+    """
+    cmd = "umount %s" % mount_point
+    s, o = commands.getstatusoutput(cmd)
+    if s != 0:
+        logging.error("Fail to umount: %s" % o)
+        return False
+    return True
+
+
+def mount(src, mount_point, type, perm = "rw"):
+    """
+    Mount the src into mount_point of the host.
+
+    @src: mount source
+    @mount_point: mount point
+    @type: file system type
+    @perm: mount permission
+    """
+    if is_dir_mounted(src, mount_point, type, perm):
+        return True
+
+    umount(mount_point)
+
+    cmd = "mount -t %s %s %s -o %s" % (type, src, mount_point, perm)
+    logging.debug("Issue mount command: %s" % cmd)
+    s, o = commands.getstatusoutput(cmd)
+    if s != 0:
+        logging.error("Fail to mount: %s " % o)
+        return False
+
+    if is_dir_mounted(src, mount_point, type, perm):
+        logging.info("Successfully mounted %s" % src)
+        return True
+    else:
+        logging.error("Mount verification failed; currently mounted: %s" %
+                                                 file('/etc/mtab').read())
+        return False
diff --git a/client/tests/kvm/tests/image_copy.py 
b/client/tests/kvm/tests/image_copy.py
new file mode 100644
index 0000000..800fb90
--- /dev/null
+++ b/client/tests/kvm/tests/image_copy.py
@@ -0,0 +1,42 @@
+import os, logging, commands
+from autotest_lib.client.common_lib import error
+import kvm_utils
+
+def run_image_copy(test, params, env):
+    """
+    Copy guest images from NFS server.
+    1) Mount the NFS directory
+    2) Check the existence of source image
+    3) If existence copy the image from NFS
+
+    @param test: kvm test object
+    @param params: Dictionary with the test parameters
+    @param env: Dictionary with test environment.
+    """
+    mount_dest_dir = params.get("dst_dir",'/mnt/images')
+    if not os.path.exists(mount_dest_dir):
+        os.mkdir(mount_dest_dir)
+
+    src_dir = params.get('nfs_images_dir')
+    image_dir = os.path.join(os.environ['AUTODIR'],'tests/kvm/images')
+    if not os.path.exists(image_dir):
+        image_dir = os.path.dirname(params.get("image_name"))
+
+    image = os.path.split(params['image_name'])[1]+'.'+params['image_format']
+
+    src_path = os.path.join(mount_dest_dir, image)
+    dst_path = os.path.join(image_dir, image)
+
+    if not kvm_utils.mount(src_dir, mount_dest_dir, "nfs", "ro"):
+        raise error.TestError("Fail to mount the %s to %s" %
+                                  (src_dir, mount_dest_dir))
+                              
+    # Check the existence of source image
+    if not os.path.exists(src_path):
+        raise error.TestError("Could not found %s in src directory" % src_path)
+
+    logging.info("Copying image '%s'..." % image)
+    cmd = "cp %s %s" % (src_path, dst_path)
+    s, o = commands.getstatusoutput(cmd)
+    if s != 0:
+        raise error.TestFail("Failed to copy image %s: %s" % (cmd, o))
diff --git a/client/tests/kvm/tests_base.cfg.sample 
b/client/tests/kvm/tests_base.cfg.sample
index b8f25f4..bdeac19 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -61,6 +61,12 @@ variants:
         floppy = "images/floppy.img"
         extra_params += " -boot d"
 
+    - image_copy:
+        type = image_copy
+        vms = ''
+        # Here specify the NFS directory that contains all images
+        nfs_images_dir = 
+
     - setup:        install unattended_install
         type = steps
         fail_if_stuck_for = 300
-- 
1.6.6

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

Reply via email to