[PATCH 1/5] KVM test: Introduce check_image postprocess directive v2

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

 



With check_image_foo = yes, KVM autotest will use
qemu-img to perform checks on the qcow2 image.

This new functionality intends to replace the
script check_image.py. The plan is to supersede most
of the pre/post scripts in place throughout KVM
autotest.

Changes from v1:
- We already only raise exceptions during postprocessing
only if the test passed, and that avoids masking the
original test error reason. So eliminate the
check_image_critical logic altogether, so we always raise
errors.

Signed-off-by: Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx>
---
 client/tests/kvm/kvm_preprocessing.py  |    3 +-
 client/tests/kvm/kvm_vm.py             |   60 ++++++++++++++++++++++++++++++++
 client/tests/kvm/tests_base.cfg.sample |    6 +---
 3 files changed, 63 insertions(+), 6 deletions(-)

diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
index 56acf0c..4a6e0f8 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -93,11 +93,12 @@ def preprocess_vm(test, params, env, name):
 def postprocess_image(test, params):
     """
     Postprocess a single QEMU image according to the instructions in params.
-    Currently this function just removes an image if requested.
 
     @param test: An Autotest test object.
     @param params: A dict containing image postprocessing parameters.
     """
+    if params.get("check_image") == "yes":
+        kvm_vm.check_image(params, test.bindir)
     if params.get("remove_image") == "yes":
         kvm_vm.remove_image(params, test.bindir)
 
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 18d10ef..393f1ab 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -47,6 +47,15 @@ class VMImageMissingError(VMError):
         return "CD image file not found: %r" % self.filename
 
 
+class VMImageCheckError(VMError):
+    def __init__(self, filename):
+        VMError.__init__(self, filename)
+        self.filename = filename
+
+    def __str__(self):
+        return "Errors found on image: %r" % self.filename
+
+
 class VMBadPATypeError(VMError):
     def __init__(self, pa_type):
         VMError.__init__(self, pa_type)
@@ -239,6 +248,57 @@ def remove_image(params, root_dir):
         logging.debug("Image file %s not found")
 
 
+def check_image(params, root_dir):
+    """
+    Check an image using qemu-img.
+
+    @param params: Dictionary containing the test parameters.
+    @param root_dir: Base directory for relative filenames.
+
+    @note: params should contain:
+           image_name -- the name of the image file, without extension
+           image_format -- the format of the image (qcow2, raw etc)
+
+    @raise VMImageCheckError: In case qemu-img check fails on the image.
+    """
+    image_filename = get_image_filename(params, root_dir)
+    logging.debug("Checking image file %s..." % image_filename)
+    qemu_img_cmd = kvm_utils.get_path(root_dir,
+                                      params.get("qemu_img_binary", "qemu-img"))
+    image_is_qcow2 = params.get("image_format") == 'qcow2'
+    if os.path.exists(image_filename) and image_is_qcow2:
+        # Verifying if qemu-img supports 'check'
+        q_result = utils.run(qemu_img_cmd, ignore_status=True)
+        q_output = q_result.stdout
+        check_img = True
+        if not "check" in q_output:
+            logging.error("qemu-img does not support 'check', "
+                          "skipping check...")
+            check_img = False
+        if not "info" in q_output:
+            logging.error("qemu-img does not support 'info', "
+                          "skipping check...")
+            check_img = False
+        if check_img:
+            try:
+                utils.system("%s info %s" % (qemu_img_cmd, image_filename))
+            except error.CmdError:
+                logging.error("Error getting info from image %s",
+                              image_filename)
+            try:
+                utils.system("%s check %s" % (qemu_img_cmd, image_filename))
+            except error.CmdError:
+                raise VMImageCheckError(image_filename)
+
+    else:
+        if not os.path.exists(image_filename):
+            logging.debug("Image file %s not found, skipping check...",
+                          image_filename)
+        elif not image_is_qcow2:
+            logging.debug("Image file %s not qcow2, skipping check...",
+                          image_filename)
+
+
 class VM:
     """
     This class handles all basic VM operations.
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 28064a8..3299af7 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -2357,11 +2357,7 @@ kdump:
 variants:
     - @qcow2:
         image_format = qcow2
-        post_command += " python scripts/check_image.py;"
-        post_command_timeout = 600
-        post_command_noncritical = yes
-        ioquit:
-            post_command_noncritical = no
+        check_image = yes
     - vmdk:
         no ioquit
         only Fedora Ubuntu Windows
-- 
1.7.3.4

--
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