,
+ U extends MessageParameters,
+ R extends RequestBody,
+ P extends ResponseBody>
+ CompletableFuture sendRequest(M h, U p, R r) {
+ if (h instanceof JobManagerJobConfigurationHeaders) {
+ if (configurationsOrException.isRight()) {
+ return CompletableFuture.failedFuture(
+ configurationsOrException.right());
+ }
+ var jobID = ((JobMessageParameters) p).jobPathParameter.getValue();
+ return (CompletableFuture
)
+ CompletableFuture.completedFuture(
+ configurationsOrException.left().get(jobID));
+ } else if (h instanceof JobsOverviewHeaders) {
+ if (jobsOrException.isLeft()) {
+ return (CompletableFuture
)
+ CompletableFuture.completedFuture(
+ new MultipleJobsDetails(
+ jobsOrException.left().entrySet().stream()
+ .map(
+ entry ->
+ generateJobDetails(
+ entry
+ .getKey(),
+ entry
+ .getValue()))
+ .collect(Collectors.toList())));
+ }
+ return CompletableFuture.failedFuture(jobsOrException.right());
+ }
+ fail("Unknown request");
+ return null;
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ closeCounter.incrementAndGet();
+ }
+ };
+ }
+
+ /**
+ * @param jobs When the jobs overview is called, return jobList if it's not null, don't complete
+ * future if it's null.
+ * @param configuration When fetch job conf, return configuration if it's not null, don't
+ * complete future if it's null.
+ * @param closeFuture Complete this closeFuture when {@link RestClusterClient#close} is called.
+ */
+ private static FunctionWithException, Exception>
+ getTimeoutableRestClusterClient(
+ @Nullable Map jobs,
+ @Nullable ConfigurationInfo configuration,
+ CompletableFuture closeFuture) {
+ return conf ->
+ new RestClusterClient<>(
+ conf,
+ "test-cluster",
+ (c, e) -> new StandaloneClientHAServices("localhost")) {
+
+ @Override
+ public <
+ M extends MessageHeaders,
+ U extends MessageParameters,
+ R extends RequestBody,
+ P extends ResponseBody>
+ CompletableFuture sendRequest(M h, U p, R r) {
+ if (h instanceof JobManagerJobConfigurationHeaders) {
+ if (configuration == null) {
+ return new CompletableFuture<>();
+ }
+ return (CompletableFuture
)
+ CompletableFuture.completedFuture(configuration);
+ } else if (h instanceof JobsOverviewHeaders) {
+ if (jobs == null) {
+ return new CompletableFuture<>();
+ }
+ return (CompletableFuture
)
+ CompletableFuture.completedFuture(
+ new MultipleJobsDetails(
+ jobs.entrySet().stream()
+ .map(
+ entry ->
+ generateJobDetails(
+ entry.getKey(),
+ entry
+ .getValue()))
+ .collect(Collectors.toList())));
+ }
+ fail("Unknown request");
+ return null;
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ closeFuture.complete(null);
+ }
+ };
+ }
+
+ private static JobDetails generateJobDetails(JobID jobID, JobStatus jobStatus) {
+ int[] countPerState = new int[ExecutionState.values().length];
+ if (jobStatus == JobStatus.RUNNING) {
+ countPerState[ExecutionState.RUNNING.ordinal()] = 5;
+ countPerState[ExecutionState.FINISHED.ordinal()] = 2;
+ } else if (jobStatus == JobStatus.CANCELLING) {
+ countPerState[ExecutionState.CANCELING.ordinal()] = 7;
+ }
+ int numTasks = Arrays.stream(countPerState).sum();
+ return new JobDetails(
+ jobID,
+ "test-job",
+ System.currentTimeMillis(),
+ -1,
+ 0,
+ jobStatus,
+ System.currentTimeMillis(),
+ countPerState,
+ numTasks);
+ }
+}