in uReplicator-Manager/src/main/java/com/uber/stream/kafka/mirrormaker/manager/rest/resources/AdminRestletResource.java [84:162]
public Representation post(Representation entity) {
// TODO: separate manager and controller operation
final String opt = (String) getRequest().getAttributes().get("opt");
JSONObject responseJson = new JSONObject();
responseJson.put("opt", opt);
if ("disable_autoscaling".equalsIgnoreCase(opt)) {
_helixMirrorMakerManager.disableAutoScaling();
LOGGER.info("Disabled autoscaling!");
responseJson.put("autoscaling_status", _helixMirrorMakerManager.isAutoScalingEnabled());
} else if ("enable_autoscaling".equalsIgnoreCase(opt)) {
_helixMirrorMakerManager.enableAutoScaling();
LOGGER.info("Enabled autoscaling!");
responseJson.put("autoscaling_status", _helixMirrorMakerManager.isAutoScalingEnabled());
} else if ("disable_autobalancing".equalsIgnoreCase(opt)) {
_helixMirrorMakerManager.disableAutoBalancing();
LOGGER.info("Disabled autobalancing!");
responseJson.put("autobalancing_status", _helixMirrorMakerManager.isAutoBalancingEnabled());
} else if ("enable_autobalancing".equalsIgnoreCase(opt)) {
_helixMirrorMakerManager.enableAutoBalancing();
LOGGER.info("Enabled autobalancing!");
responseJson.put("autobalancing_status", _helixMirrorMakerManager.isAutoBalancingEnabled());
} else if ("controller_autobalancing".equalsIgnoreCase(opt)) {
Form queryParams = getRequest().getResourceRef().getQueryAsForm();
String srcCluster = ENABLE_PER_ROUTE_CHANGE ? queryParams.getFirstValue("srcCluster", true) : "";
String dstCluster = ENABLE_PER_ROUTE_CHANGE ? queryParams.getFirstValue("dstCluster", true) : "";
String enabledStr = queryParams.getFirstValue("enabled", true);
if (Strings.isNullOrEmpty(enabledStr) || (Strings.isNullOrEmpty(srcCluster) != Strings.isNullOrEmpty(dstCluster))) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
responseJson.put("status", Status.CLIENT_ERROR_BAD_REQUEST.getCode());
responseJson.put("message", String.format("invalid operation"));
return new StringRepresentation(responseJson.toJSONString());
} else {
return new StringRepresentation(setControllerAutobalancing(srcCluster, dstCluster, enabledStr).toJSONString());
}
} else if ("force_rebalance".equalsIgnoreCase(opt) || "manual_rebalance".equalsIgnoreCase(opt)) {
try {
boolean force = "force_rebalance".equalsIgnoreCase(opt);
_helixMirrorMakerManager.handleLiveInstanceChange(false, force);
responseJson.put("status", Status.SUCCESS_OK.getCode());
return new StringRepresentation(responseJson.toJSONString());
} catch (Exception e) {
LOGGER.error("manual re-balance failed due to exception: {}", e, e);
responseJson.put("status", Status.SERVER_ERROR_INTERNAL.getCode());
responseJson
.put("message", String.format("manual re-balance failed due to exception: %s", e));
getResponse().setStatus(Status.SERVER_ERROR_INTERNAL);
}
} else if ("worker_number_override".equalsIgnoreCase(opt)) {
Form queryParams = getRequest().getResourceRef().getQueryAsForm();
String routeString = queryParams.getFirstValue("route", true);
String workerNum = queryParams.getFirstValue("workerNumber", true);
Integer workerCount = Integer.parseInt(workerNum);
boolean validRoute = false;
String example = "";
for (String pipeline : _helixMirrorMakerManager.getPipelineToInstanceMap().keySet()) {
for (InstanceTopicPartitionHolder itph : _helixMirrorMakerManager.getPipelineToInstanceMap().get(pipeline)) {
if (itph.getRouteString().equalsIgnoreCase(routeString)) {
validRoute = true;
}
if (StringUtils.isEmpty(example)) {
example = itph.getRouteString();
}
}
}
if (validRoute) {
_helixMirrorMakerManager.updateRouteWorkerOverride(routeString, workerCount);
responseJson.put("worker_number_override", _helixMirrorMakerManager.getRouteWorkerOverride());
} else {
return new StringRepresentation("invalid route string, route sample: " + example);
}
} else {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
responseJson.put("status", Status.CLIENT_ERROR_BAD_REQUEST.getCode());
responseJson.put("message", String.format("invalid operation"));
}
return new StringRepresentation(responseJson.toJSONString());
}