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