@@ -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)
@@ -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,59 @@ 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)
+ """
+ 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"))
+ check_critical = params.get("check_image_critical") == 'yes'
+ 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:
+ if check_critical:
+ raise VMImageCheckError(image_filename)
+ else:
+ logging.error("Error checking image %s", 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.
@@ -2357,11 +2357,10 @@ kdump:
variants:
- @qcow2:
image_format = qcow2
- post_command += " python scripts/check_image.py;"
- post_command_timeout = 600
- post_command_noncritical = yes
+ check_image = yes
+ check_image_critical = no
ioquit:
- post_command_noncritical = no
+ check_image_critical = yes
- vmdk:
no ioquit
only Fedora Ubuntu Windows