@POST
  @Consumes({MediaType.APPLICATION_JSON})
  @ApiOperation(
      value = "Create or update a Singularity Request",
      response = SingularityRequestParent.class)
  @ApiResponses({
    @ApiResponse(code = 400, message = "Request object is invalid"),
    @ApiResponse(code = 409, message = "Request object is being cleaned. Try again shortly"),
  })
  public SingularityRequestParent submit(
      @ApiParam("The Singularity request to create or update") SingularityRequest request,
      @ApiParam("Username of the person requesting to create or update") @QueryParam("user")
          Optional<String> user) {
    checkNotNullBadRequest(request.getId(), "Request must have an id");
    checkConflict(
        !requestManager.cleanupRequestExists(request.getId()),
        "Request %s is currently cleaning. Try again after a few moments",
        request.getId());

    Optional<SingularityRequestWithState> maybeOldRequestWithState =
        requestManager.getRequest(request.getId());
    Optional<SingularityRequest> maybeOldRequest =
        maybeOldRequestWithState.isPresent()
            ? Optional.of(maybeOldRequestWithState.get().getRequest())
            : Optional.<SingularityRequest>absent();

    SingularityRequestDeployHolder deployHolder = getDeployHolder(request.getId());

    SingularityRequest newRequest =
        validator.checkSingularityRequest(
            request,
            maybeOldRequest,
            deployHolder.getActiveDeploy(),
            deployHolder.getPendingDeploy());

    checkConflict(
        maybeOldRequest.isPresent() || !requestManager.cleanupRequestExists(request.getId()),
        "Request %s is currently cleaning. Try again after a few moments",
        request.getId());

    final long now = System.currentTimeMillis();

    requestManager.activate(
        newRequest,
        maybeOldRequest.isPresent() ? RequestHistoryType.UPDATED : RequestHistoryType.CREATED,
        now,
        user);

    checkReschedule(newRequest, maybeOldRequest, now);

    return fillEntireRequest(fetchRequestWithState(request.getId()));
  }
  @PUT
  @Path("/request/{requestId}/instances")
  @ApiOperation(
      value = "Scale the number of instances up or down for a specific Request",
      response = SingularityRequest.class)
  @ApiResponses({
    @ApiResponse(code = 400, message = "Posted object did not match Request ID"),
    @ApiResponse(code = 404, message = "No Request with that ID"),
  })
  public SingularityRequest updateInstances(
      @ApiParam("The Request ID to scale") @PathParam("requestId") String requestId,
      @ApiParam("Username of the person requesting the scale") @QueryParam("user")
          Optional<String> user,
      @ApiParam("Object to hold number of instances to request")
          SingularityRequestInstances newInstances) {

    checkBadRequest(
        requestId != null && newInstances.getId() != null && requestId.equals(newInstances.getId()),
        "Update for request instance must pass a matching non-null requestId in path (%s) and object (%s)",
        requestId,
        newInstances.getId());
    checkConflict(
        !requestManager.cleanupRequestExists(requestId),
        "Request %s is currently cleaning. Try again after a few moments",
        requestId);

    SingularityRequest oldRequest = fetchRequest(requestId);
    Optional<SingularityRequest> maybeOldRequest = Optional.of(oldRequest);

    SingularityRequestDeployHolder deployHolder = getDeployHolder(newInstances.getId());
    SingularityRequest newRequest =
        oldRequest.toBuilder().setInstances(newInstances.getInstances()).build();

    validator.checkSingularityRequest(
        newRequest,
        maybeOldRequest,
        deployHolder.getActiveDeploy(),
        deployHolder.getPendingDeploy());

    final long now = System.currentTimeMillis();

    requestManager.update(newRequest, now, user);

    checkReschedule(newRequest, maybeOldRequest, now);

    return newRequest;
  }