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
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
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
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"
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
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)
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, "操作成功,开始备份"