[ https://issues.apache.org/jira/browse/FLINK-7072?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16192740#comment-16192740 ]
ASF GitHub Bot commented on FLINK-7072: --------------------------------------- Github user tillrohrmann commented on a diff in the pull request: https://github.com/apache/flink/pull/4742#discussion_r142900393 --- Diff: flink-clients/src/test/java/org/apache/flink/client/program/rest/RestClusterClientTest.java --- @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.client.program.rest; + +import org.apache.flink.api.common.JobID; +import org.apache.flink.api.common.time.Time; +import org.apache.flink.api.java.tuple.Tuple2; +import org.apache.flink.configuration.Configuration; +import org.apache.flink.configuration.JobManagerOptions; +import org.apache.flink.runtime.dispatcher.Dispatcher; +import org.apache.flink.runtime.dispatcher.DispatcherGateway; +import org.apache.flink.runtime.jobgraph.JobGraph; +import org.apache.flink.runtime.rest.RestServerEndpoint; +import org.apache.flink.runtime.rest.RestServerEndpointConfiguration; +import org.apache.flink.runtime.rest.handler.AbstractRestHandler; +import org.apache.flink.runtime.rest.handler.HandlerRequest; +import org.apache.flink.runtime.rest.handler.RestHandlerException; +import org.apache.flink.runtime.rest.handler.RestHandlerSpecification; +import org.apache.flink.runtime.rest.messages.BlobServerPortHeaders; +import org.apache.flink.runtime.rest.messages.BlobServerPortResponseBody; +import org.apache.flink.runtime.rest.messages.EmptyMessageParameters; +import org.apache.flink.runtime.rest.messages.EmptyRequestBody; +import org.apache.flink.runtime.rest.messages.EmptyResponseBody; +import org.apache.flink.runtime.rest.messages.JobTerminationHeaders; +import org.apache.flink.runtime.rest.messages.JobTerminationMessageParameters; +import org.apache.flink.runtime.rest.messages.TerminationModeQueryParameter; +import org.apache.flink.runtime.rest.messages.job.JobSubmitHeaders; +import org.apache.flink.runtime.rest.messages.job.JobSubmitRequestBody; +import org.apache.flink.runtime.rest.messages.job.JobSubmitResponseBody; +import org.apache.flink.runtime.rpc.RpcUtils; +import org.apache.flink.runtime.webmonitor.retriever.GatewayRetriever; +import org.apache.flink.util.TestLogger; + +import org.apache.flink.shaded.netty4.io.netty.channel.ChannelInboundHandler; + +import org.junit.Assert; +import org.junit.Test; + +import javax.annotation.Nonnull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Tests for the {@link RestClusterClient}. + */ +public class RestClusterClientTest extends TestLogger { + + private static final String restAddress = "http://localhost:1234"; + private static final Dispatcher mockRestfulGateway = mock(Dispatcher.class); + private static final GatewayRetriever<DispatcherGateway> mockGatewayRetriever = mock(GatewayRetriever.class); + + static { + when(mockRestfulGateway.requestRestAddress(any(Time.class))).thenReturn(CompletableFuture.completedFuture(restAddress)); + when(mockGatewayRetriever.getNow()).thenReturn(Optional.of(mockRestfulGateway)); + } + + @Test + public void testABC() throws Exception { + + Configuration config = new Configuration(); + config.setString(JobManagerOptions.ADDRESS, "localhost"); + + RestServerEndpointConfiguration rsec = RestServerEndpointConfiguration.fromConfiguration(config); + + TestBlobServerPortHandler portHandler = new TestBlobServerPortHandler(); + TestJobSubmitHandler submitHandler = new TestJobSubmitHandler(); + TestJobTerminationHandler terminationHandler = new TestJobTerminationHandler(); + + RestServerEndpoint rse = new RestServerEndpoint(rsec) { + @Override + protected Collection<Tuple2<RestHandlerSpecification, ChannelInboundHandler>> initializeHandlers(CompletableFuture<String> restAddressFuture) { + + Collection<Tuple2<RestHandlerSpecification, ChannelInboundHandler>> handlers = new ArrayList<>(); + handlers.add(Tuple2.of(portHandler.getMessageHeaders(), portHandler)); + handlers.add(Tuple2.of(submitHandler.getMessageHeaders(), submitHandler)); + handlers.add(Tuple2.of(terminationHandler.getMessageHeaders(), terminationHandler)); + return handlers; + } + }; + + RestClusterClient rcc = new RestClusterClient(config); + try { + rse.start(); + + JobGraph job = new JobGraph("testjob"); + JobID id = job.getJobID(); + + Assert.assertFalse(portHandler.portRetrieved); + Assert.assertFalse(submitHandler.jobSubmitted); + rcc.submitJob(job, ClassLoader.getSystemClassLoader()); + Assert.assertTrue(portHandler.portRetrieved); + Assert.assertTrue(submitHandler.jobSubmitted); + + Assert.assertFalse(terminationHandler.jobCanceled); + rcc.cancel(id); + Assert.assertTrue(terminationHandler.jobCanceled); + + Assert.assertFalse(terminationHandler.jobStopped); + rcc.stop(id); + Assert.assertTrue(terminationHandler.jobStopped); + + } finally { + rcc.shutdown(); + rse.shutdown(Time.seconds(5)); + } + } + + private static class TestBlobServerPortHandler extends AbstractRestHandler<DispatcherGateway, EmptyRequestBody, BlobServerPortResponseBody, EmptyMessageParameters> { + private boolean portRetrieved = false; + + private TestBlobServerPortHandler() { + super( + CompletableFuture.completedFuture(restAddress), + mockGatewayRetriever, + RpcUtils.INF_TIMEOUT, + BlobServerPortHeaders.getInstance()); + } + + @Override + protected CompletableFuture<BlobServerPortResponseBody> handleRequest(@Nonnull HandlerRequest<EmptyRequestBody, EmptyMessageParameters> request, @Nonnull DispatcherGateway gateway) throws RestHandlerException { + portRetrieved = true; + return CompletableFuture.completedFuture(new BlobServerPortResponseBody(12000)); + } + } + + private static class TestJobSubmitHandler extends AbstractRestHandler<DispatcherGateway, JobSubmitRequestBody, JobSubmitResponseBody, EmptyMessageParameters> { + private boolean jobSubmitted = false; --- End diff -- `volatile` > Create RESTful cluster endpoint > ------------------------------- > > Key: FLINK-7072 > URL: https://issues.apache.org/jira/browse/FLINK-7072 > Project: Flink > Issue Type: Sub-task > Components: Distributed Coordination > Reporter: Till Rohrmann > Assignee: Chesnay Schepler > Labels: flip-6 > Fix For: 1.4.0 > > > In order to communicate with the cluster from the RESTful client, we have to > implement a RESTful cluster endpoint. The endpoint shall support the > following operations: > * List jobs (GET): Get list of all running jobs on the cluster > * Submit job (POST): Submit a job to the cluster (only supported in session > mode) > * Get job status (GET): Get the status of an executed job (and maybe the > JobExecutionResult) > * Lookup job leader (GET): Gets the JM leader for the given job > This endpoint will run in session mode alongside the dispatcher/session > runner and forward calls to this component which maintains a view on all > currently executed jobs. > In the per-job mode, the endpoint will return only the single running job and > the address of the JobManager alongside which it is running. Furthermore, it > won't accept job submissions. -- This message was sent by Atlassian JIRA (v6.4.14#64029)