convert_image and rebase_image are used frequently, add them to 
kvm_vm.py and kvm_preprocessing.py

cfg example:

    - boot:         install setup
        type = boot
        kill_vm_on_error = yes
        variants:
            - base:
            - convert:
                images +=" convert"
                convert_image = yes
                image_name_convert = converted_image
                image_format_convert = qcow2
                force_create_image_convert = yes
                boot_drive_image1 = no
            - back:
                variants:
                    - snapshot:
                        create_snapshot = yes
                        snapshot_name = snapshot
                        snapshot_format = qcow2
                    - rebase:
                        images = " snapshot"
                        rebase_image = yes
                        image_name_snapshot = snapshot
                        image_format_snapshot = qcow2
                    - commit:
                        images = " snapshot"
                        commit_image = yes
                        image_name_snapshot = snapshot
                        image_format_snapshot = qcow2

Signed-off-by: Suqin Huang <[email protected]>
---
 client/tests/kvm/kvm_preprocessing.py |   38 +++++++++
 client/tests/kvm/kvm_vm.py            |  139 +++++++++++++++++++++++++++++++++
 2 files changed, 177 insertions(+), 0 deletions(-)

diff --git a/client/tests/kvm/kvm_preprocessing.py 
b/client/tests/kvm/kvm_preprocessing.py
index 515e3a5..2defb09 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -56,6 +56,44 @@ def preprocess_vm(test, params, env, name):
         vm = kvm_vm.VM(name, params, test.bindir, env.get("address_cache"))
         env.register_vm(name, vm)
 
+    # Convert vm
+    convert_image = False
+
+    if params.get("convert_image") == "yes":
+        logging.debug("Converting image...")
+        convert_image = True
+
+    if convert_image and not kvm_vm.convert_image(params, test.bindir):
+        raise error.TestFail("Could nt convert image")
+
+    # Create snapshot
+    create_snapshot = False
+
+    if params.get("create_snapshot") == "yes":
+        logging.debug("Create snapshot...")
+        create_snapshot = True
+    if create_snapshot and not kvm_vm.create_image(params, test.bindir):
+        raise error.TestFail("Could not create snapshot")
+
+    # Rebase vm
+    rebase_image = False
+
+    if params.get("rebase_image") == "yes":
+        logging.debug("Rebase snapshot to backing image...")
+        rebase_image = True
+    if rebase_image and not kvm_vm.rebase_image(params, test.bindir):
+        raise error.TestFail("Could not rebase snapshot to backing image")
+
+    # Commit vm
+    commit_image = False
+
+    if params.get("commit_image") == "yes":
+        logging.debug("Commit snapshot to backing image...")
+        commit_image = True
+    if commit_image and not kvm_vm.commit_image(params, test.bindir):
+        raise error.TestFail("Could not commmit snapshot to backing image")
+
+    # Start vm
     start_vm = False
 
     if params.get("restart_vm") == "yes":
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 41f7491..44bdb9d 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -215,12 +215,32 @@ def create_image(params, root_dir):
                                                            "qemu-img"))
     qemu_img_cmd += " create"
 
+    if params.get("encrypted") == "yes":
+        qemu_img_cmd += " -e"
+
+    if params.get("create_snapshot") == "yes":
+        snapshot_name = params.get("snapshot_name")
+        snapshot_format = params.get("snapshot_format", "qcow2")
+        base_format = params.get("image_format")
+        base_filename = get_image_filename(params, root_dir)
+        params['image_name'] = snapshot_name
+        params['image_format'] = snapshot_format
+        qemu_img_cmd += " -b %s -F %s" % (base_filename, base_format)
+
     format = params.get("image_format", "qcow2")
     qemu_img_cmd += " -f %s" % format
 
     image_filename = get_image_filename(params, root_dir)
     qemu_img_cmd += " %s" % image_filename
 
+    preallocated = params.get("preallocated")
+    if preallocated is not None:
+        qemu_img_cmd += " -o preallocation=%s" % preallocated
+
+    cluster_size = params.get("cluster_size")
+    if cluster_size is not None:
+        qemu_img_cmd += " -o cluster_size=%s" % cluster_size
+
     size = params.get("image_size", "10G")
     qemu_img_cmd += " %s" % size
 
@@ -229,6 +249,125 @@ def create_image(params, root_dir):
     return image_filename
 
 
+def convert_image(params, root_dir):
+    """
+    Convert image
+
+    @param params: A dict
+    @param root_dir: Base directory for relative filenames.
+
+    @note: Params should contain:
+           image_name -- the name of the image file to be converted
+           image_format -- the format of the the image to be convertged
+           convert_name -- the name of the image after convert
+           convert_format -- the format of the image after convert
+    """
+    qemu_img_cmd = kvm_utils.get_path(root_dir, params.get("qemu_img_binary",
+                                                            "qemu-img"))
+    qemu_img_cmd += " convert"
+    if params.get("compressed") == "yes":
+        qemu_img_cmd += " -c"
+    if params.get("encrypted") == "yes":
+        qemu_img_cmd += " -e"
+
+    image_format = params.get("image_format", "qcow2")
+    qemu_img_cmd += " -f %s" % image_format
+
+    params_convert = kvm_utils.get_sub_dict(params,
+                                            params.get("images").split()[-1])
+    convert_format = params_convert.get("image_format", "qcow2")
+    qemu_img_cmd += " -O %s" % convert_format
+
+    base_filename = get_image_filename(params, root_dir)
+    convert_filename = get_image_filename(params_convert, root_dir)
+
+    qemu_img_cmd += " %s %s" % (base_filename, convert_filename)
+
+    try:
+        utils.system(qemu_img_cmd)
+    except error.CmdError, e:
+        logging.error("Could not convert image, convert failed:\n%s", str(e))
+        return None
+
+    logging.info("Convert %s to format %s" % (base_filename, convert_format))
+    return convert_filename
+
+
+def rebase_image(params, root_dir):
+    """
+    Rebase image:
+    @param params: A dict
+    @param root_dir: Base directory for relative filename
+
+    @note: params should contain:
+           snapshot_name -- image name to be rebased
+           image_name -- the base image name
+           image_format -- the format of base image
+    """
+    qemu_img_cmd = kvm_utils.get_path(root_dir, params.get("qemu_img_binary",
+                                                           "qemu-img"))
+    qemu_img_cmd += " rebase"
+
+    mode = params.get("rebase_mode", "unsafe")
+    if mode == "unsafe":
+        qemu_img_cmd += " -u"
+
+    base_name = params.get("image_name")
+    base_format = params.get("image_format", "qcow2")
+    base_filename = get_image_filename(params, root_dir)
+    qemu_img_cmd += " -b %s -F %s" % (base_filename, base_format)
+
+    params_sn = kvm_utils.get_sub_dict(params, 
params.get("images").split()[-1])
+    snapshot_name = params_sn.get("image_name")
+    snapshot_format = params_sn.get("image_format", "qcow2")
+    snapshot_filename = get_image_filename(params_sn, root_dir)
+
+    qemu_img_cmd += " -f %s %s" % (snapshot_format, snapshot_filename)
+
+    try:
+        utils.system(qemu_img_cmd)
+    except error.CmdError, e:
+        logging.error("Rebase image failed\n%s", str(e))
+        return None
+
+    logging.info("Image is rebase to %s" % base_name)
+
+    return base_filename
+
+
+def commit_image(params, root_dir):
+    """
+    Commit snapshot to base file
+
+    @param params: A dict
+    @param root_dir: Base directory for relative filenames.
+
+    @note: params should contain:
+           image_name -- the name of the snapshot
+           image_format -- the format of the snapshot
+    """
+    qemu_img_cmd = kvm_utils.get_path(root_dir, params.get("qemu_img_binary",
+                                                            "qemu-img"))
+    qemu_img_cmd += " commit"
+
+    params_sn = kvm_utils.get_sub_dict(params, 
params.get("images").split()[-1])
+    snapshot_format = params_sn.get("image_format", "qcow2")
+    snapshot_filename = get_image_filename(params_sn, root_dir)
+    qemu_img_cmd += " -f %s %s" % (snapshot_format, snapshot_filename)
+
+    base_filename = get_image_filename(params, root_dir)
+
+    try:
+        utils.system(qemu_img_cmd)
+    except error.CmdError, e:
+        logging.error("Commit image failed\n%s", str(e))
+        return None
+
+    logging.info("Image commit to backing file")
+
+    return base_filename
+
+
 def remove_image(params, root_dir):
     """
     Remove an image file.

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to