new file mode 100644
@@ -0,0 +1,112 @@
+import logging, re, random
+from autotest_lib.client.common_lib import error
+
+
+@error.context_aware
+def run_multi_disk(test, params, env):
+ """
+ Test multi disk suport of guest, this case will:
+ 1) Create disks image in configuration file.
+ 2) Start the guest with those disks.
+ 3) Format those disks.
+ 4) Copy file into / out of those disks.
+ 5) Compare the original file and the copied file using md5 or fc comand.
+ 6) Repeat steps 3-5 if needed.
+
+ @param test: kvm test object
+ @param params: Dictionary with the test parameters
+ @param env: Dictionary with test environment.
+ """
+ vm = env.get_vm(params["main_vm"])
+ vm.verify_alive()
+ session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
+
+ images = params.get("images").split()
+ n_repeat = int(params.get("n_repeat", "1"))
+ image_num = len(images)
+ disk_num = 0
+ file_system = params.get("file_system").split()
+ fs_num = len(file_system)
+ cmd_timeout = float(params.get("cmd_timeout", 360))
+ re_str = params.get("re_str")
+ block_list = params.get("block_list").split()
+
+ try:
+ if params.get("clean_cmd"):
+ cmd = params.get("clean_cmd")
+ session.cmd_status_output(cmd)
+ if params.get("pre_cmd"):
+ cmd = params.get("pre_cmd")
+ error.context("creating partition on test disk")
+ session.cmd(cmd, timeout=cmd_timeout)
+ cmd = params.get("list_volume_command")
+ output = session.cmd_output(cmd, timeout=cmd_timeout)
+ disks = re.findall(re_str, output)
+ disks.sort()
+ logging.debug("Volume list that meets regular expressions: %s", disks)
+ if len(disks) < image_num:
+ raise error.TestFail("Fail to list all the volumes!")
+
+ tmp_list = []
+ for disk in disks:
+ if disk.strip() in block_list:
+ tmp_list.append(disk)
+ for disk in tmp_list:
+ logging.info("No need to check volume %s", disk)
+ disks.remove(disk)
+
+ for i in range(n_repeat):
+ logging.info("iterations: %s", (i + 1))
+ for disk in disks:
+ disk = disk.strip()
+
+ logging.info("Format disk: %s..." % disk)
+ index = random.randint(0, fs_num - 1)
+
+ # Random select one file system from file_system
+ fs = file_system[index].strip()
+ cmd = params.get("format_command") % (fs, disk)
+ error.context("formatting test disk")
+ session.cmd(cmd, timeout=cmd_timeout)
+ if params.get("mount_command"):
+ cmd = params.get("mount_command") % (disk, disk, disk)
+ session.cmd(cmd, timeout=cmd_timeout)
+
+ for disk in disks:
+ disk = disk.strip()
+
+ logging.info("Performing I/O on disk: %s...", disk)
+ cmd_list = params.get("cmd_list").split()
+ for cmd_l in cmd_list:
+ if params.get(cmd_l):
+ cmd = params.get(cmd_l) % disk
+ session.cmd(cmd, timeout=cmd_timeout)
+
+ cmd = params.get("compare_command")
+ output = session.cmd_output(cmd)
+ key_word = params.get("check_result_key_word")
+ if key_word and key_word in output:
+ logging.debug("Guest's virtual disk %s works fine", disk)
+ elif key_word:
+ raise error.TestFail("Files on guest os root fs and disk "
+ "differ")
+ else:
+ raise error.TestError("Param check_result_key_word was not "
+ "specified! Please check your config")
+
+ if params.get("umount_command"):
+ cmd = params.get("show_mount_cmd")
+ output = session.cmd_output(cmd)
+ disks = re.findall(re_str, output)
+ disks.sort()
+ for disk in disks:
+ disk = disk.strip()
+ cmd = params.get("umount_command") % (disk, disk)
+ error.context("unmounting test disk")
+ session.cmd(cmd)
+ finally:
+ if params.get("post_cmd"):
+ cmd = params.get("post_cmd")
+ session.cmd(cmd)
+ session.close()
+