Search in sources :

Example 31 with Hidden

use of io.swagger.v3.oas.annotations.Hidden in project Singularity by HubSpot.

the class HistoryResource method getRecentCommandLineArgs.

@GET
@Path("/request/{requestId}/command-line-args")
@Operation(summary = "Get a list of recently used command line args for an on-demand or scheduled request")
public Set<List<String>> getRecentCommandLineArgs(@Parameter(hidden = true) @Auth SingularityUser user, @Parameter(required = true, description = "Request ID to look up") @PathParam("requestId") String requestId, @Parameter(description = "Max number of recent args to return") @QueryParam("count") Optional<Integer> count, @Parameter(description = "Skip checking zookeeper, items that have not been persisted yet may not appear") @QueryParam("skipZk") @DefaultValue("true") boolean skipZk) {
    authorizationHelper.checkForAuthorizationByRequestId(requestId, user, SingularityAuthorizationScope.READ);
    final int argCount = count.orElse(DEFAULT_ARGS_HISTORY_COUNT);
    List<SingularityTaskIdHistory> historiesToCheck = taskHistoryHelper.getBlendedHistory(new SingularityTaskHistoryQuery(Optional.of(requestId), Optional.<String>empty(), Optional.<String>empty(), Optional.<String>empty(), Optional.<ExtendedTaskState>empty(), Optional.<Long>empty(), Optional.<Long>empty(), Optional.<Long>empty(), Optional.<Long>empty(), Optional.<OrderDirection>empty()), 0, argCount, skipZk);
    Collections.sort(historiesToCheck);
    Set<List<String>> args = new HashSet<>();
    for (SingularityTaskIdHistory taskIdHistory : historiesToCheck) {
        Optional<SingularityTask> maybeTask = taskHistoryHelper.getTask(taskIdHistory.getTaskId());
        if (maybeTask.isPresent() && maybeTask.get().getTaskRequest().getPendingTask().getCmdLineArgsList().isPresent()) {
            List<String> taskArgs = maybeTask.get().getTaskRequest().getPendingTask().getCmdLineArgsList().get();
            if (!taskArgs.isEmpty()) {
                args.add(maybeTask.get().getTaskRequest().getPendingTask().getCmdLineArgsList().get());
            }
        }
    }
    return args;
}
Also used : ExtendedTaskState(com.hubspot.singularity.ExtendedTaskState) SingularityTask(com.hubspot.singularity.SingularityTask) SingularityTaskHistoryQuery(com.hubspot.singularity.SingularityTaskHistoryQuery) List(java.util.List) SingularityTaskIdHistory(com.hubspot.singularity.SingularityTaskIdHistory) OrderDirection(com.hubspot.singularity.OrderDirection) HashSet(java.util.HashSet) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET) Operation(io.swagger.v3.oas.annotations.Operation)

Example 32 with Hidden

use of io.swagger.v3.oas.annotations.Hidden in project Singularity by HubSpot.

the class RequestResource method checkAuthForGroupsUpdate.

@POST
@Path("/request/{requestId}/groups/auth-check")
@Operation(summary = "Check authorization for updating the group, readOnlyGroups, and readWriteGroups for a SingularityRequest, without committing the change", responses = { @ApiResponse(responseCode = "400", description = "Request object is invalid"), @ApiResponse(responseCode = "401", description = "User is not authorized to make these updates") })
public Response checkAuthForGroupsUpdate(@Parameter(hidden = true) @Auth SingularityUser user, @Parameter(required = true, description = "The id of the request to update") @PathParam("requestId") String requestId, @RequestBody(required = true, description = "Updated group settings") SingularityUpdateGroupsRequest updateGroupsRequest) {
    Optional<SingularityRequestWithState> maybeOldRequestWithState = requestManager.getRequest(requestId, false);
    if (!maybeOldRequestWithState.isPresent()) {
        // check against dummy request with same groups if none present in zk
        authorizationHelper.checkForAuthorization(new SingularityRequestBuilder(requestId, RequestType.WORKER).setGroup(updateGroupsRequest.getGroup()).setReadWriteGroups(Optional.of(updateGroupsRequest.getReadWriteGroups())).setReadOnlyGroups(Optional.of(updateGroupsRequest.getReadOnlyGroups())).setActionPermissions(updateGroupsRequest.getActionPermissions()).build(), user, SingularityAuthorizationScope.WRITE);
        return Response.ok().build();
    }
    SingularityRequestWithState oldRequestWithState = maybeOldRequestWithState.get();
    authorizationHelper.checkForAuthorization(oldRequestWithState.getRequest(), user, SingularityAuthorizationScope.WRITE);
    SingularityRequest newRequest = oldRequestWithState.getRequest().toBuilder().setGroup(updateGroupsRequest.getGroup()).setReadWriteGroups(Optional.of(updateGroupsRequest.getReadWriteGroups())).setReadOnlyGroups(Optional.of(updateGroupsRequest.getReadOnlyGroups())).setActionPermissions(updateGroupsRequest.getActionPermissions()).build();
    authorizationHelper.checkForAuthorizedChanges(newRequest, oldRequestWithState.getRequest(), user);
    return Response.ok().build();
}
Also used : SingularityRequestBuilder(com.hubspot.singularity.SingularityRequestBuilder) SingularityRequestWithState(com.hubspot.singularity.SingularityRequestWithState) SingularityRequest(com.hubspot.singularity.SingularityRequest) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Operation(io.swagger.v3.oas.annotations.Operation)

Example 33 with Hidden

use of io.swagger.v3.oas.annotations.Hidden in project Singularity by HubSpot.

the class RequestResource method getTaskByRunId.

@GET
@Path("/request/{requestId}/run/{runId}")
@Operation(summary = "Retrieve an active task by runId", responses = { @ApiResponse(responseCode = "404", description = "A task with the specified runID was not found") })
public Optional<SingularityTaskId> getTaskByRunId(@Parameter(hidden = true) @Auth SingularityUser user, @Parameter(required = true, description = "Id of the request") @PathParam("requestId") String requestId, @Parameter(required = true, description = "Run id to search for") @PathParam("runId") String runId) {
    SingularityRequestWithState requestWithState = fetchRequestWithState(requestId, user);
    authorizationHelper.checkForAuthorization(requestWithState.getRequest(), user, SingularityAuthorizationScope.READ);
    return taskManager.getTaskByRunId(requestId, runId);
}
Also used : SingularityRequestWithState(com.hubspot.singularity.SingularityRequestWithState) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET) Operation(io.swagger.v3.oas.annotations.Operation)

Example 34 with Hidden

use of io.swagger.v3.oas.annotations.Hidden in project Singularity by HubSpot.

the class S3LogResource method getS3LogsForTask.

@GET
@Path("/task/{taskId}")
@Operation(summary = "Retrieve the list of logs stored in S3 for a specific task", responses = { @ApiResponse(responseCode = "200", description = "Returns a list of metadata about log files for the specified task", content = { @Content(array = @ArraySchema(schema = @Schema(implementation = SingularityS3LogMetadata.class))), @Content(array = @ArraySchema(schema = @Schema(implementation = SingularityS3Log.class))) }), @ApiResponse(responseCode = "404", description = "S3 configuration is not present") })
public List<SingularityS3LogMetadata> getS3LogsForTask(@Parameter(hidden = true) @Auth SingularityUser user, @Parameter(required = true, description = "The task ID to search for") @PathParam("taskId") String taskId, @Parameter(description = "Start timestamp (millis, 13 digit)") @QueryParam("start") Optional<Long> start, @Parameter(description = "End timestamp (mills, 13 digit)") @QueryParam("end") Optional<Long> end, @Parameter(description = "Exclude custom object metadata") @QueryParam("excludeMetadata") @DefaultValue("false") boolean excludeMetadata, @Parameter(description = "Do not generate download/get urls, only list the files and metadata") @QueryParam("list") @DefaultValue("false") boolean listOnly) throws Exception {
    checkS3();
    final SingularityS3SearchRequest search = new SingularityS3SearchRequest(Collections.emptyMap(), Collections.singletonList(taskId), start, end, excludeMetadata, listOnly, Optional.empty(), Collections.emptyMap());
    try {
        return getS3Logs(configuration.get(), getServiceToPrefixes(search, user), search, false).getResults();
    } catch (TimeoutException te) {
        throw timeout("Timed out waiting for response from S3 for %s", taskId);
    } catch (Throwable t) {
        throw new RuntimeException(t);
    }
}
Also used : SingularityS3SearchRequest(com.hubspot.singularity.api.SingularityS3SearchRequest) TimeoutException(java.util.concurrent.TimeoutException) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET) Operation(io.swagger.v3.oas.annotations.Operation)

Example 35 with Hidden

use of io.swagger.v3.oas.annotations.Hidden in project Singularity by HubSpot.

the class RequestResource method scheduleImmediately.

@POST
@Path("/request/{requestId}/run")
@Consumes({ MediaType.APPLICATION_JSON })
@Operation(summary = "Schedule a one-off or scheduled Singularity request for immediate or delayed execution", responses = { @ApiResponse(responseCode = "400", description = "Singularity Request is not scheduled or one-off") })
public SingularityPendingRequestParent scheduleImmediately(@Parameter(hidden = true) @Auth SingularityUser user, @Parameter(required = true, description = "The request ID to run") @PathParam("requestId") String requestId, @Parameter(hidden = true) @Context HttpServletRequest requestContext, @QueryParam("minimal") Boolean minimalReturn, @RequestBody(description = "Settings specific to this run of the request") SingularityRunNowRequest runNowRequest) {
    if (runNowRequest != null) {
        runNowRequest.getEnvOverrides().forEach((k, v) -> {
            checkBadRequest(!k.equals("STARTED_BY_USER") && !v.contains("STARTED_BY_USER"), "Cannot override STARTED_BY_USER in env");
        });
        checkBadRequest(!runNowRequest.getCommandLineArgs().isPresent() || runNowRequest.getCommandLineArgs().get().stream().noneMatch(arg -> arg.contains("STARTED_BY_USER")), "Cannot override STARTED_BY_USER");
        if (runNowRequest.getResources().isPresent()) {
            Optional<String> maybeDeployId = deployManager.getActiveDeployId(requestId);
            if (maybeDeployId.isPresent()) {
                Optional<SingularityDeploy> maybeDeploy = deployManager.getDeploy(requestId, maybeDeployId.get());
                if (maybeDeploy.isPresent() && maybeDeploy.get().getResources().isPresent()) {
                    int deployPorts = maybeDeploy.get().getResources().get().getNumPorts();
                    int runNowPorts = runNowRequest.getResources().get().getNumPorts();
                    checkBadRequest(deployPorts <= runNowPorts, "Number of ports in resource overrides must be >= the amount specified in the Singularity deploy (deploy: %d, runNowRequest: %d)", deployPorts, runNowPorts);
                }
            }
        }
    }
    long start = System.currentTimeMillis();
    SingularityPendingRequestParent response;
    if (configuration.isProxyRunNowToLeader()) {
        response = maybeProxyToLeader(requestContext, SingularityPendingRequestParent.class, runNowRequest, () -> scheduleImmediately(user, requestId, runNowRequest, Optional.ofNullable(minimalReturn).orElse(false)));
    } else {
        response = scheduleImmediately(user, requestId, runNowRequest, Optional.ofNullable(minimalReturn).orElse(false));
    }
    long duration = System.currentTimeMillis() - start;
    LOG.trace("Enqueue for {} took {}ms", requestId, duration);
    if (duration > 15000) {
        exceptionNotifier.notify(String.format("Slow enqueue for %s", requestId), ImmutableMap.of("leader", Boolean.toString(isLeader()), "duration", Long.toString(duration)));
    }
    return response;
}
Also used : SingularityPendingRequestParent(com.hubspot.singularity.SingularityPendingRequestParent) SingularityDeploy(com.hubspot.singularity.SingularityDeploy) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Operation(io.swagger.v3.oas.annotations.Operation)

Aggregations

Operation (io.swagger.v3.oas.annotations.Operation)29 Path (javax.ws.rs.Path)25 GET (javax.ws.rs.GET)21 POST (javax.ws.rs.POST)6 SingularityTaskHistoryQuery (com.hubspot.singularity.SingularityTaskHistoryQuery)5 SingularityTaskId (com.hubspot.singularity.SingularityTaskId)5 List (java.util.List)4 Consumes (javax.ws.rs.Consumes)4 Produces (javax.ws.rs.Produces)4 SingularityPaginatedResponse (com.hubspot.singularity.SingularityPaginatedResponse)3 SingularityRequestWithState (com.hubspot.singularity.SingularityRequestWithState)3 SingularityTaskIdHistory (com.hubspot.singularity.SingularityTaskIdHistory)3 Schema (io.swagger.v3.oas.models.media.Schema)3 BeanDescription (com.fasterxml.jackson.databind.BeanDescription)2 AnnotatedMethod (com.fasterxml.jackson.databind.introspect.AnnotatedMethod)2 SingularityTaskHistory (com.hubspot.singularity.SingularityTaskHistory)2 Hidden (io.swagger.v3.oas.annotations.Hidden)2 GenericOpenApiContext (io.swagger.v3.oas.integration.GenericOpenApiContext)2 OpenAPIConfiguration (io.swagger.v3.oas.integration.api.OpenAPIConfiguration)2 OpenApiContext (io.swagger.v3.oas.integration.api.OpenApiContext)2