Ejemplo n.º 1
0
    def start_migrate(self, user, current_team, current_region, migrate_team,
                      migrate_region, backup_id, migrate_type):

        backup_record = backup_record_repo.get_record_by_backup_id(
            current_team.tenant_id, backup_id)
        if not backup_record:
            return 404, "无备份记录", None

        if migrate_type == "recover":
            is_all_services_closed = self.__check_group_service_status(
                current_region, current_team, backup_record.group_id)
            if not is_all_services_closed:
                return 409, "恢复备份请确保当前组下的应用全部关闭", None

        restore_mode = self.__get_restore_type(current_team, current_region,
                                               migrate_team, migrate_region)

        # 数据迁移到其他地方先处理数据中心数据拷贝
        new_group, new_backup_record = self.__copy_backup_record(
            restore_mode, backup_record, current_team, current_region,
            migrate_team, migrate_region, migrate_type)
        if not new_backup_record:
            new_backup_record = backup_record

        backup_service_info = json.loads(new_backup_record.backup_server_info)
        service_slug = backup_service_info["slug_info"]
        service_image = backup_service_info["image_info"]

        data = {
            "backup_id": new_backup_record.backup_id,
            "restore_mode": restore_mode,
            "tenant_id": migrate_team.tenant_id,
            "slug_info": service_slug,
            "image_info": service_image
        }
        body = region_api.star_apps_migrate_task(migrate_region,
                                                 migrate_team.tenant_name,
                                                 new_backup_record.backup_id,
                                                 data)

        # 创建迁移记录
        params = {
            "group_id": new_group.ID,
            "group_uuid": new_backup_record.group_uuid,
            "event_id": make_uuid(),
            "version": backup_record.version,
            "backup_id": new_backup_record.backup_id,
            "migrate_team": migrate_team.tenant_name,
            "migrate_region": migrate_region,
            "status": "starting",
            "user": user.nick_name,
            "restore_id": body["bean"]["restore_id"],
            "original_group_id": backup_record.group_id,
            "original_group_uuid": backup_record.group_uuid,
            "migrate_type": migrate_type
        }
        migrate_record = migrate_repo.create_migrate_record(**params)

        return 200, "操作成功,开始迁移", migrate_record
Ejemplo n.º 2
0
    def start_migrate(self, user, current_team, current_region, migrate_team, migrate_region, backup_id, migrate_type, event_id,
                      restore_id):
        backup_record = backup_record_repo.get_record_by_backup_id(current_team.tenant_id, backup_id)
        if not backup_record:
            raise ErrBackupRecordNotFound

        s3_info = EnterpriseConfigService(user.enterprise_id).get_cloud_obj_storage_info()
        if backup_record.mode == "full-online" and not s3_info:
            raise ErrObjectStorageInfoNotFound

        if migrate_type == "recover":
            is_all_services_closed = self.__check_group_service_status(current_region, current_team, backup_record.group_id)
            if not is_all_services_closed:
                raise ErrNeedAllServiceCloesed

        restore_mode = self.__get_restore_type(current_team, current_region, migrate_team, migrate_region)

        # 数据迁移到其他地方先处理数据中心数据拷贝
        new_group, new_backup_record = self.__copy_backup_record(restore_mode, backup_record, current_team, current_region,
                                                                 migrate_team, migrate_region, migrate_type)
        if not new_backup_record:
            new_backup_record = backup_record

        data = {
            "event_id": make_uuid(),
            "backup_id": new_backup_record.backup_id,
            "restore_mode": restore_mode,
            "tenant_id": migrate_team.tenant_id,
            "s3_config": s3_info,
        }
        body = region_api.star_apps_migrate_task(migrate_region, migrate_team.tenant_name, new_backup_record.backup_id, data)

        if event_id:
            migrate_record = migrate_repo.get_by_event_id(event_id)
            data = region_api.get_apps_migrate_status(migrate_record.migrate_region, migrate_record.migrate_team,
                                                      migrate_record.backup_id, restore_id)
            bean = data["bean"]
            migrate_record.status = bean["status"]
            migrate_record.save()
        else:
            # 创建迁移记录
            params = {
                "group_id": new_group.ID,
                "group_uuid": new_backup_record.group_uuid,
                "event_id": make_uuid(),
                "version": backup_record.version,
                "backup_id": new_backup_record.backup_id,
                "migrate_team": migrate_team.tenant_name,
                "migrate_region": migrate_region,
                "status": "starting",
                "user": user.nick_name,
                "restore_id": body["bean"]["restore_id"],
                "original_group_id": backup_record.group_id,
                "original_group_uuid": backup_record.group_uuid,
                "migrate_type": migrate_type
            }
            migrate_record = migrate_repo.create_migrate_record(**params)
        return migrate_record
Ejemplo n.º 3
0
    def export_group_backup(self, tenant, backup_id):
        backup_record = backup_record_repo.get_record_by_backup_id(tenant.tenant_id, backup_id)
        if not backup_record:
            return 404, "不存在该备份记录", None
        if backup_record.mode == "full-offline":
            return 409, "本地备份数据暂不支持导出", None
        if backup_record.status == "starting":
            return 409, "正在备份中,请稍后重试", None

        data_str = AuthCode.encode(json.dumps(backup_record.to_dict()), KEY)
        return 200, "success", data_str
Ejemplo n.º 4
0
 def delete_group_backup_by_backup_id(self, tenant, region, backup_id, group_id):
     backup_record = backup_record_repo.get_record_by_backup_id(tenant.tenant_id, backup_id)
     if not backup_record:
         return 404, "不存在该备份记录"
     if backup_record.status == "starting":
         return 409, "该备份正在进行中"
     if backup_record.status == "success" and group_repo.get_group_by_id(group_id):
         return 409, "该备份不可删除"
     region_api.delete_backup_by_backup_id(region, tenant.tenant_name, backup_id)
     backup_record_repo.delete_record_by_backup_id(tenant.tenant_id, backup_id)
     return 200, "success"
Ejemplo n.º 5
0
 def get_groupapp_backup_status_by_backup_id(self, tenant, region, backup_id):
     backup_record = backup_record_repo.get_record_by_backup_id(tenant.tenant_id, backup_id)
     if not backup_record:
         return 404, "不存在该备份记录", None
     if backup_record.status == "starting":
         body = region_api.get_backup_status_by_backup_id(region, tenant.tenant_name, backup_id)
         bean = body["bean"]
         backup_record.status = bean["status"]
         backup_record.source_dir = bean["source_dir"]
         backup_record.source_type = bean["source_type"]
         backup_record.backup_size = bean["backup_size"]
         backup_record.save()
     return 200, "success", backup_record
Ejemplo n.º 6
0
    def delete_group_backup_by_backup_id(self, tenant, region, backup_id):
        backup_record = backup_record_repo.get_record_by_backup_id(tenant.tenant_id, backup_id)
        if not backup_record:
            raise ErrBackupRecordNotFound
        if backup_record.status == "starting":
            return ErrBackupInProgress

        try:
            region_api.delete_backup_by_backup_id(region, tenant.tenant_name, backup_id)
        except region_api.CallApiError as e:
            if e.status != 404:
                raise e

        backup_record_repo.delete_record_by_backup_id(tenant.tenant_id, backup_id)
Ejemplo n.º 7
0
    def start_migrate(self, user, current_team, current_region, migrate_team,
                      migrate_region, backup_id):
        backup_record = backup_record_repo.get_record_by_backup_id(backup_id)
        if not backup_record:
            return 404, "无备份记录"
        data = {
            # TODO 跟region端交互的数据
            "team": migrate_team,
            "region": migrate_region
        }
        region_api.star_apps_migrate_task(current_region, current_team, data)
        # 创建迁移记录

        return 200, "操作成功,开始备份"