All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.flink.runtime.rest.RestServerEndpointConfiguration Maven / Gradle / Ivy

There is a newer version: 1.13.6
Show newest version
/*
 * 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.runtime.rest;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.RestOptions;
import org.apache.flink.configuration.WebOptions;
import org.apache.flink.runtime.io.network.netty.SSLHandlerFactory;
import org.apache.flink.runtime.net.SSLUtils;
import org.apache.flink.util.ConfigurationException;
import org.apache.flink.util.Preconditions;

import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaders;

import javax.annotation.Nullable;
import javax.net.ssl.SSLEngine;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.Map;

import static java.util.Objects.requireNonNull;

/**
 * A configuration object for {@link RestServerEndpoint}s.
 */
public final class RestServerEndpointConfiguration {

	private final String restAddress;

	@Nullable
	private final String restBindAddress;

	private final String restBindPortRange;

	@Nullable
	private final SSLHandlerFactory sslHandlerFactory;

	private final Path uploadDir;

	private final int maxContentLength;

	private final Map responseHeaders;

	private RestServerEndpointConfiguration(
			final String restAddress,
			@Nullable String restBindAddress,
			String restBindPortRange,
			@Nullable SSLHandlerFactory sslHandlerFactory,
			final Path uploadDir,
			final int maxContentLength,
			final Map responseHeaders) {

		Preconditions.checkArgument(maxContentLength > 0, "maxContentLength must be positive, was: %s", maxContentLength);

		this.restAddress = requireNonNull(restAddress);
		this.restBindAddress = restBindAddress;
		this.restBindPortRange = requireNonNull(restBindPortRange);
		this.sslHandlerFactory = sslHandlerFactory;
		this.uploadDir = requireNonNull(uploadDir);
		this.maxContentLength = maxContentLength;
		this.responseHeaders = Collections.unmodifiableMap(requireNonNull(responseHeaders));
	}

	/**
	 * @see RestOptions#ADDRESS
	 */
	public String getRestAddress() {
		return restAddress;
	}

	/**
	 * Returns the address that the REST server endpoint should bind itself to.
	 *
	 * @return address that the REST server endpoint should bind itself to
	 */
	public String getRestBindAddress() {
		return restBindAddress;
	}

	/**
	 * Returns the port range that the REST server endpoint should listen on.
	 *
	 * @return port range that the REST server endpoint should listen on
	 */
	public String getRestBindPortRange() {
		return restBindPortRange;
	}

	/**
	 * Returns the {@link SSLEngine} that the REST server endpoint should use.
	 *
	 * @return SSLEngine that the REST server endpoint should use, or null if SSL was disabled
	 */
	@Nullable
	public SSLHandlerFactory getSslHandlerFactory() {
		return sslHandlerFactory;
	}

	/**
	 * Returns the directory used to temporarily store multipart/form-data uploads.
	 */
	public Path getUploadDir() {
		return uploadDir;
	}

	/**
	 * Returns the max content length that the REST server endpoint could handle.
	 *
	 * @return max content length that the REST server endpoint could handle
	 */
	public int getMaxContentLength() {
		return maxContentLength;
	}

	/**
	 * Response headers that should be added to every HTTP response.
	 */
	public Map getResponseHeaders() {
		return responseHeaders;
	}

	/**
	 * Creates and returns a new {@link RestServerEndpointConfiguration} from the given {@link Configuration}.
	 *
	 * @param config configuration from which the REST server endpoint configuration should be created from
	 * @return REST server endpoint configuration
	 * @throws ConfigurationException if SSL was configured incorrectly
	 */
	public static RestServerEndpointConfiguration fromConfiguration(Configuration config) throws ConfigurationException {
		Preconditions.checkNotNull(config);

		final String restAddress = Preconditions.checkNotNull(config.getString(RestOptions.ADDRESS),
			"%s must be set",
			RestOptions.ADDRESS.key());

		final String restBindAddress = config.getString(RestOptions.BIND_ADDRESS);
		final String portRangeDefinition = config.getString(RestOptions.BIND_PORT);

		final SSLHandlerFactory sslHandlerFactory;
		if (SSLUtils.isRestSSLEnabled(config)) {
			try {
				sslHandlerFactory = SSLUtils.createRestServerSSLEngineFactory(config);
			} catch (Exception e) {
				throw new ConfigurationException("Failed to initialize SSLEngineFactory for REST server endpoint.", e);
			}
		} else {
			sslHandlerFactory = null;
		}

		final Path uploadDir = Paths.get(
			config.getString(WebOptions.UPLOAD_DIR,	config.getString(WebOptions.TMP_DIR)),
			"flink-web-upload");

		final int maxContentLength = config.getInteger(RestOptions.SERVER_MAX_CONTENT_LENGTH);

		final Map responseHeaders = Collections.singletonMap(
			HttpHeaders.Names.ACCESS_CONTROL_ALLOW_ORIGIN,
			config.getString(WebOptions.ACCESS_CONTROL_ALLOW_ORIGIN));

		return new RestServerEndpointConfiguration(
			restAddress,
			restBindAddress,
			portRangeDefinition,
			sslHandlerFactory,
			uploadDir,
			maxContentLength,
			responseHeaders);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy