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