in mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/master/api/akka/route/v1/JobsRoute.java [271:359]
private Route postJobsRoute(Optional<String> clusterName) {
return decodeRequest(() -> entity(
Jackson.unmarshaller(MantisJobDefinition.class),
submitJobRequest -> {
String endpoint;
if (clusterName.isPresent()) {
logger.info(
"POST /api/v1/jobClusters/{}/jobs called {}",
clusterName);
endpoint = HttpRequestMetrics.Endpoints.JOB_CLUSTER_INSTANCE_JOBS;
} else {
logger.info(
"POST /api/v1/jobs called {}",
submitJobRequest);
endpoint = HttpRequestMetrics.Endpoints.JOBS;
}
CompletionStage<JobClusterManagerProto.SubmitJobResponse> response = null;
try {
// validate request
submitJobRequest.validate(true);
Pair<Boolean, String> validationResult = validateSubmitJobRequest(
submitJobRequest,
clusterName);
if (!validationResult.first()) {
CompletableFuture<JobClusterManagerProto.SubmitJobResponse> resp = new CompletableFuture<>();
resp.complete(
new JobClusterManagerProto.SubmitJobResponse(
-1,
BaseResponse.ResponseCode.CLIENT_ERROR,
validationResult.second(),
Optional.empty()));
response = resp;
} else {
response = clusterRouteHandler.submit(
JobClusterProtoAdapter.toSubmitJobClusterRequest(
submitJobRequest));
}
} catch (Exception e) {
logger.warn("exception in submit job request {}", submitJobRequest, e);
CompletableFuture<JobClusterManagerProto.SubmitJobResponse> resp = new CompletableFuture<>();
resp.complete(
new JobClusterManagerProto.SubmitJobResponse(
-1,
BaseResponse.ResponseCode.SERVER_ERROR,
e.getMessage(),
Optional.empty()));
response = resp;
}
CompletionStage<JobClusterManagerProto.GetJobDetailsResponse> r = response.thenCompose(
t -> {
if (t.responseCode.getValue() >= 200 &&
t.responseCode.getValue() < 300) {
final JobClusterManagerProto.GetJobDetailsRequest request =
new JobClusterManagerProto.GetJobDetailsRequest(
submitJobRequest.getUser(),
t.getJobId().get());
return jobRouteHandler.getJobDetails(request);
} else {
CompletableFuture<JobClusterManagerProto.GetJobDetailsResponse> responseCompletableFuture =
new CompletableFuture<>();
responseCompletableFuture.complete(
new JobClusterManagerProto.GetJobDetailsResponse(
t.requestId,
t.responseCode,
t.message,
Optional.empty()));
return responseCompletableFuture;
}
});
return completeAsync(
r,
resp -> complete(
StatusCodes.CREATED,
resp.getJobMetadata().map(metaData -> new MantisJobMetadataView(metaData, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), false)),
Jackson.marshaller()),
endpoint,
HttpRequestMetrics.HttpVerb.POST);
})
);
}