예제 #1
0
 def prepare_snapshot_file(self, snapshot_tags):
     self.snapshot_images = list(map(self.get_image_by_tag, snapshot_tags))
     params = self.params.copy()
     params.setdefault("target_path", data_dir.get_data_dir())
     for tag in snapshot_tags:
         image = sp_admin.volume_define_by_params(tag, params)
         image.hotplug(self.main_vm)
예제 #2
0
 def prepare_snapshot_file(self):
     self.trash = []
     params = self.params.copy()
     params.setdefault("target_path", data_dir.get_data_dir())
     for snapshot_tag in self.snapshot_chain:
         image = sp_admin.volume_define_by_params(snapshot_tag, params)
         image.hotplug(self.main_vm)
         self.trash.append(image)
예제 #3
0
 def prepare_snapshot_file(self):
     if self.is_blockdev_mode():
         params = self.params.copy()
         params.setdefault("target_path", data_dir.get_data_dir())
         image = sp_admin.volume_define_by_params(self.snapshot_tag, params)
         image.hotplug(self.main_vm)
     else:
         if self.params.get("mode") == "existing":
             self.snapshot_image.create()
예제 #4
0
def create_image_with_data_file(vm, params, image_name):
    """
    Create image with data_file
    :param vm: vm object
    :param params: params used to create data_file
    :image_name: image that created on data_file_image
    :return list: data_file image list
    """
    image_list = []
    image_params = params.object_params(image_name)
    data_file_tag = image_params.get("image_data_file")
    if data_file_tag:
        data_file_image = sp_admin.volume_define_by_params(data_file_tag, params)
        data_file_image.hotplug(vm)
        image_list.append(data_file_image)
    image = sp_admin.volume_define_by_params(image_name, params)
    image.hotplug(vm)
    image_list.append(image)
    return image_list
예제 #5
0
 def __target_disk_define_by_params(self, params, image_name):
     if params.get("random_cluster_size") == "yes":
         blacklist = list(map(int,
                              params.objects("cluster_size_blacklist")))
         cluster_size = backup_utils.generate_random_cluster_size(blacklist)
         params["image_cluster_size"] = cluster_size
         logging.info("set target image cluster size to '%s'" %
                      cluster_size)
     params.setdefault("target_path", data_dir.get_data_dir())
     return sp_admin.volume_define_by_params(image_name, params)
예제 #6
0
 def prepare_snapshot_file(self):
     self.params["image_size_%s" % self.snapshot_tag] = self.base_image.size
     self.params["image_name_%s" %
                 self.snapshot_tag] = 'images/' + self.snapshot_tag
     snapshot_format = self.params.get("snapshot_format", "qcow2")
     self.params["image_format_%s" % self.snapshot_tag] = snapshot_format
     params = self.params.copy()
     params.setdefault("target_path", data_dir.get_data_dir())
     image = sp_admin.volume_define_by_params(self.snapshot_tag, params)
     image.hotplug(self.main_vm)
     return image
예제 #7
0
 def prepare_snapshot_file(self):
     for index in range(self.snapshot_num + 1):
         snapshot_tag = "sn%s" % index
         if snapshot_tag not in self.snapshot_chains:
             self.snapshot_chains.append(snapshot_tag)
         params = self.params.copy()
         params.setdefault("target_path", data_dir.get_data_dir())
         params["image_size_%s" % snapshot_tag] = self.base_image.size
         params["image_name_%s" % snapshot_tag] = snapshot_tag
         self.params["image_name_%s" % snapshot_tag] = snapshot_tag
         snapshot_format = params.get("snapshot_format", "qcow2")
         params["image_format_%s" % snapshot_tag] = snapshot_format
         image = sp_admin.volume_define_by_params(snapshot_tag, params)
         image.hotplug(self.main_vm)
예제 #8
0
def create_image_by_params(vm, params, image_name):
    """Create blockd device with vm by params"""
    image = sp_admin.volume_define_by_params(image_name, params)
    vm.verify_alive()
    image.hotplug(vm)
    return image
예제 #9
0
 def _disk_define_by_params(self, tag):
     params = self.params.copy()
     params.setdefault("target_path", data_dir.get_data_dir())
     return sp_admin.volume_define_by_params(tag, params)
예제 #10
0
def run(test, params, env):
    """
    backup VM disk test:

    1) start VM with data disk
    2) create target disk with qmp command
    3) full backup source disk to target disk with 65535 persistent bitmaps
    4) shutdown VM
    5) verify bitmap save to data disk
    6) boot VM with data disk to check bitmaps with qmp cmd query-block
    :param test: test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment.
    """
    def full_backup(vm, source_node, target_node, bitmap_count):
        """start full backup job with 65535 bitmaps"""

        logging.info("Begin full backup %s to %s" % (source_node, target_node))
        actions, extra_options = [], {"sync": "full"}
        cmd, args = backup_utils.blockdev_backup_qmp_cmd(
            source_node, target_node, **extra_options)
        backup_action = {"type": cmd, "data": args}
        actions.append(backup_action)
        bitmap_data = {"node": source_node, "persistent": True}
        for idx in range(0, bitmap_count):
            data = bitmap_data.copy()
            data["name"] = "bitmap_%d" % idx
            action = {"type": "block-dirty-bitmap-add", "data": data}
            actions.append(action)
        vm.monitor.cmd("transaction", {"actions": actions})
        job_utils.wait_until_block_job_completed(vm, args["job-id"])

    def verify_bitmap_counts(vm, source_node, bitmap_count):
        """Verify bitmap count after backup job is start"""

        logging.info("Verify bitmap counts in device '%s'" % source_node)
        out = vm.monitor.query("block")
        bitmaps_dict = block_dirty_bitmap.get_bitmaps(out)
        if source_node not in bitmaps_dict:
            raise test.fail("device '%s' not found!" % source_node)
        bitmap_len = len(bitmaps_dict[source_node])
        msg = "bitmap count mismatch, %s != %s" % (bitmap_len, bitmap_count)
        assert bitmap_len == bitmap_count, msg

    def verify_persistent_bitmaps(params, image_name, bitmap_count):
        """Verify bitmap count by qemu-img command"""

        logging.info("Verify bitmaps info save in image '%s'" % image_name)
        image_dir = data_dir.get_data_dir()
        image_params = params.object_params(image_name)
        data_img = qemu_storage.QemuImg(image_params, image_dir, image_name)
        output = data_img.info(output="json")
        info = json.loads(output)
        bitmap_len = len(info["format-specific"]["data"]["bitmaps"])
        msg = "bitmap losts after destory VM, %s != %s" % (bitmap_len,
                                                           bitmap_count)
        assert bitmap_len == bitmap_count, msg

    source_image = params.get("source_image")
    target_image = params.get("target_image")
    source_node = "drive_%s" % source_image
    target_node = "drive_%s" % target_image
    bitmap_count = int(params.get("bitmap_count", 65535))
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    params.setdefault("target_path", data_dir.get_data_dir())
    target_disk = sp_admin.volume_define_by_params(target_image, params)
    target_disk.hotplug(vm)
    full_backup(vm, source_node, target_node, bitmap_count)
    verify_bitmap_counts(vm, source_node, bitmap_count)
    vm.destroy()
    verify_persistent_bitmaps(params, source_image, bitmap_count)
    vm = env.get_vm(params["main_vm"])
    vm.create()
    vm.verify_alive()
    verify_bitmap_counts(vm, source_node, bitmap_count)
예제 #11
0
 def __target_disk_define_by_params(self, params, image_name):
     params.setdefault("target_path", data_dir.get_data_dir())
     return sp_admin.volume_define_by_params(image_name, params)