in helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/PerInstanceAccessor.java [391:527]
public Response updateInstance(@PathParam("clusterId") String clusterId,
@PathParam("instanceName") String instanceName, @QueryParam("command") String command,
@QueryParam("instanceOperation") InstanceConstants.InstanceOperation instanceOperation,
@QueryParam("instanceOperationSource") InstanceConstants.InstanceOperationSource instanceOperationSource,
@QueryParam("reason") String reason,
@Deprecated @QueryParam("instanceDisabledType") String disabledType,
@Deprecated @QueryParam("instanceDisabledReason") String disabledReason,
@QueryParam("force") boolean force, String content) {
Command cmd;
try {
cmd = Command.valueOf(command);
} catch (Exception e) {
return badRequest("Invalid command : " + command);
}
HelixAdmin admin = getHelixAdmin();
try {
JsonNode node = null;
if (content.length() != 0) {
node = OBJECT_MAPPER.readTree(content);
}
switch (cmd) {
case enable:
admin.enableInstance(clusterId, instanceName, true);
break;
case disable:
InstanceConstants.InstanceDisabledType disabledTypeEnum = null;
if (disabledType != null) {
try {
disabledTypeEnum = InstanceConstants.InstanceDisabledType.valueOf(disabledType);
} catch (IllegalArgumentException ex) {
return badRequest("Invalid instanceDisabledType!");
}
}
admin.enableInstance(clusterId, instanceName, false, disabledTypeEnum, disabledReason);
break;
case reset:
case resetPartitions:
if (!validInstance(node, instanceName)) {
return badRequest("Instance names are not match!");
}
admin.resetPartition(clusterId, instanceName,
node.get(PerInstanceProperties.resource.name()).textValue(),
(List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.partitions.name()).toString(),
OBJECT_MAPPER.getTypeFactory()
.constructCollectionType(List.class, String.class)));
break;
case setPartitionsToError:
if (!validInstance(node, instanceName)) {
return badRequest("Instance names are not a match!");
}
admin.setPartitionsToError(clusterId, instanceName,
node.get(PerInstanceProperties.resource.name()).textValue(),
(List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.partitions.name()).toString(), OBJECT_MAPPER
.getTypeFactory().constructCollectionType(List.class, String.class)));
break;
case setInstanceOperation:
InstanceUtil.setInstanceOperation(new ConfigAccessor(getRealmAwareZkClient()),
new ZkBaseDataAccessor<>(getRealmAwareZkClient()), clusterId, instanceName,
new InstanceConfig.InstanceOperation.Builder().setOperation(instanceOperation)
.setReason(reason).setSource(
force ? InstanceConstants.InstanceOperationSource.ADMIN : instanceOperationSource)
.build());
break;
case canCompleteSwap:
return OK(OBJECT_MAPPER.writeValueAsString(
ImmutableMap.of("successful", admin.canCompleteSwap(clusterId, instanceName))));
case completeSwapIfPossible:
return OK(OBJECT_MAPPER.writeValueAsString(
ImmutableMap.of("successful", admin.completeSwapIfPossible(clusterId, instanceName, force))));
case addInstanceTag:
if (!validInstance(node, instanceName)) {
return badRequest("Instance names are not match!");
}
for (String tag : (List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.instanceTags.name()).toString(),
OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, String.class))) {
admin.addInstanceTag(clusterId, instanceName, tag);
}
break;
case removeInstanceTag:
if (!validInstance(node, instanceName)) {
return badRequest("Instance names are not match!");
}
for (String tag : (List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.instanceTags.name()).toString(),
OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, String.class))) {
admin.removeInstanceTag(clusterId, instanceName, tag);
}
break;
case enablePartitions:
admin.enablePartition(true, clusterId, instanceName,
node.get(PerInstanceProperties.resource.name()).textValue(),
(List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.partitions.name()).toString(),
OBJECT_MAPPER.getTypeFactory()
.constructCollectionType(List.class, String.class)));
break;
case disablePartitions:
admin.enablePartition(false, clusterId, instanceName,
node.get(PerInstanceProperties.resource.name()).textValue(),
(List<String>) OBJECT_MAPPER.readValue(
node.get(PerInstanceProperties.partitions.name()).toString(),
OBJECT_MAPPER.getTypeFactory()
.constructCollectionType(List.class, String.class)));
break;
case isEvacuateFinished:
boolean evacuateFinished;
try {
evacuateFinished = admin.isEvacuateFinished(clusterId, instanceName);
} catch (HelixException e) {
LOG.error(String.format("Encountered error when checking if evacuation finished for cluster: "
+ "{}, instance: {}", clusterId, instanceName), e);
return serverError(e);
}
return OK(OBJECT_MAPPER.writeValueAsString(ImmutableMap.of("successful", evacuateFinished)));
case forceKillInstance:
boolean instanceForceKilled = admin.forceKillInstance(clusterId, instanceName, reason, instanceOperationSource);
if (!instanceForceKilled) {
return serverError("Failed to forcefully kill instance: " + instanceName +
". Possible that instance was already stopped.");
}
return OK(OBJECT_MAPPER.writeValueAsString(ImmutableMap.of("successful", instanceForceKilled)));
default:
LOG.error("Unsupported command :" + command);
return badRequest("Unsupported command :" + command);
}
} catch (Exception e) {
LOG.error("Failed in updating instance : " + instanceName, e);
return badRequest(e.getMessage());
}
return OK();
}