private Route postJobsRoute()

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);

                })
        );
    }