public Response updateInstance()

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();
  }