# huaweicloud-ugo-evaluation-project-java **Repository Path**: HuaweiCloudDeveloper/huaweicloud-ugo-evaluation-project-java ## Basic Information - **Project Name**: huaweicloud-ugo-evaluation-project-java - **Description**: 基于数据库和应用迁移 UGO服务,创建源数据库评估项目,收集源数据信息,分析评估该项目,选择合适的目标数据库。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master-dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-21 - **Last Updated**: 2023-11-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 0.版本说明 本示例配套的SDK版本为:3.0.104 ## 1.功能介绍 本示例展示如何基于数据库和应用迁移 UGO服务的SDK,创建源数据库评估项目,收集源数据信息,分析评估该项目,选择目标数据库。至此,可以依赖该评估项目创建迁移项目,具体请参考示例“迁移项目_对象迁移”。 ## 2.前置条件 - 已[注册](https://reg.huaweicloud.com/registerui/cn/register.html?locale=zh-cn#/register)华为云, 并完成[实名认证](https://account.huaweicloud.com/usercenter/?region=cn-north-4#/accountindex/realNameAuth) 。 - 已获取华为云开发工具包(SDK)。 - 已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。 具体请参考[访问密钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html)。 - 已具备开发环境 ,支持Java JDK 1.8及其以上版本。 - 其他前置条件请参考数据库和应用迁移 UGO服务文档的[快速入门 > 评估项目](https://support.huaweicloud.com/qs-ugo/ugo_02_0005.html)。 ## 3.SDK获取和安装 您可以通过Maven配置所依赖的SDK,具体的SDK版本号请参见[SDK开发中心](https://sdkcenter.developer.huaweicloud.com/?language=java) 。 ```xml com.huaweicloud.sdk huaweicloud-sdk-ugo 3.0.104 ``` ## 4.流程图 ![评估项目的流程图](./assets/evaluation_project.jpg) ## 5.示例代码 以下代码展示如何使用SDK创建源数据库评估项目,收集源数据信息,分析评估该项目,选择目标数据库: ```java /* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. */ package com.huawei.demo; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.http.HttpConfig; import com.huaweicloud.sdk.ugo.v1.UgoClient; import com.huaweicloud.sdk.ugo.v1.model.ConfirmTargetDBReq; import com.huaweicloud.sdk.ugo.v1.model.ConfirmTargetDbTypeRequest; import com.huaweicloud.sdk.ugo.v1.model.CreateEvaluationProjectReq; import com.huaweicloud.sdk.ugo.v1.model.CreateEvaluationProjectRequest; import com.huaweicloud.sdk.ugo.v1.model.DeleteEvaluationProjectRequest; import com.huaweicloud.sdk.ugo.v1.model.EvaluationProject; import com.huaweicloud.sdk.ugo.v1.model.ListEvaluationProjectsRequest; import com.huaweicloud.sdk.ugo.v1.model.ListEvaluationProjectsResponse; import com.huaweicloud.sdk.ugo.v1.model.ObjectTypeInfo; import com.huaweicloud.sdk.ugo.v1.model.ProjectStatusDetail; import com.huaweicloud.sdk.ugo.v1.model.SchemaInfo; import com.huaweicloud.sdk.ugo.v1.model.ShowEvaluationProjectDetailRequest; import com.huaweicloud.sdk.ugo.v1.model.ShowEvaluationProjectStatusRequest; import com.huaweicloud.sdk.ugo.v1.model.ShowEvaluationProjectStatusResponse; import com.huaweicloud.sdk.ugo.v1.model.SourceDBInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 数据库和应用迁移 UGO的示例代码:数据库评估 * * @since 2022-08-20 */ public class EvaluationProjectDemo { private static final Logger logger = LoggerFactory.getLogger(SqlConvertDemo.class); public static void main(String[] args) throws Exception { UgoClient ugoClient = getUgoClient(); String evaluationProjectName = ""; String sourceDbUserName = ""; String sourceDbPassword = ""; String sourceDbConnectionString = ""; String targetDBType = "RDS for MySQL"; String targetDBVersion = "5.7"; SourceDBInfo sourceDbInfo = new SourceDBInfo(); sourceDbInfo.setUserName(sourceDbUserName); sourceDbInfo.setPassword(sourceDbPassword); sourceDbInfo.setSourceDbType(SourceDBInfo.SourceDbTypeEnum.ORACLE); sourceDbInfo.setSourceDbVersion(SourceDBInfo.SourceDbVersionEnum._11G); sourceDbInfo.setConnectionString(sourceDbConnectionString); // Step 1: Create ugo evaluation project. createEvaluationProject(ugoClient, evaluationProjectName, sourceDbInfo); // Step 2: Get evaluation project list. Integer evaluationProjectId = getEvaluationProjectId(ugoClient, evaluationProjectName); // Step 3: Check evaluation project status. checkEvaluationProjectStatus(ugoClient, evaluationProjectId); // Step 4: Confirm target db type. confirmTargetDBType(ugoClient, evaluationProjectId, targetDBType, targetDBVersion); // Step 5: Get evaluation project detail. getEvaluationProjectDetail(ugoClient, evaluationProjectId); // Step 6: Create migration project by this evaluation project. // Step 7: Delete evaluation project. deleteEvaluationProject(ugoClient, evaluationProjectId); } private static UgoClient getUgoClient() { // 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String endpoint = ""; String projectId = ""; // Http Configuration for client HttpConfig config = HttpConfig.getDefaultHttpConfig(); config.withIgnoreSSLVerification(true); // Create the authentication BasicCredentials auth = new BasicCredentials() .withAk(ak) .withSk(sk) .withProjectId(projectId); // Create UgoClient instance return UgoClient.newBuilder() .withHttpConfig(config) .withCredential(auth) .withEndpoint(endpoint) .build(); } private static void createEvaluationProject(UgoClient ugoClient, String evaluationProjectName, SourceDBInfo sourceDbInfo) { CreateEvaluationProjectRequest createEvaluationProjectRequest = new CreateEvaluationProjectRequest(); CreateEvaluationProjectReq createEvaluationProjectBody = new CreateEvaluationProjectReq(); createEvaluationProjectBody.setEvaluationProjectName(evaluationProjectName); createEvaluationProjectBody.setSourceDbInfo(sourceDbInfo); SchemaInfo schemasInfo = new SchemaInfo(); schemasInfo.setIsSelectAllSchemas(Boolean.TRUE); createEvaluationProjectBody.setSchemasInfo(schemasInfo); ObjectTypeInfo objectsTypeInfo = new ObjectTypeInfo(); objectsTypeInfo.setIsSelectAllObjectsType(Boolean.TRUE); createEvaluationProjectBody.setObjectsTypeInfo(objectsTypeInfo); createEvaluationProjectRequest.setBody(createEvaluationProjectBody); ugoClient.createEvaluationProject(createEvaluationProjectRequest); } private static Integer getEvaluationProjectId(UgoClient ugoClient, String evaluationProjectName) throws Exception { ListEvaluationProjectsRequest listEvaluationProjectsRequest = new ListEvaluationProjectsRequest(); listEvaluationProjectsRequest.setEvaluationProjectName(evaluationProjectName); ListEvaluationProjectsResponse listEvaluationProjectsResponse = null; Integer totalCount = 0; for (int time = 0; time < 60; time++) { listEvaluationProjectsResponse = ugoClient.listEvaluationProjects(listEvaluationProjectsRequest); totalCount = listEvaluationProjectsResponse.getTotalCount(); if (totalCount == 1) { break; } Thread.sleep(1000); } if (totalCount == 0) { logger.error("create evaluation project time out!"); return null; } EvaluationProject evaluationProject = listEvaluationProjectsResponse.getEvaluationProjects().get(0); return evaluationProject.getEvaluationProjectId(); } private static void checkEvaluationProjectStatus(UgoClient ugoClient, Integer evaluationProjectId) throws InterruptedException { ShowEvaluationProjectStatusRequest showEvaluationProjectStatusRequest = new ShowEvaluationProjectStatusRequest(); showEvaluationProjectStatusRequest.setEvaluationProjectId(Integer.toString(evaluationProjectId)); while (true) { ShowEvaluationProjectStatusResponse showEvaluationProjectStatusResponse = ugoClient.showEvaluationProjectStatus(showEvaluationProjectStatusRequest); ShowEvaluationProjectStatusResponse.EvaluationProjectStatusEnum evaluationProjectStatus = showEvaluationProjectStatusResponse.getEvaluationProjectStatus(); ProjectStatusDetail projectStatusDetail = showEvaluationProjectStatusResponse.getProjectStatusDetail(); String objectCollectionStatus = projectStatusDetail.getObjectCollectionStatus(); String preMigrationStatus = projectStatusDetail.getPreMigrationStatus(); String completedStatus = ShowEvaluationProjectStatusResponse.EvaluationProjectStatusEnum.COMPLETED.getValue(); String pendingStatus = ShowEvaluationProjectStatusResponse.EvaluationProjectStatusEnum.PENDING.getValue(); if (!completedStatus.equals(objectCollectionStatus)) { logger.info("object collection in progress: {}", projectStatusDetail.getObjectCollectionProgress()); Thread.sleep(10000); continue; } if (!completedStatus.equals(preMigrationStatus)) { logger.info("pre-migration in progress: {}", projectStatusDetail.getPreMigrationProgress()); Thread.sleep(10000); continue; } if (pendingStatus.equals(evaluationProjectStatus.getValue())) { logger.info("wait to confirm target db type."); break; } } } private static void confirmTargetDBType(UgoClient ugoClient, Integer evaluationProjectId, String targetDBType, String targetDBVersion) { ConfirmTargetDbTypeRequest confirmTargetDbTypeRequest = new ConfirmTargetDbTypeRequest(); ConfirmTargetDBReq confirmTargetDBBody = new ConfirmTargetDBReq(); confirmTargetDBBody.setEvaluationProjectId(Integer.toString(evaluationProjectId)); confirmTargetDBBody.setTargetDbType(targetDBType); confirmTargetDBBody.setTargetDbVersion(targetDBVersion); confirmTargetDbTypeRequest.setBody(confirmTargetDBBody); ugoClient.confirmTargetDbType(confirmTargetDbTypeRequest); } private static void getEvaluationProjectDetail(UgoClient ugoClient, Integer evaluationProjectId) { ShowEvaluationProjectDetailRequest showEvaluationProjectDetailRequest = new ShowEvaluationProjectDetailRequest(); showEvaluationProjectDetailRequest.setEvaluationProjectId(Integer.toString(evaluationProjectId)); ugoClient.showEvaluationProjectDetail(showEvaluationProjectDetailRequest); } private static void deleteEvaluationProject(UgoClient ugoClient, Integer evaluationProjectId) { DeleteEvaluationProjectRequest deleteEvaluationProjectRequest = new DeleteEvaluationProjectRequest(); deleteEvaluationProjectRequest.setEvaluationProjectId(Integer.toString(evaluationProjectId)); ugoClient.deleteEvaluationProject(deleteEvaluationProjectRequest); } } ``` ## 6.返回结果示例 - 创建评估项目(CreateEvaluationProject)接口的返回值:无返回 - 查询评估项目列表(ListEvaluationProjects)接口的返回值: ``` { "evaluation_projects":[ { "evaluation_project_id":187, "evaluation_project_name":"Huawei-Codelabs-UGO-Evaluation-test", "evaluation_project_status":"PENDING", "project_status_detail":{ "object_collection_status":"COMPLETED", "pre_migration_status":"COMPLETED" }, "source_db_type":"ORACLE", "source_db_version":"11g", "target_db_version":"", "collect_size":4623291, "resource_id":"826c916c-421d-4d9f-a68c-38bc3a9504ad", "created_time":"2022-06-23T03:34:39Z", "updated_time":"2022-06-23T03:34:39Z", "error_reason":"" } ], "total_count":1 } ``` - 查询评估项目状态(ShowEvaluationProjectStatus)接口的返回值: ``` { "evaluation_project_id":187, "evaluation_project_name":"Huawei-Codelabs-UGO-Evaluation-test", "evaluation_project_status":"PENDING", "project_status_detail":{ "object_collection_status":"COMPLETED", "pre_migration_status":"COMPLETED" }, "source_db_type":"ORACLE", "source_db_version":"11g", "target_db_version":"" } ``` - 评估项目确认目标数据库类型(ConfirmTargetDbType)接口的返回值: ``` { "evaluation_project_id":187, "evaluation_project_name":"Huawei-Codelabs-UGO-Evaluation-test", "evaluation_project_status":"PENDING", "project_status_detail":{ "object_collection_status":"COMPLETED", "pre_migration_status":"COMPLETED" }, "source_db_type":"ORACLE", "target_db_type":"RDS for MySQL", "target_db_version":"5.7" } ``` - 查询评估项目详情(ShowEvaluationProjectDetail)接口的返回值: ``` { "evaluation_project_id":187, "evaluation_project_name":"Huawei-Codelabs-UGO-Evaluation-test", "source_db_size":"0.094 TB", "source_db_schema":39, "source_db_cpu":"2", "source_db_character_set":"ZHS16GBK", "source_db_os":"Linux x86 64-bit", "source_db_instance_num":1, "source_db_ram":"SGA 0.99 GB, PGA 0.2 GB, AMM", "source_db_info":{ "user_name":"ugo", "connection_string":"100.xx.xxx.xxx:1521:ORCL", "source_db_type":"ORACLE", "service_name":"orcl", "ip":null, "port":"null" }, "source_db_phy_ram":"7.62 GB", "source_db_version":"11.2.0.1.0", "source_db_conf":"Single Instance", "source_db_clock":"+00:00" } ``` - 删除评估项目(DeleteEvaluationProject)接口的返回值: ``` { "evaluation_project_id":187 } ``` ## 7.参考链接 更多信息请参考[API Explorer](https://apiexplorer.developer.huaweicloud.com/apiexplorer/sdk?product=ugo) 和数据库和应用迁移 UGO服务文档的[API参考](https://support.huaweicloud.com/api-ugo/ugo_05_0002.html)。 ## 修订记录 | 发布日期 | 文档版本 | 修订说明 | | :--------: | :------: | :----------: | | 2022-09-22 | 1.0 | 文档首次发布 |