This is designed to test all subcommands of 'qemu-img' however so far 'commit' is not implemented. * For 'check' subcommand test, it will 'dd' to create a file with specified size and see whether it's supported to be checked. Then convert it to be supported formats (qcow2 and raw so far) to see whether there's error after convertion. * For 'convert' subcommand test, it will convert both to 'qcow2' and 'raw' from the format specified in config file. And only check 'qcow2' after convertion. * For 'snapshot' subcommand test, it will create two snapshots and list them. Finally delete them if no errors found. * For 'info' subcommand test, it simply get output from specified image file. Signed-off-by: Yolkfull Chow <yzhou@xxxxxxxxxx> --- client/tests/kvm/tests/qemu_img.py | 155 ++++++++++++++++++++++++++++++++ client/tests/kvm/tests_base.cfg.sample | 36 ++++++++ 2 files changed, 191 insertions(+), 0 deletions(-) create mode 100644 client/tests/kvm/tests/qemu_img.py diff --git a/client/tests/kvm/tests/qemu_img.py b/client/tests/kvm/tests/qemu_img.py new file mode 100644 index 0000000..1ae04f0 --- /dev/null +++ b/client/tests/kvm/tests/qemu_img.py @@ -0,0 +1,155 @@ +import os, logging, commands +from autotest_lib.client.common_lib import error +import kvm_vm + + +def run_qemu_img(test, params, env): + """ + `qemu-img' functions test: + 1) Judge what subcommand is going to be tested + 2) Run subcommand test + + @param test: kvm test object + @param params: Dictionary with the test parameters + @param env: Dictionary with test environment. + """ + cmd = params.get("qemu_img_binary") + subcommand = params.get("subcommand") + image_format = params.get("image_format") + image_name = kvm_vm.get_image_filename(params, test.bindir) + + def check(img): + global cmd + cmd += " check %s" % img + logging.info("Checking image '%s'..." % img) + s, o = commands.getstatusoutput(cmd) + if not (s == 0 or "does not support checks" in o): + return (False, o) + return (True, "") + + # Subcommand 'qemu-img check' test + # This tests will 'dd' to create a specified size file, and check it. + # Then convert it to supported image_format in each loop and check again. + def check_test(): + size = params.get("dd_image_size") + test_image = params.get("dd_image_name") + create_image_cmd = params.get("create_image_cmd") + create_image_cmd = create_image_cmd % (test_image, size) + s, o = commands.getstatusoutput(create_image_cmd) + if s != 0: + raise error.TestError("Failed command: %s; Output is: %s" % + (create_image_cmd, o)) + s, o = check(test_image) + if not s: + raise error.TestFail("Failed to check image '%s' with error: %s" % + (test_image, o)) + for fmt in params.get("supported_image_formats").split(): + output_image = test_image + ".%s" % fmt + convert(fmt, test_image, output_image) + s, o = check(output_image) + if not s: + raise error.TestFail("Check image '%s' got error: %s" % + (output_image, o)) + commands.getoutput("rm -f %s" % output_image) + commands.getoutput("rm -f %s" % test_image) + + #Subcommand 'qemu-img create' test + def create_test(): + global cmd + cmd += " create" + if params.get("encrypted") == "yes": + cmd += " -e" + if params.get("base_image"): + cmd += " -F %s -b %s" % (params.get("base_image_format"), + params.get("base_image")) + format = params.get("image_format") + cmd += " -f %s" % format + image_name_test = os.path.join(test.bindir, + params.get("image_name_test")) + '.' + format + cmd += " %s %s" % (image_name_test, params.get("image_size_test")) + s, o = commands.getstatusoutput(cmd) + if s != 0: + raise error.TestFail("Create image '%s' failed: %s" % + (image_name_test, o)) + commands.getoutput("rm -f %s" % image_name_test) + + def convert(output_format, image_name, output_filename, + format=None, compressed="no", encrypted="no"): + global cmd + cmd += " convert" + if compressed == "yes": + cmd += " -c" + if encrypted == "yes": + cmd += " -e" + if format: + cmd += " -f %s" % image_format + cmd += " -O %s" % params.get("dest_image_format") + cmd += " %s %s" % (image_name, output_filename) + s, o = commands.getstatusoutput(cmd) + if s != 0: + raise error.TestFail("Image converted failed; Command: %s;" + "Output is: %s" % (cmd, o)) + + #Subcommand 'qemu-img convert' test + def convert_test(): + dest_image_format = params.get("dest_image_format") + output_filename = "%s.converted_%s" % (image_name, dest_image_format) + + convert(dest_image_format, image_name, params.get("dest_image_format"), + image_format, params.get("compressed"), params.get("encrypted")) + + if dest_image_format == "qcow2": + s, o = check(output_filename) + if s: + commands.getoutput("rm -f %s" % output_filename) + else: + raise error.TestFail("Check image '%s' failed with error: %s" % + (dest_image_format, o)) + else: + commands.getoutput("rm -f %s" % output_filename) + + #Subcommand 'qemu-img info' test + def info_test(): + global cmd + cmd += " info" + cmd += " -f %s %s" % (image_format, image_name) + s, o = commands.getstatusoutput(cmd) + if s != 0: + raise error.TestFail("Get info of image '%s' failed: %s" % + (image_name, o)) + logging.info("Info of image '%s': \n%s" % (image_name, o)) + + #Subcommand 'qemu-img snapshot' test + def snapshot_test(): + global cmd + cmd += " snapshot" + for i in range(2): + crtcmd = cmd + snapshot_name = "snapshot%d" % i + crtcmd += " -c %s %s" % (snapshot_name, image_name) + s, o = commands.getstatusoutput(crtcmd) + if s != 0: + raise error.TestFail("Create snapshot failed via command: %s;" + "Output is: %s" % (crtcmd, o)) + logging.info("Created snapshot#%d" % i) + listcmd = cmd + listcmd += " -l %s" % image_name + s, o = commands.getstatusoutput(listcmd) + if not ("snapshot0" in o and "snapshot1" in o and s == 0): + raise error.TestFail("Snapshot created failed or missed;" + "snapshot list is: \n%s" % o) + for i in range(2): + snapshot_name = "snapshot%d" % i + delcmd = cmd + delcmd += " -d %s %s" % (snapshot_name, image_name) + s, o = commands.getstatusoutput(delcmd) + if s != 0: + raise error.TestFail("Delete snapshot '%s' failed: %s" % + (snapshot_name, o)) + + #Subcommand 'qemu-img commit' test + def commit_test(cmd): + pass + + # Here starts test + eval("%s_test" % subcommand) diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample index 2d03f1f..cedd919 100644 --- a/client/tests/kvm/tests_base.cfg.sample +++ b/client/tests/kvm/tests_base.cfg.sample @@ -273,6 +273,42 @@ variants: type = physical_resources_check catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}' + - qemu_img: + type = qemu_img + vms = '' + variants: + - check: + subcommand = check + dd_image_size = 1G + dd_image_name = /tmp/test_image + force_create_image_dd = no + create_image_cmd = "dd if=/dev/zero of=%s bs=%s count=1" + # Test the convertion from 'dd_image_name' to specified format + supported_image_formats = qcow2 raw + - create: + subcommand = create + post_command = "" + images += " stg" + force_create_image_test = yes + image_size_test = 5000G + image_name_test = qemu_img_test + remove_image_test = yes + - convert: + subcommand = convert + variants: + - to_qcow2: + dest_image_format = qcow2 + compressed = no + encrypted = no + - to_raw: + dest_image_format = raw + - snapshot: + subcommand = snapshot + - commit: + subcommand = commit + - info: + subcommand = info + # NICs variants: - @rtl8139: -- 1.6.6 -- 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