Exemple #1
0
 def migrate_instance(self):
     act_map_com_info = map_compute_info.MapComputeInfo(self.init)
     act_net_prep = prepare_networks.PrepareNetworks(self.init,
                                                     cloud='dst_cloud')
     act_deploy_instances = transport_instance.TransportInstance(self.init)
     act_i_to_f = load_compute_image_to_file.LoadComputeImageToFile(
         self.init, cloud='dst_cloud')
     act_merge = merge_base_and_diff.MergeBaseDiff(self.init,
                                                   cloud='dst_cloud')
     act_convert_image = convert_file.ConvertFile(self.init,
                                                  cloud='dst_cloud')
     act_f_to_i = upload_file_to_image.UploadFileToImage(self.init,
                                                         cloud='dst_cloud')
     act_transfer_file = task_transfer.TaskTransfer(
         self.init,
         'SSHCephToFile',
         resource_name=utl.INSTANCES_TYPE,
         resource_root_name=utl.DIFF_BODY)
     act_f_to_i_after_transfer = upload_file_to_image.UploadFileToImage(
         self.init, cloud='dst_cloud')
     act_is_not_trans_image = is_not_transport_image.IsNotTransportImage(
         self.init, cloud='src_cloud')
     act_is_not_merge_diff = is_not_merge_diff.IsNotMergeDiff(
         self.init, cloud='src_cloud')
     act_post_transport_instance = post_transport_instance.PostTransportInstance(
         self.init, cloud='dst_cloud')
     act_transport_ephemeral = transport_ephemeral.TransportEphemeral(
         self.init, cloud='dst_cloud')
     trans_file_to_file = task_transfer.TaskTransfer(
         self.init,
         'SSHFileToFile',
         resource_name=utl.INSTANCES_TYPE,
         resource_root_name=utl.DIFF_BODY)
     act_trans_diff_file = task_transfer.TaskTransfer(
         self.init,
         'SSHFileToFile',
         resource_name=utl.INSTANCES_TYPE,
         resource_root_name=utl.DIFF_BODY)
     act_is_not_copy_diff_file = is_not_copy_diff_file.IsNotCopyDiffFile(
         self.init)
     process_merge_diff_and_base = act_i_to_f >> trans_file_to_file >> act_merge >> act_convert_image >> act_f_to_i
     process_merge_diff_and_base = act_i_to_f
     process_transport_image = act_transfer_file >> act_f_to_i_after_transfer
     process_transport_image = act_transfer_file
     act_pre_transport_instance = (act_is_not_trans_image | act_is_not_merge_diff) >> \
                                  process_transport_image >> \
                                  (act_is_not_merge_diff | act_deploy_instances) >> \
                                  process_merge_diff_and_base
     act_post_transport_instance = (
         act_is_not_copy_diff_file
         | act_transport_ephemeral) >> act_trans_diff_file
     return act_net_prep >> \
            act_map_com_info >> \
            act_pre_transport_instance >> \
            act_deploy_instances >> \
            act_post_transport_instance >> \
            act_transport_ephemeral
    def copy_ephemeral_ceph_to_iscsi(self, src_cloud, dst_cloud, info):
        transporter = task_transfer.TaskTransfer(
            self.init,
            TRANSPORTER_MAP[ISCSI][ISCSI],
            resource_name=utl.INSTANCES_TYPE,
            resource_root_name=utl.EPHEMERAL_BODY)

        instances = info[utl.INSTANCES_TYPE]
        temp_src = src_cloud.cloud_config.cloud.temp
        host_dst = dst_cloud.cloud_config.cloud.ssh_host
        qemu_img_dst = dst_cloud.qemu_img
        qemu_img_src = src_cloud.qemu_img

        temp_path_src = temp_src + "/%s" + utl.DISK_EPHEM
        for inst_id, inst in instances.iteritems():

            path_src_id_temp = temp_path_src % inst_id
            host_compute_dst = inst[EPHEMERAL][HOST_DST]
            inst[EPHEMERAL][
                BACKING_FILE_DST] = qemu_img_dst.detect_backing_file(
                    inst[EPHEMERAL][PATH_DST], host_compute_dst)
            self.delete_remote_file_on_compute(inst[EPHEMERAL][PATH_DST],
                                               host_dst, host_compute_dst)
            qemu_img_src.convert(utl.QCOW2,
                                 'rbd:%s' % inst[EPHEMERAL][PATH_SRC],
                                 path_src_id_temp)
            inst[EPHEMERAL][PATH_SRC] = path_src_id_temp

        transporter.run(info=info)

        for inst_id, inst in instances.iteritems():
            host_compute_dst = inst[EPHEMERAL][HOST_DST]
            qemu_img_dst.diff_rebase(inst[EPHEMERAL][BACKING_FILE_DST],
                                     inst[EPHEMERAL][PATH_DST],
                                     host_compute_dst)
    def transport_diff_and_merge(self, dst_cloud, info, instance_id):
        convertor = convert_image_to_file.ConvertImageToFile(self.init, cloud='dst_cloud')
        transporter = task_transfer.TaskTransfer(
            self.init,
            TRANSPORTER_MAP[ISCSI][ISCSI],
            resource_name=utl.INSTANCES_TYPE,
            resource_root_name=utl.DIFF_BODY)
        image_id = info[INSTANCES][instance_id][utl.INSTANCE_BODY]['image_id']

        base_file = "%s/%s" % (dst_cloud.cloud_config.cloud.temp, "temp%s_base" % instance_id)
        diff_file = "%s/%s" % (dst_cloud.cloud_config.cloud.temp, "temp%s" % instance_id)

        info[INSTANCES][instance_id][DIFF][PATH_DST] = diff_file
        info[INSTANCES][instance_id][DIFF][HOST_DST] = dst_cloud.getIpSsh()

        convertor.run(image_id=image_id,
                      base_filename=base_file)

        transporter.run(info=info)

        self.merge_file(dst_cloud, base_file, diff_file)

        image_res = dst_cloud.resources[utl.IMAGE_RESOURCE]
        images = image_res.read_info(image_id=image_id)
        image = images[utl.IMAGE_RESOURCE][utl.IMAGES_TYPE][image_id]
        disk_format = image[utl.IMAGE_BODY]['disk_format']
        if image_res.config.image.convert_to_raw:
            if disk_format.lower() != utl.RAW:
                self.convert_file_to_raw(dst_cloud.cloud_config.cloud.host, disk_format, base_file)
                disk_format = utl.RAW
        converter = convert_file_to_image.ConvertFileToImage(self.init, cloud='dst_cloud')
        dst_image_id = converter.run(file_path=base_file,
                                     image_format=disk_format,
                                     image_name="%s-image" % instance_id)
        info[INSTANCES][instance_id][INSTANCE_BODY]['image_id'] = dst_image_id
Exemple #4
0
    def transport_available_volumes_via_ssh(self):
        is_volume_snapshots = is_option.IsOption(self.init,
                                                 'keep_volume_snapshots')

        final_action = fake_action.FakeAction(self.init)

        act_get_info_available_volumes = get_info_volumes.GetInfoVolumes(
            self.init, cloud='src_cloud', search_opts={'status': 'available'})
        act_rename_vol_src = create_reference.CreateReference(
            self.init, 'storage_info', 'src_storage_info')
        task_get_available_vol_info = act_get_info_available_volumes >> act_rename_vol_src

        act_deploy_vol = deploy_volumes.DeployVolumes(self.init,
                                                      cloud='dst_cloud')
        act_rename_vol_dst = create_reference.CreateReference(
            self.init, 'storage_info', 'dst_storage_info')
        task_deploy_available_volumes = act_deploy_vol >> act_rename_vol_dst

        act_vol_data_map = prepare_volumes_data_map.PrepareVolumesDataMap(
            self.init, 'src_storage_info', 'dst_storage_info')

        act_vol_transport_data = \
            task_transfer.TaskTransfer(self.init,
                                       'SSHCephToCeph',
                                       input_info='storage_info') - final_action

        act_deploy_vol_snapshots = \
            deploy_snapshots.DeployVolSnapshots(self.init,cloud='dst_cloud') - final_action

        return task_get_available_vol_info >> \
               task_deploy_available_volumes >> \
               act_vol_data_map >> \
               (is_volume_snapshots | act_deploy_vol_snapshots | act_vol_transport_data) \
               >> final_action
Exemple #5
0
    def transport_volumes_by_instance_via_ssh(self):
        act_convert_c_to_v = convert_compute_to_volume.ConvertComputeToVolume(
            self.init, cloud='src_cloud')
        act_rename_inst_vol_src = create_reference.CreateReference(
            self.init, 'storage_info', 'src_storage_info')
        act_convert_v_to_c = convert_volume_to_compute.ConvertVolumeToCompute(
            self.init, cloud='dst_cloud')
        act_rename_inst_vol_dst = create_reference.CreateReference(
            self.init, 'storage_info', 'dst_storage_info')
        act_inst_vol_data_map = prepare_volumes_data_map.PrepareVolumesDataMap(
            self.init, 'src_storage_info', 'dst_storage_info')
        act_deploy_inst_volumes = deploy_volumes.DeployVolumes(
            self.init, cloud='dst_cloud')

        act_inst_vol_transport_data = task_transfer.TaskTransfer(
            self.init, 'SSHCephToCeph', input_info='storage_info')

        act_deploy_snapshots = deploy_snapshots.DeployVolSnapshots(
            self.init, cloud='dst_cloud') - act_convert_v_to_c

        is_snapshots = is_option.IsOption(self.init, 'keep_volume_snapshots')

        task_get_inst_vol_info = act_convert_c_to_v >> act_rename_inst_vol_src
        task_deploy_inst_vol = act_deploy_inst_volumes >> act_rename_inst_vol_dst
        return task_get_inst_vol_info >> \
               task_deploy_inst_vol >> act_inst_vol_data_map >> \
               (is_snapshots | act_deploy_snapshots | act_inst_vol_transport_data) >> \
               act_convert_v_to_c
    def transport_from_src_to_dst(self, info):
        transporter = task_transfer.TaskTransfer(
            self.init,
            TRANSPORTER_MAP[ISCSI][ISCSI],
            resource_name=utl.INSTANCES_TYPE,
            resource_root_name=utl.DIFF_BODY)

        transporter.run(info=info)
Exemple #7
0
 def copy_data_via_ssh(self, src_cloud, dst_cloud, info, body, resources, types):
     dst_storage = dst_cloud.resources[resources]
     src_compute = src_cloud.resources[resources]
     src_backend = src_compute.config.compute.backend
     dst_backend = dst_storage.config.compute.backend
     transporter = task_transfer.TaskTransfer(
         self.init,
         TRANSPORTER_MAP[src_backend][dst_backend],
         resource_name=types,
         resource_root_name=body)
     transporter.run(info=info)
 def copy_data_via_ssh(self, src_cloud, dst_cloud, info, body, resources,
                       types):
     dst_storage = dst_cloud.resources[resources]
     src_compute = src_cloud.resources[resources]
     src_backend = src_compute.config.compute.backend
     dst_backend = dst_storage.config.compute.backend
     ssh_driver = (SSH_CHUNKS if self.cfg.migrate.direct_compute_transfer
                   else TRANSPORTER_MAP[src_backend][dst_backend])
     transporter = task_transfer.TaskTransfer(self.init,
                                              ssh_driver,
                                              resource_name=types,
                                              resource_root_name=body)
     transporter.run(info=info)
    def transport_image(self, dst_cloud, info, instance_id):
        cloud_cfg_dst = dst_cloud.cloud_config.cloud
        temp_dir_dst = cloud_cfg_dst.temp
        transporter = task_transfer.TaskTransfer(
            self.init,
            TRANSPORTER_MAP[CEPH][ISCSI],
            resource_name=utl.INSTANCES_TYPE,
            resource_root_name=utl.DIFF_BODY)

        path_dst = "%s/%s" % (temp_dir_dst, "temp%s" % instance_id)
        info[INSTANCES][instance_id][DIFF][PATH_DST] = path_dst
        info[INSTANCES][instance_id][DIFF][HOST_DST] = dst_cloud.getIpSsh()
        transporter.run(info=info)
        converter = convert_file_to_image.ConvertFileToImage(dst_cloud)
        dst_image_id = converter.run(file_path=path_dst,
                                     image_format='raw',
                                     image_name="%s-image" % instance_id)
        info[INSTANCES][instance_id][INSTANCE_BODY]['image_id'] = dst_image_id
    def copy_ephemeral_iscsi_to_ceph(self, src_cloud, info):
        instances = info[utl.INSTANCES_TYPE]
        qemu_img_src = src_cloud.qemu_img
        transporter = task_transfer.TaskTransfer(
            self.init,
            TRANSPORTER_MAP[ISCSI][CEPH],
            resource_name=utl.INSTANCES_TYPE,
            resource_root_name=utl.EPHEMERAL_BODY)

        for inst_id, inst in instances.iteritems():
            path_src = inst[EPHEMERAL][PATH_SRC]
            path_src_temp_raw = path_src + "." + utl.RAW

            host_src = inst[EPHEMERAL][HOST_SRC]
            qemu_img_src.convert(utl.RAW, path_src, path_src_temp_raw,
                                 host_src)
            inst[EPHEMERAL][PATH_SRC] = path_src_temp_raw
            transporter.run(info=info)
Exemple #11
0
    def transport_volumes_by_instance_via_ssh(self):
        act_convert_c_to_v = convert_compute_to_volume.ConvertComputeToVolume(
            self.init, cloud='src_cloud')
        act_rename_inst_vol_src = create_reference.CreateReference(
            'storage_info', 'src_storage_info')
        act_convert_v_to_c = convert_volume_to_compute.ConvertVolumeToCompute(
            self.init, cloud='dst_cloud')
        act_rename_inst_vol_dst = create_reference.CreateReference(
            'storage_info', 'dst_storage_info')
        act_inst_vol_data_map = prepare_volumes_data_map.PrepareVolumesDataMap(
            self.init, 'src_storage_info', 'dst_storage_info')
        act_deploy_inst_volumes = deploy_volumes.DeployVolumes(
            self.init, cloud='dst_cloud')

        act_inst_vol_transport_data = task_transfer.TaskTransfer(
            self.init,
            ssh_ceph_to_ceph.SSHCephToCeph,
            input_info='storage_info')

        task_get_inst_vol_info = act_convert_c_to_v >> act_rename_inst_vol_src
        task_deploy_inst_vol = act_deploy_inst_volumes >> act_rename_inst_vol_dst
        task_transfer_inst_vol_data = act_inst_vol_data_map >> act_inst_vol_transport_data
        return task_get_inst_vol_info \
               >> task_deploy_inst_vol >> task_transfer_inst_vol_data >> act_convert_v_to_c
    def run(self, storage_info=None, identity_info=None, **kwargs):
        storage_info = copy.deepcopy(storage_info)
        deploy_info = copy.deepcopy(storage_info)
        deploy_info.update(identity_info)
        storage_info.update(identity_info)
        volume_resource = self.cloud.resources[utl.STORAGE_RESOURCE]
        for vol_id, vol in deploy_info[utl.VOLUMES_TYPE].iteritems():
            if vol['snapshots']:

                vol_info = vol[utl.VOLUME_BODY]

                snapshots_list = \
                    [snap_info for snap_info in vol['snapshots'].values()]

                snapshots_list.sort(key=lambda x: x['created_at'])

                for snap in snapshots_list:
                    if snapshots_list.index(snap) == 0:
                        act_snap_transfer = \
                            snap_transfer.SnapTransfer(
                                self.init,
                                ssh_ceph_to_ceph.SSHCephToCeph,
                                1)
                    else:
                        snap_num = snapshots_list.index(snap)
                        snap['prev_snapname'] = \
                            snapshots_list[snap_num - 1]['name']
                        act_snap_transfer = \
                            snap_transfer.SnapTransfer(
                                self.init,
                                ssh_ceph_to_ceph.SSHCephToCeph,
                                2)

                    act_snap_transfer.run(volume=vol_info, snapshot_info=snap)

                    volume_resource.create_snapshot(
                        volume_id=vol_id,
                        display_name=snap['display_name'],
                        display_description=snap['display_description'])

                act_snap_transfer = snap_transfer.SnapTransfer(
                    self.init, ssh_ceph_to_ceph.SSHCephToCeph, 3)
                act_snap_transfer.run(volume=vol_info,
                                      snapshot_info=snapshots_list[-1])

                for snap in snapshots_list:
                    if volume_resource.config.storage.host:
                        act_delete_redundant_snap = \
                            rbd_util.RbdUtil(cloud=self.cloud,
                                             config_migrate=self.cfg.migrate,
                                             host=vol_info[utl.HOST_DST])
                        act_delete_redundant_snap.snap_rm(
                            vol_info[utl.PATH_DST], snap['name'])
                    else:
                        act_delete_redundant_snap = \
                            rbd_util.RbdUtil(cloud=self.cloud,
                                             config_migrate=self.cfg.migrate)
                        act_delete_redundant_snap.snap_rm(
                            vol_info[utl.PATH_DST], snap['name'],
                            vol_info[utl.HOST_DST])

            else:
                one_volume_info = {
                    'one_volume_info': {
                        utl.VOLUMES_TYPE: {
                            vol_id: vol
                        }
                    }
                }

                act_transport_vol_data = \
                    task_transfer.TaskTransfer(self.init,
                                               'SSHCephToCeph',
                                               input_info='one_volume_info')

                act_transport_vol_data.run(**one_volume_info)

        return {}