All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hubspot.singularity.resources.PriorityResource Maven / Gradle / Ivy

package com.hubspot.singularity.resources;

import static com.hubspot.singularity.WebExceptions.checkBadRequest;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.hubspot.singularity.SingularityDeleteResult;
import com.hubspot.singularity.SingularityPriorityFreezeParent;
import com.hubspot.singularity.SingularityUser;
import com.hubspot.singularity.api.SingularityPriorityFreeze;
import com.hubspot.singularity.auth.SingularityAuthorizationHelper;
import com.hubspot.singularity.config.ApiPaths;
import com.hubspot.singularity.data.PriorityManager;
import com.hubspot.singularity.data.SingularityValidator;

import io.dropwizard.auth.Auth;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.tags.Tags;

@Path(ApiPaths.PRIORITY_RESOURCE_PATH)
@Produces({MediaType.APPLICATION_JSON})
@Schema(title = "Manages whether or not to schedule tasks based on their priority levels")
@Tags({@Tag(name = "Task Priorities")})
public class PriorityResource {
  private final SingularityAuthorizationHelper authorizationHelper;
  private final SingularityValidator singularityValidator;
  private final PriorityManager priorityManager;

  @Inject
  public PriorityResource(SingularityAuthorizationHelper authorizationHelper, SingularityValidator singularityValidator, PriorityManager priorityManager) {
    this.authorizationHelper = authorizationHelper;
    this.singularityValidator = singularityValidator;
    this.priorityManager = priorityManager;
  }

  @GET
  @Path("/freeze")
  @Operation(
      summary = "Get information about the active priority freeze",
      responses = {
          @ApiResponse(responseCode = "200", description = "The active priority freeze"),
          @ApiResponse(responseCode = "404", description = "There was no active priority freeze")
      }
  )
  public Optional getActivePriorityFreeze(@Parameter(hidden = true) @Auth SingularityUser user) {
    authorizationHelper.checkAdminAuthorization(user);
    return priorityManager.getActivePriorityFreeze();
  }

  @DELETE
  @Path("/freeze")
  @Operation(
      summary = "Stops the active priority freeze",
      responses = {
          @ApiResponse(responseCode = "202", description = "The active priority freeze was deleted"),
          @ApiResponse(responseCode = "400", description = "There was no active priority freeze to delete")
      }
  )
  public void deleteActivePriorityFreeze(@Parameter(hidden = true) @Auth SingularityUser user) {
    authorizationHelper.checkAdminAuthorization(user);

    final SingularityDeleteResult deleteResult = priorityManager.deleteActivePriorityFreeze();

    checkBadRequest(deleteResult == SingularityDeleteResult.DELETED, "No active priority freeze to delete.");

    priorityManager.clearPriorityKill();
  }

  @POST
  @Path("/freeze")
  @Operation(
      summary = "Stop scheduling tasks below a certain priority level",
      responses = {
          @ApiResponse(responseCode = "200", description = "The priority freeze request was accepted"),
          @ApiResponse(responseCode = "400", description = "There was a validation error with the priority freeze request")
      }
  )
  public SingularityPriorityFreezeParent createPriorityFreeze(
      @Parameter(hidden = true) @Auth SingularityUser user,
      @RequestBody(description = "the new priority freeze to create") SingularityPriorityFreeze priorityFreezeRequest) {
    authorizationHelper.checkAdminAuthorization(user);
    priorityFreezeRequest = singularityValidator.checkSingularityPriorityFreeze(priorityFreezeRequest);

    final SingularityPriorityFreezeParent priorityFreezeRequestParent = new SingularityPriorityFreezeParent(priorityFreezeRequest, System.currentTimeMillis(), user.getEmail());

    priorityManager.createPriorityFreeze(priorityFreezeRequestParent);

    if (priorityFreezeRequest.isKillTasks()) {
      priorityManager.setPriorityKill();
    }

    return priorityFreezeRequestParent;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy