/* * 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.ignite.internal.client.router; import java.net.Socket; import java.util.Collection; import java.util.Collections; import org.apache.ignite.IgniteLogger; import org.apache.ignite.configuration.ConnectorConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.client.ssl.GridSslContextFactory; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.plugin.security.SecurityCredentialsProvider; import org.jetbrains.annotations.Nullable; /** * This class defines runtime configuration for TCP router. * <p> * Note that you should only set values * that differ from defaults, as router will automatically pick default values * for all values that are not set. * <p> * For more information about router configuration and startup refer to {@code GridRouterFactory} * documentation. */ public class GridTcpRouterConfiguration { /** Default servers to which router will try to connect. */ public static final Collection<String> DFLT_SERVERS = Collections.singleton("127.0.0.1:" + IgniteConfiguration.DFLT_TCP_PORT); /** Default TCP host for router to bind to. */ public static final String DFLT_TCP_HOST = "0.0.0.0"; /** Default TCP port. The next port number after Grid's default is used. */ public static final int DFLT_TCP_PORT = IgniteConfiguration.DFLT_TCP_PORT + 1; /** Default port range. */ public static final int DFLT_PORT_RANGE = 0; /** Default nodelay. */ public static final boolean DFLT_TCP_NODELAY = true; /** Host. */ private String host = DFLT_TCP_HOST; /** Port. */ private int port = DFLT_TCP_PORT; /** Port range. */ @SuppressWarnings("RedundantFieldInitialization") private int portRange = DFLT_PORT_RANGE; /** No delay. */ private boolean noDelay = DFLT_TCP_NODELAY; /** Idle timeout. */ private long idleTimeout = ConnectorConfiguration.DFLT_IDLE_TIMEOUT; /** Client auth. */ private boolean sslClientAuth; /** Ssl context factory. */ private GridSslContextFactory sslCtxFactory; /** Collection of servers */ private Collection<String> srvrs = DFLT_SERVERS; /** Logger. */ private IgniteLogger log; /** Credentials. */ private SecurityCredentialsProvider credsProvider; /** * Gets TCP host or IP address for router to bind to. * <p> * If not defined, router will try to bind to all interfaces. * * @return TCP host. */ public String getHost() { return host; } /** * Gets port for TCP binary protocol server. * <p> * Default is {@link #DFLT_TCP_PORT}. * * @return TCP port. */ public int getPort() { return port; } /** * Gets port range for TCP binary protocol server. If port number returned from {@link #getPort()} * is busy then ports withing this range will be tried. * <p> * Note: zero-range means only user-specified port will be used. * <p> * Default is {@link #DFLT_PORT_RANGE}. * * @return TCP port. */ public int getPortRange() { return portRange; } /** * Gets flag indicating whether {@code TCP_NODELAY} option should be set for accepted client connections. * Setting this option reduces network latency and should be set to {@code true} in majority of cases. * For more information, see {@link Socket#setTcpNoDelay(boolean)} * <p/> * If not specified, default value is {@code true}. * * @return Whether {@code TCP_NODELAY} option should be enabled. */ public boolean isNoDelay() { return noDelay; } /** * Gets timeout in milliseconds to consider connection idle. If no messages sent by client * within this interval router closes idling connection. * <p/> * If not specified, default value is {@link ConnectorConfiguration#DFLT_IDLE_TIMEOUT}. * * @return Idle timeout. */ public long getIdleTimeout() { return idleTimeout; } /** * Gets a flag indicating whether or not remote clients will be required to have * a valid SSL certificate which validity will be verified with trust manager. * * @return Whether or not client authentication is required. */ public boolean isSslClientAuth() { return sslClientAuth; } /** * Gets SSL context factory that will be used for creating a secure socket layer * of both rest binary server and out coming connections. * * @return SslContextFactory instance. * @see GridSslContextFactory */ @Nullable public GridSslContextFactory getSslContextFactory() { return sslCtxFactory; } /** * Gets list of server addresses to which router should try to connect to. * <p> * Node that this list will be used only for initial grid connectivity. * Once connected to the grid, router may establish connections to any grid node. * * @return List of server addresses. */ public Collection<String> getServers() { return srvrs; } /** * Gets logger for the router instance. * If no logger provided JDK logging will be used by router implementation. * * @return Logger or {@code null} if no logger provided by configuration. */ public IgniteLogger getLogger() { return log; } /** * Gets credentials provider for grid access. * <p> * This credentials will be used only for initial connection and topology discovery * by the router, not for client's request authorization. * * @return Credentials. */ @Nullable public SecurityCredentialsProvider getSecurityCredentialsProvider() { return credsProvider; } /** * Sets host for router. * * @param host Host. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setHost(String host) { this.host = host; return this; } /** * Sets port for router. * * @param port Port. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setPort(int port) { this.port = port; return this; } /** * Sets port range router will be allowed to try. * <p> * Note: zero-range means only user-specified port will be used. * * @param portRange Port range. * @see #DFLT_PORT_RANGE * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setPortRange(int portRange) { A.ensure(portRange >= 0, "portRange >= 0"); this.portRange = portRange; return this; } /** * Sets flag indicating whether {@code TCP_NODELAY} option should be set * for accepted client connections. * * @param noDelay No delay. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setNoDelay(boolean noDelay) { this.noDelay = noDelay; return this; } /** * Sets idle timeout. * * @param idleTimeout Idle timeout in milliseconds. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setIdleTimeout(long idleTimeout) { this.idleTimeout = idleTimeout; return this; } /** * Sets flag indicating whether or not remote clients will be required to have * a valid SSL certificate which validity will be verified with trust manager. * * @param sslClientAuth Ssl client auth. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setSslClientAuth(boolean sslClientAuth) { this.sslClientAuth = sslClientAuth; return this; } /** * Sets SSL context factory that will be used for creating a secure socket layer * of both rest binary server and out coming connections. * * @param sslCtxFactory Ssl context factory. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setSslContextFactory(GridSslContextFactory sslCtxFactory) { this.sslCtxFactory = sslCtxFactory; return this; } /** * Sets list of server addresses where router's embedded client should connect. * * @param srvrs List of servers. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setServers(Collection<String> srvrs) { this.srvrs = srvrs; return this; } /** * Sets logger for the router instance. * * @param log Logger. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setLogger(IgniteLogger log) { this.log = log; return this; } /** * Sets credentials provider for grid access. * * @param credsProvider Credentials provider. * @return {@code this} for chaining. */ public GridTcpRouterConfiguration setSecurityCredentialsProvider(SecurityCredentialsProvider credsProvider) { this.credsProvider = credsProvider; return this; } /** {@inheritDoc} */ @Override public String toString() { return S.toString(GridTcpRouterConfiguration.class, this); } }