Skip to content

Commit

Permalink
Refactor lite console codes for sharding operations.
Browse files Browse the repository at this point in the history
  • Loading branch information
haocao committed Apr 6, 2017
1 parent fdd2c9e commit 6df017d
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,18 @@ public void shutdownJob(@PathParam("jobName") final String jobName) {
public Collection<ShardingInfo> getShardingInfo(@PathParam("jobName") final String jobName) {
return jobAPIService.getShardingStatisticsAPI().getShardingInfo(jobName);
}

@POST
@Path("/{jobName}/sharding/{item}/disable")
@Consumes(MediaType.APPLICATION_JSON)
public void disableSharding(@PathParam("jobName") final String jobName, @PathParam("item") final String item) {
jobAPIService.getShardingOperateAPI().disable(jobName, item);
}

@DELETE
@Path("/{jobName}/sharding/{item}/disable")
@Consumes(MediaType.APPLICATION_JSON)
public void enableSharding(@PathParam("jobName") final String jobName, @PathParam("item") final String item) {
jobAPIService.getShardingOperateAPI().enable(jobName, item);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,21 @@
import com.dangdang.ddframe.job.lite.lifecycle.api.JobSettingsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.JobStatisticsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ServerStatisticsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ShardingOperateAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ShardingStatisticsAPI;

public interface JobAPIService {

JobSettingsAPI getJobSettingsAPI();

JobOperateAPI getJobOperatorAPI();

ShardingOperateAPI getShardingOperateAPI();

JobStatisticsAPI getJobStatisticsAPI();

ServerStatisticsAPI getServerStatisticsAPI();

ShardingStatisticsAPI getShardingStatisticsAPI();

JobOperateAPI getJobOperatorAPI();
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.dangdang.ddframe.job.lite.lifecycle.api.JobSettingsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.JobStatisticsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ServerStatisticsAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ShardingOperateAPI;
import com.dangdang.ddframe.job.lite.lifecycle.api.ShardingStatisticsAPI;
import com.google.common.base.Optional;

Expand All @@ -36,6 +37,18 @@ public JobSettingsAPI getJobSettingsAPI() {
return JobAPIFactory.createJobSettingsAPI(regCenterConfig.getZkAddressList(), regCenterConfig.getNamespace(), Optional.fromNullable(regCenterConfig.getDigest()));
}

@Override
public JobOperateAPI getJobOperatorAPI() {
RegistryCenterConfiguration regCenterConfig = SessionRegistryCenterConfiguration.getRegistryCenterConfiguration();
return JobAPIFactory.createJobOperateAPI(regCenterConfig.getZkAddressList(), regCenterConfig.getNamespace(), Optional.fromNullable(regCenterConfig.getDigest()));
}

@Override
public ShardingOperateAPI getShardingOperateAPI() {
RegistryCenterConfiguration regCenterConfig = SessionRegistryCenterConfiguration.getRegistryCenterConfiguration();
return JobAPIFactory.createShardingOperateAPI(regCenterConfig.getZkAddressList(), regCenterConfig.getNamespace(), Optional.fromNullable(regCenterConfig.getDigest()));
}

@Override
public JobStatisticsAPI getJobStatisticsAPI() {
RegistryCenterConfiguration regCenterConfig = SessionRegistryCenterConfiguration.getRegistryCenterConfiguration();
Expand All @@ -54,9 +67,4 @@ public ShardingStatisticsAPI getShardingStatisticsAPI() {
return JobAPIFactory.createShardingStatisticsAPI(regCenterConfig.getZkAddressList(), regCenterConfig.getNamespace(), Optional.fromNullable(regCenterConfig.getDigest()));
}

@Override
public JobOperateAPI getJobOperatorAPI() {
RegistryCenterConfiguration regCenterConfig = SessionRegistryCenterConfiguration.getRegistryCenterConfiguration();
return JobAPIFactory.createJobOperateAPI(regCenterConfig.getZkAddressList(), regCenterConfig.getNamespace(), Optional.fromNullable(regCenterConfig.getDigest()));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
$(function() {
$("#job-name").text($("#index-job-name").text());
renderShardingTable();
bindButtons();
renderBreadCrumbMenu();
});

Expand All @@ -24,12 +25,19 @@ function renderShardingTable() {
field: "failover",
title: "失效转移",
formatter: "failoverFormatter"
}, {
field: "operation",
title: "操作",
formatter: "generateOperationButtons"
}]
});
}

function shardingStatusFormatter(value, row) {
switch(value) {
case "DISABLED":
return "<span class='label label-warning'>禁用中</span>";
break;
case "RUNNING":
return "<span class='label label-primary'>运行中</span>";
break;
Expand All @@ -39,11 +47,8 @@ function shardingStatusFormatter(value, row) {
case "SHARDING_ERROR":
return "<span class='label label-warning'>分片调整中</span>";
break;
case "DISABLED":
return "<span class='label label-warning'>禁用中</span>";
break;
default:
return "-";
return "<span class='label label-default'>等待运行</span>";
break;
}
}
Expand All @@ -52,6 +57,51 @@ function failoverFormatter(value, row) {
return value ? "是" : "-";
}

function generateOperationButtons(val, row) {
var disableButton = "<button operation='disable-sharding' class='btn-xs btn-warning' job-name='" + row.jobName + "' item='" + row.item + "' >禁用</button>";
var enableButton = "<button operation='enable-sharding' class='btn-xs btn-success' job-name='" + row.jobName + "' item='" + row.item + "' >启用</button>";
if ("DISABLED" === row.status) {
return enableButton;
} else {
return disableButton;
}
}

function bindButtons() {
bindDisableButton();
bindEnableButton();
}

function bindDisableButton() {
$(document).on("click", "button[operation='disable-sharding']", function(event) {
var jobName = $("#index-job-name").text();
var item = $(event.currentTarget).attr("item");
$.ajax({
url: "/api/jobs/" + jobName + "/sharding/" + item + "/disable",
type: "POST",
success: function() {
showSuccessDialog();
$("#sharding").bootstrapTable("refresh");
}
});
});
}

function bindEnableButton() {
$(document).on("click", "button[operation='enable-sharding']", function(event) {
var jobName = $("#index-job-name").text();
var item = $(event.currentTarget).attr("item");
$.ajax({
url: "/api/jobs/" + jobName + "/sharding/" + item + "/disable",
type: "DELETE",
success: function() {
showSuccessDialog();
$("#sharding").bootstrapTable("refresh");
}
});
});
}

function renderBreadCrumbMenu() {
$("#breadcrumb-job").click(function() {
$("#content").load("html/status/job/jobs_status_overview.html");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,17 +90,6 @@ public String getServerNodePath(final String serverIp) {
return String.format("%s/%s", getServerNodePath(), serverIp);
}

/**
* 根据IP地址和子节点名称获取子节点路径.
*
* @param serverIp 作业服务器IP地址
* @param nodeName 子节点名称
* @return 作业节点IP地址子节点路径
*/
public String getServerNodePath(final String serverIp, final String nodeName) {
return String.format("%s/%s", getServerNodePath(serverIp), nodeName);
}

/**
* 获取作业实例节点根路径.
*
Expand All @@ -123,7 +112,7 @@ public String getInstanceNodePath(final String instanceId) {
/**
* 获取分片节点根路径.
*
* @return 运行节点根路径
* @return 分片节点根路径
*/
public String getShardingNodePath() {
return String.format("/%s/%s", jobName, SHARDING_NODE);
Expand All @@ -134,7 +123,7 @@ public String getShardingNodePath() {
*
* @param item 分片项
* @param nodeName 子节点名称
* @return 运行节点路径
* @return 分片节点路径
*/
public String getShardingNodePath(final String item, final String nodeName) {
return String.format("%s/%s/%s", getShardingNodePath(), item, nodeName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ public void assertGetServerNodePathForServerIp() {
assertThat(jobNodePath.getServerNodePath("ip0"), is("/test_job/servers/ip0"));
}

@Test
public void assertGetServerNodePathForServerIpAndNameNode() {
assertThat(jobNodePath.getServerNodePath("ip0", "node"), is("/test_job/servers/ip0/node"));
}

@Test
public void assertGetShardingNodePath() {
assertThat(jobNodePath.getShardingNodePath(), is("/test_job/sharding"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.dangdang.ddframe.job.lite.lifecycle.api;

import com.dangdang.ddframe.job.lite.lifecycle.internal.operate.JobOperateAPIImpl;
import com.dangdang.ddframe.job.lite.lifecycle.internal.operate.ShardingOperateAPIImpl;
import com.dangdang.ddframe.job.lite.lifecycle.internal.reg.RegistryCenterFactory;
import com.dangdang.ddframe.job.lite.lifecycle.internal.settings.JobSettingsAPIImpl;
import com.dangdang.ddframe.job.lite.lifecycle.internal.statistics.JobStatisticsAPIImpl;
Expand Down Expand Up @@ -59,6 +60,18 @@ public static JobOperateAPI createJobOperateAPI(final String connectString, fina
return new JobOperateAPIImpl(RegistryCenterFactory.createCoordinatorRegistryCenter(connectString, namespace, digest));
}

/**
* 创建操作分片API对象.
*
* @param connectString 注册中心连接字符串
* @param namespace 注册中心命名空间
* @param digest 注册中心凭证
* @return 操作分片API对象
*/
public static ShardingOperateAPI createShardingOperateAPI(final String connectString, final String namespace, final Optional<String> digest) {
return new ShardingOperateAPIImpl(RegistryCenterFactory.createCoordinatorRegistryCenter(connectString, namespace, digest));
}

/**
* 创建作业状态展示API对象.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http:https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/

package com.dangdang.ddframe.job.lite.lifecycle.api;

/**
* 操作分片的API.
*
* @author caohao
*/
public interface ShardingOperateAPI {

/**
* 分片禁用.
*
* <p>会重新分片.</p>
*
* @param jobName 作业名称
* @param sharding 分片项
*/
void disable(String jobName, String sharding);

/**
* 分片启用.
*
* @param jobName 作业名称
* @param sharding 分片项
*/
void enable(String jobName, String sharding);
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public int compareTo(final ShardingInfo o) {
*/
public enum ShardingStatus {

DISABLED,
RUNNING,
COMPLETED,
SHARDING_ERROR,
Expand All @@ -61,11 +62,16 @@ public enum ShardingStatus {
/**
* 获取分片状态.
*
* @param isDisabled 是否被禁用
* @param isRunning 是否在运行
* @param isCompleted 是否运行完毕
* @param isShardingError 是否分片错误
* @return 作业运行时状态
*/
public static ShardingStatus getShardingStatus(final boolean isRunning, final boolean isCompleted, final boolean isShardingError) {
public static ShardingStatus getShardingStatus(final boolean isDisabled, final boolean isRunning, final boolean isCompleted, final boolean isShardingError) {
if (isDisabled) {
return DISABLED;
}
if (isRunning) {
return RUNNING;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http:https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/

package com.dangdang.ddframe.job.lite.lifecycle.internal.operate;

import com.dangdang.ddframe.job.lite.internal.storage.JobNodePath;
import com.dangdang.ddframe.job.lite.lifecycle.api.ShardingOperateAPI;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;

/**
* 操作分片的实现类.
*
* @author caohao
*/
public final class ShardingOperateAPIImpl implements ShardingOperateAPI {

private final CoordinatorRegistryCenter regCenter;

public ShardingOperateAPIImpl(final CoordinatorRegistryCenter regCenter) {
this.regCenter = regCenter;
}

@Override
public void disable(final String jobName, final String item) {
disableOrEnableJobs(jobName, item, true);
}

@Override
public void enable(final String jobName, final String item) {
disableOrEnableJobs(jobName, item, false);
}

private void disableOrEnableJobs(final String jobName, final String item, final boolean disabled) {
JobNodePath jobNodePath = new JobNodePath(jobName);
String shardingDisabledNodePath = jobNodePath.getShardingNodePath(item, "disabled");
if (disabled) {
regCenter.persist(shardingDisabledNodePath, "");
} else {
regCenter.remove(shardingDisabledNodePath);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,11 @@ private ShardingInfo getShardingInfo(final String jobName, final String item) {
result.setItem(Integer.parseInt(item));
JobNodePath jobNodePath = new JobNodePath(jobName);
String instanceId = regCenter.get(jobNodePath.getShardingNodePath(item, "instance"));
boolean disabled = regCenter.isExisted(jobNodePath.getShardingNodePath(item, "disabled"));
boolean running = regCenter.isExisted(jobNodePath.getShardingNodePath(item, "running"));
boolean completed = regCenter.isExisted(jobNodePath.getShardingNodePath(item, "completed"));
boolean shardingError = !regCenter.isExisted(jobNodePath.getInstanceNodePath(instanceId));
result.setStatus(ShardingStatus.getShardingStatus(running, completed, shardingError));
result.setStatus(ShardingStatus.getShardingStatus(disabled, running, completed, shardingError));
result.setFailover(regCenter.isExisted(jobNodePath.getShardingNodePath(item, "failover")));
if (null != instanceId) {
result.setServerIp(instanceId.split("@-@")[0]);
Expand Down
Loading

0 comments on commit 6df017d

Please sign in to comment.