diff --git a/cube-migration/src/main/java/org/apache/kylin/rest/controller/MigrationController.java b/cube-migration/src/main/java/org/apache/kylin/rest/controller/MigrationController.java index 9ba9a07f01b..42e2418bc7e 100644 --- a/cube-migration/src/main/java/org/apache/kylin/rest/controller/MigrationController.java +++ b/cube-migration/src/main/java/org/apache/kylin/rest/controller/MigrationController.java @@ -104,7 +104,7 @@ public String requestMigration(@PathVariable String cubeName, @RequestBody Migra CubeInstance cube = getCubeInstance(cubeName); try { MigrationRuleSet.Context ctx = new MigrationRuleSet.Context(queryService, cube, - getTargetHost(request.getTargetHost()), request.getProjectName()); + getTargetHost(request.getTargetHost()), request.getProjectName(), request.getMigrateWithData()); migrationService.requestMigration(cube, ctx); } catch (Exception e) { logger.error("Request migration failed.", e); @@ -128,7 +128,7 @@ public String approve(@PathVariable String cubeName, @RequestBody MigrationReque CubeInstance cube = getCubeInstance(cubeName); try { MigrationRuleSet.Context ctx = new MigrationRuleSet.Context(queryService, cube, - getTargetHost(request.getTargetHost()), request.getProjectName()); + getTargetHost(request.getTargetHost()), request.getProjectName(), request.getMigrateWithData()); migrationService.approve(cube, ctx); } catch (Exception e) { throw new BadRequestException(e.getMessage()); diff --git a/cube-migration/src/main/java/org/apache/kylin/rest/request/MigrationRequest.java b/cube-migration/src/main/java/org/apache/kylin/rest/request/MigrationRequest.java index 4e8c257973b..0f31bac08da 100644 --- a/cube-migration/src/main/java/org/apache/kylin/rest/request/MigrationRequest.java +++ b/cube-migration/src/main/java/org/apache/kylin/rest/request/MigrationRequest.java @@ -22,6 +22,7 @@ public class MigrationRequest { private String targetHost; private String projectName; private String reason; // reject reason + private String migrateWithData; public String getTargetHost() { return targetHost; @@ -46,4 +47,12 @@ public String getReason() { public void setReason(String reason) { this.reason = reason; } + + public String getMigrateWithData() { + return migrateWithData; + } + + public void setMigrateWithData(String migrateWithData) { + this.migrateWithData = migrateWithData; + } } diff --git a/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationRuleSet.java b/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationRuleSet.java index 39a45a8159b..a82b082c075 100644 --- a/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationRuleSet.java +++ b/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationRuleSet.java @@ -427,14 +427,21 @@ public static class Context { private final ResourceStore targetResourceStore; private final String tgtProjectName; // the target project name private final ProjectInstance srcProject; // the source project + private final String migrateWithData; public Context(QueryService queryService, CubeInstance cubeInstance, String targetHost, String tgtProjectName) { + this(queryService, cubeInstance, targetHost, tgtProjectName, "false"); + } + + public Context(QueryService queryService, CubeInstance cubeInstance, String targetHost, String tgtProjectName, + String migrateWithData) { this.queryService = queryService; this.cubeInstance = cubeInstance; this.targetAddress = targetHost; KylinConfig targetConfig = KylinConfig.createInstanceFromUri(targetHost); this.targetResourceStore = ResourceStore.getStore(targetConfig); this.tgtProjectName = tgtProjectName; + this.migrateWithData = migrateWithData; List projList = ProjectManager.getInstance(KylinConfig.getInstanceFromEnv()) .findProjects(cubeInstance.getType(), cubeInstance.getName()); @@ -472,5 +479,9 @@ public String getSrcProjectName() { public ProjectInstance getSrcProject() { return srcProject; } + + public String getMigrateWithData() { + return migrateWithData; + } } } \ No newline at end of file diff --git a/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationService.java b/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationService.java index ecef04250dc..65f2886df46 100644 --- a/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationService.java +++ b/cube-migration/src/main/java/org/apache/kylin/rest/service/MigrationService.java @@ -75,6 +75,8 @@ public void requestMigration(CubeInstance cube, MigrationRuleSet.Context ctx) th root.put("cubename", ctx.getCubeInstance().getName()); root.put("status", "NEED APPROVE"); root.put("envname", envName); + root.put("migrateWithData", ctx.getMigrateWithData()); + sendMigrationMail(MailNotificationUtil.MIGRATION_REQUEST, getEmailRecipients(cube), root); } @@ -104,27 +106,34 @@ public void approve(CubeInstance cube, MigrationRuleSet.Context ctx) throws Exce String cubeName = cube.getName(); String projectName = ctx.getTgtProjectName(); try { - sendApprovedMailQuietly(cubeName, projectName); - - // do cube migration - new CubeMigrationCLI().moveCube(localHost, ctx.getTargetAddress(), cubeName, projectName, "true", "false", - "true", "true", "false"); + sendApprovedMailQuietly(cubeName, projectName, ctx.getMigrateWithData()); + + if (!ctx.getMigrateWithData().isEmpty() && "true".equalsIgnoreCase(ctx.getMigrateWithData())) { + // do cube migration with data + new CubeMigrationCLI().moveCube(localHost, ctx.getTargetAddress(), cubeName, projectName, "true", + "true", "true", "true", "true"); + } else { + // do cube migration withOut data + new CubeMigrationCLI().moveCube(localHost, ctx.getTargetAddress(), cubeName, projectName, "true", + "false", "true", "true", "false"); + } - sendCompletedMailQuietly(cubeName, projectName); + sendCompletedMailQuietly(cubeName, projectName, ctx.getMigrateWithData()); } catch (Exception e) { logger.error(e.getMessage(), e); - sendMigrationFailedMailQuietly(cubeName, projectName, e.getMessage()); + sendMigrationFailedMailQuietly(cubeName, projectName, e.getMessage(), ctx.getMigrateWithData()); throw e; } } - private boolean sendApprovedMailQuietly(String cubeName, String projectName) { + private boolean sendApprovedMailQuietly(String cubeName, String projectName, String migrateWithData) { try { Map root = Maps.newHashMap(); root.put("projectname", projectName); root.put("cubename", cubeName); root.put("status", "APPROVED"); root.put("envname", envName); + root.put("migrateWithData", migrateWithData); sendMigrationMail(MailNotificationUtil.MIGRATION_APPROVED, getEmailRecipients(cubeName), root); } catch (Exception e) { @@ -134,13 +143,14 @@ private boolean sendApprovedMailQuietly(String cubeName, String projectName) { return true; } - private boolean sendCompletedMailQuietly(String cubeName, String projectName) { + private boolean sendCompletedMailQuietly(String cubeName, String projectName, String migrateWithData) { try { Map root = Maps.newHashMap(); root.put("projectname", projectName); root.put("cubename", cubeName); root.put("status", "COMPLETED"); root.put("envname", envName); + root.put("migrateWithData", migrateWithData); sendMigrationMail(MailNotificationUtil.MIGRATION_COMPLETED, getEmailRecipients(cubeName), root); } catch (Exception e) { @@ -150,7 +160,8 @@ private boolean sendCompletedMailQuietly(String cubeName, String projectName) { return true; } - private boolean sendMigrationFailedMailQuietly(String cubeName, String projectName, String reason) { + private boolean sendMigrationFailedMailQuietly(String cubeName, String projectName, String reason, + String migrateWithData) { try { Map root = Maps.newHashMap(); root.put("projectname", projectName); @@ -158,6 +169,7 @@ private boolean sendMigrationFailedMailQuietly(String cubeName, String projectNa root.put("status", "FAILED"); root.put("failedReason", reason); root.put("envname", envName); + root.put("migrateWithData", migrateWithData); sendMigrationMail(MailNotificationUtil.MIGRATION_FAILED, getEmailRecipients(cubeName), root); } catch (Exception e) { diff --git a/cube-migration/src/main/resources/mail_templates/MIGRATION_APPROVED.ftl b/cube-migration/src/main/resources/mail_templates/MIGRATION_APPROVED.ftl index 03c76bfca4a..15f6f84b152 100644 --- a/cube-migration/src/main/resources/mail_templates/MIGRATION_APPROVED.ftl +++ b/cube-migration/src/main/resources/mail_templates/MIGRATION_APPROVED.ftl @@ -163,6 +163,29 @@ border-left:0px;"> ${cubename} + + +

Migrate With Data

+ + +

+ ${migrateWithData}

+ + diff --git a/cube-migration/src/main/resources/mail_templates/MIGRATION_COMPLETED.ftl b/cube-migration/src/main/resources/mail_templates/MIGRATION_COMPLETED.ftl index 58db588019f..8a116575fdd 100644 --- a/cube-migration/src/main/resources/mail_templates/MIGRATION_COMPLETED.ftl +++ b/cube-migration/src/main/resources/mail_templates/MIGRATION_COMPLETED.ftl @@ -162,6 +162,29 @@ border-left:0px;"> font-weight: 300;">${cubename} + + +

Migrate With Data

+ + +

+ ${migrateWithData}

+ + diff --git a/cube-migration/src/main/resources/mail_templates/MIGRATION_FAILED.ftl b/cube-migration/src/main/resources/mail_templates/MIGRATION_FAILED.ftl index 2a02f92acaa..cead05cebac 100644 --- a/cube-migration/src/main/resources/mail_templates/MIGRATION_FAILED.ftl +++ b/cube-migration/src/main/resources/mail_templates/MIGRATION_FAILED.ftl @@ -190,6 +190,29 @@ border-left:0px;"> ${failedReason} + + +

Migrate With Data

+ + +

+ ${migrateWithData}

+ + diff --git a/cube-migration/src/main/resources/mail_templates/MIGRATION_REQUEST.ftl b/cube-migration/src/main/resources/mail_templates/MIGRATION_REQUEST.ftl index 6c50f9c1a6b..9eb0c3d8366 100644 --- a/cube-migration/src/main/resources/mail_templates/MIGRATION_REQUEST.ftl +++ b/cube-migration/src/main/resources/mail_templates/MIGRATION_REQUEST.ftl @@ -165,7 +165,29 @@ border-left:0px;"> ${cubename} - + + +

Migrate With Data

+ + +

+ ${migrateWithData}

+ + diff --git a/webapp/app/js/controllers/cubes.js b/webapp/app/js/controllers/cubes.js index 4beb66dafd7..23ceba93c28 100644 --- a/webapp/app/js/controllers/cubes.js +++ b/webapp/app/js/controllers/cubes.js @@ -1204,7 +1204,8 @@ var cubeMigrateCtrl = function ($scope, $modalInstance, CubeService, cube, Proje } $scope.MigrationRequest = { - projectName:$scope.migrate.targetProject + projectName:$scope.migrate.targetProject, + migrateWithData:$scope.migrate.migrateWithData } SweetAlert.swal({ @@ -1241,7 +1242,8 @@ var cubeMigrateCtrl = function ($scope, $modalInstance, CubeService, cube, Proje $scope.migrateApprove = function(){ $scope.MigrationRequest = { - projectName:$scope.migrate.targetProject + projectName:$scope.migrate.targetProject, + migrateWithData:$scope.migrate.migrateWithData } loadingRequest.show(); CubeService.approve({cubeId: cube.name}, $scope.MigrationRequest, function (result) { diff --git a/webapp/app/partials/cubes/cube_migrate.html b/webapp/app/partials/cubes/cube_migrate.html index d182c5f0559..c8cb06c9773 100644 --- a/webapp/app/partials/cubes/cube_migrate.html +++ b/webapp/app/partials/cubes/cube_migrate.html @@ -24,10 +24,15 @@

MIGRATE CUBE

- Target Project Name: -
-

You can change the below project name if it's different on Kylin Prod.

+ Target Project Name: +

You can change the below project name if it's different on Kylin Prod.

+
+
+ Migrate With Data: + +

You can choose whether to migrate with data .

+
@@ -65,9 +70,16 @@

MIGRATE APPROVE

+
Target Project Name: -
+
+
+
+

You can choose whether to migrate with data .

+ Migrate With Data: + +