use of org.apache.flink.runtime.rest.handler.router.Router in project flink by apache.
the class HistoryServerStaticFileServerHandlerTest method testRespondWithFile.
@Test
public void testRespondWithFile() throws Exception {
File webDir = tmp.newFolder("webDir");
Router router = new Router().addGet("/:*", new HistoryServerStaticFileServerHandler(webDir));
WebFrontendBootstrap webUI = new WebFrontendBootstrap(router, LoggerFactory.getLogger(HistoryServerStaticFileServerHandlerTest.class), tmp.newFolder("uploadDir"), null, "localhost", 0, new Configuration());
int port = webUI.getServerPort();
try {
// verify that 404 message is returned when requesting a non-existent file
Tuple2<Integer, String> notFound404 = HistoryServerTest.getFromHTTP("http://localhost:" + port + "/hello");
Assert.assertThat(notFound404.f0, is(404));
Assert.assertThat(notFound404.f1, containsString("not found"));
// verify that a) a file can be loaded using the ClassLoader and b) that the
// HistoryServer
// index_hs.html is injected
Tuple2<Integer, String> index = HistoryServerTest.getFromHTTP("http://localhost:" + port + "/index.html");
Assert.assertThat(index.f0, is(200));
Assert.assertThat(index.f1, containsString("Apache Flink Web Dashboard"));
// verify that index.html is appended if the request path ends on '/'
Tuple2<Integer, String> index2 = HistoryServerTest.getFromHTTP("http://localhost:" + port + "/");
Assert.assertEquals(index, index2);
// verify that a 405 message is returned when requesting a directory
File dir = new File(webDir, "dir.json");
dir.mkdirs();
Tuple2<Integer, String> dirNotFound = HistoryServerTest.getFromHTTP("http://localhost:" + port + "/dir");
Assert.assertThat(dirNotFound.f0, is(405));
Assert.assertThat(dirNotFound.f1, containsString("not found"));
// verify that a 403 message is returned when requesting a file outside the webDir
tmp.newFile("secret");
Tuple2<Integer, String> dirOutsideDirectory = HistoryServerTest.getFromHTTP("http://localhost:" + port + "/../secret");
Assert.assertThat(dirOutsideDirectory.f0, is(403));
Assert.assertThat(dirOutsideDirectory.f1, containsString("Forbidden"));
} finally {
webUI.shutdown();
}
}
use of org.apache.flink.runtime.rest.handler.router.Router in project flink by apache.
the class LeaderRetrievalHandlerTest method testLeaderRetrievalGateway.
/**
* Tests the behaviour of the LeaderRetrievalHandler under the following conditions.
*
* <p>1. No gateway resolved --> service unavailable 2. leader gateway
*
* @throws Exception
*/
@Test
public void testLeaderRetrievalGateway() throws Exception {
final String restPath = "/testing";
final Configuration configuration = new Configuration();
final Router router = new Router();
final Time timeout = Time.seconds(10L);
final CompletableFuture<RestfulGateway> gatewayFuture = new CompletableFuture<>();
final GatewayRetriever<RestfulGateway> gatewayRetriever = () -> gatewayFuture;
final RestfulGateway gateway = new TestingRestfulGateway.Builder().build();
final TestingHandler testingHandler = new TestingHandler(gatewayRetriever, timeout);
router.addGet(restPath, testingHandler);
WebFrontendBootstrap bootstrap = new WebFrontendBootstrap(router, log, null, null, "localhost", 0, configuration);
try (HttpTestClient httpClient = new HttpTestClient("localhost", bootstrap.getServerPort())) {
// 1. no leader gateway available --> Service unavailable
httpClient.sendGetRequest(restPath, FutureUtils.toDuration(timeout));
HttpTestClient.SimpleHttpResponse response = httpClient.getNextResponse(FutureUtils.toDuration(timeout));
Assert.assertEquals(HttpResponseStatus.SERVICE_UNAVAILABLE, response.getStatus());
// 2. with leader
gatewayFuture.complete(gateway);
httpClient.sendGetRequest(restPath, FutureUtils.toDuration(timeout));
response = httpClient.getNextResponse(FutureUtils.toDuration(timeout));
Assert.assertEquals(HttpResponseStatus.OK, response.getStatus());
Assert.assertEquals(RESPONSE_MESSAGE, response.getContent());
} finally {
bootstrap.shutdown();
}
}
use of org.apache.flink.runtime.rest.handler.router.Router in project flink by apache.
the class HistoryServer method start.
// ------------------------------------------------------------------------
// Life-cycle
// ------------------------------------------------------------------------
void start() throws IOException, InterruptedException {
synchronized (startupShutdownLock) {
LOG.info("Starting history server.");
Files.createDirectories(webDir.toPath());
LOG.info("Using directory {} as local cache.", webDir);
Router router = new Router();
router.addGet("/:*", new HistoryServerStaticFileServerHandler(webDir));
createDashboardConfigFile();
executor.scheduleWithFixedDelay(getArchiveFetchingRunnable(), 0, refreshIntervalMillis, TimeUnit.MILLISECONDS);
netty = new WebFrontendBootstrap(router, LOG, webDir, serverSSLFactory, webAddress, webPort, config);
}
}
use of org.apache.flink.runtime.rest.handler.router.Router in project flink by apache.
the class RestServerEndpoint method start.
/**
* Starts this REST server endpoint.
*
* @throws Exception if we cannot start the RestServerEndpoint
*/
public final void start() throws Exception {
synchronized (lock) {
Preconditions.checkState(state == State.CREATED, "The RestServerEndpoint cannot be restarted.");
log.info("Starting rest endpoint.");
final Router router = new Router();
final CompletableFuture<String> restAddressFuture = new CompletableFuture<>();
handlers = initializeHandlers(restAddressFuture);
/* sort the handlers such that they are ordered the following:
* /jobs
* /jobs/overview
* /jobs/:jobid
* /jobs/:jobid/config
* /:*
*/
Collections.sort(handlers, RestHandlerUrlComparator.INSTANCE);
checkAllEndpointsAndHandlersAreUnique(handlers);
handlers.forEach(handler -> registerHandler(router, handler, log));
ChannelInitializer<SocketChannel> initializer = new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws ConfigurationException {
RouterHandler handler = new RouterHandler(router, responseHeaders);
// SSL should be the first handler in the pipeline
if (isHttpsEnabled()) {
ch.pipeline().addLast("ssl", new RedirectingSslHandler(restAddress, restAddressFuture, sslHandlerFactory));
}
ch.pipeline().addLast(new HttpServerCodec()).addLast(new FileUploadHandler(uploadDir)).addLast(new FlinkHttpObjectAggregator(maxContentLength, responseHeaders));
for (InboundChannelHandlerFactory factory : inboundChannelHandlerFactories) {
Optional<ChannelHandler> channelHandler = factory.createHandler(configuration, responseHeaders);
if (channelHandler.isPresent()) {
ch.pipeline().addLast(channelHandler.get());
}
}
ch.pipeline().addLast(new ChunkedWriteHandler()).addLast(handler.getName(), handler).addLast(new PipelineErrorHandler(log, responseHeaders));
}
};
NioEventLoopGroup bossGroup = new NioEventLoopGroup(1, new ExecutorThreadFactory("flink-rest-server-netty-boss"));
NioEventLoopGroup workerGroup = new NioEventLoopGroup(0, new ExecutorThreadFactory("flink-rest-server-netty-worker"));
bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(initializer);
Iterator<Integer> portsIterator;
try {
portsIterator = NetUtils.getPortRangeFromString(restBindPortRange);
} catch (IllegalConfigurationException e) {
throw e;
} catch (Exception e) {
throw new IllegalArgumentException("Invalid port range definition: " + restBindPortRange);
}
int chosenPort = 0;
while (portsIterator.hasNext()) {
try {
chosenPort = portsIterator.next();
final ChannelFuture channel;
if (restBindAddress == null) {
channel = bootstrap.bind(chosenPort);
} else {
channel = bootstrap.bind(restBindAddress, chosenPort);
}
serverChannel = channel.syncUninterruptibly().channel();
break;
} catch (final Exception e) {
// otherwise
if (!(e instanceof java.net.BindException)) {
throw e;
}
}
}
if (serverChannel == null) {
throw new BindException("Could not start rest endpoint on any port in port range " + restBindPortRange);
}
log.debug("Binding rest endpoint to {}:{}.", restBindAddress, chosenPort);
final InetSocketAddress bindAddress = (InetSocketAddress) serverChannel.localAddress();
final String advertisedAddress;
if (bindAddress.getAddress().isAnyLocalAddress()) {
advertisedAddress = this.restAddress;
} else {
advertisedAddress = bindAddress.getAddress().getHostAddress();
}
port = bindAddress.getPort();
log.info("Rest endpoint listening at {}:{}", advertisedAddress, port);
restBaseUrl = new URL(determineProtocol(), advertisedAddress, port, "").toString();
restAddressFuture.complete(restBaseUrl);
state = State.RUNNING;
startInternal();
}
}
Aggregations