There are a number of options we want to have configurable on
a per-client (rather than per-dispatcher) basis. These options
are related to how SSH operates and hence we do not want to
duplicate them but rather allow an explicit pre-built client
instance to be passed down.
JIRA: NETCONF-641
Change-Id: I4c39a8ec909edae0ca15e5af4efd7ca690d64fbf
Signed-off-by: Tibor Král <tibor.kral@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
-import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
import org.opendaylight.netconf.nettyutil.AbstractNetconfDispatcher;
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
import org.opendaylight.netconf.nettyutil.AbstractNetconfDispatcher;
-import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
private final Timer timer;
private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
private final Timer timer;
- private final NetconfSshClient sshClient;
public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
- final Timer timer, @Nullable final NetconfSshClient sshClient) {
super(bossGroup, workerGroup);
this.timer = timer;
super(bossGroup, workerGroup);
this.timer = timer;
- this.sshClient = sshClient;
- }
-
- public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
- final Timer timer) {
- this(bossGroup, workerGroup, timer, null);
}
protected Timer getTimer() {
}
protected Timer getTimer() {
LOG.debug("Creating TCP client with configuration: {}", currentConfiguration);
return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
(ch, promise) -> new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
LOG.debug("Creating TCP client with configuration: {}", currentConfiguration);
return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
(ch, promise) -> new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
- currentConfiguration
- .getSessionListener()).initialize(ch, promise));
+ currentConfiguration.getSessionListener()).initialize(ch, promise));
}
private Future<Void> createReconnectingTcpClient(
}
private Future<Void> createReconnectingTcpClient(
return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
(ch, sessionPromise) -> new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(),
return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
(ch, sessionPromise) -> new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(),
- sshClient).initialize(ch, sessionPromise));
+ currentConfiguration.getSshClient()).initialize(ch, sessionPromise));
}
private Future<Void> createReconnectingSshClient(
final NetconfReconnectingClientConfiguration currentConfiguration) {
LOG.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
}
private Future<Void> createReconnectingSshClient(
final NetconfReconnectingClientConfiguration currentConfiguration) {
LOG.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
- getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(), sshClient);
+ getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(),
+ currentConfiguration.getSshClient());
return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
.getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
.getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
+import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final AuthenticationHandler authHandler;
private final SslHandlerFactory sslHandlerFactory;
private final AuthenticationHandler authHandler;
private final SslHandlerFactory sslHandlerFactory;
+ private final NetconfSshClient sshClient;
private final List<Uri> odlHelloCapabilities;
private final List<Uri> odlHelloCapabilities;
final NetconfHelloMessageAdditionalHeader additionalHeader,
final NetconfClientSessionListener sessionListener,
final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
final NetconfHelloMessageAdditionalHeader additionalHeader,
final NetconfClientSessionListener sessionListener,
final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
- final SslHandlerFactory sslHandlerFactory,
+ final SslHandlerFactory sslHandlerFactory, final NetconfSshClient sshClient,
final List<Uri> odlHelloCapabilities) {
this.address = address;
this.connectionTimeoutMillis = connectionTimeoutMillis;
final List<Uri> odlHelloCapabilities) {
this.address = address;
this.connectionTimeoutMillis = connectionTimeoutMillis;
this.reconnectStrategy = reconnectStrategy;
this.authHandler = authHandler;
this.sslHandlerFactory = sslHandlerFactory;
this.reconnectStrategy = reconnectStrategy;
this.authHandler = authHandler;
this.sslHandlerFactory = sslHandlerFactory;
+ this.sshClient = sshClient;
this.odlHelloCapabilities = odlHelloCapabilities;
validateConfiguration();
}
this.odlHelloCapabilities = odlHelloCapabilities;
validateConfiguration();
}
return sslHandlerFactory;
}
return sslHandlerFactory;
}
+ public NetconfSshClient getSshClient() {
+ return sshClient;
+ }
+
public List<Uri> getOdlHelloCapabilities() {
return odlHelloCapabilities;
}
public List<Uri> getOdlHelloCapabilities() {
return odlHelloCapabilities;
}
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
+import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public class NetconfClientConfigurationBuilder {
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public class NetconfClientConfigurationBuilder {
private AuthenticationHandler authHandler;
private NetconfClientConfiguration.NetconfClientProtocol clientProtocol = DEFAULT_CLIENT_PROTOCOL;
private SslHandlerFactory sslHandlerFactory;
private AuthenticationHandler authHandler;
private NetconfClientConfiguration.NetconfClientProtocol clientProtocol = DEFAULT_CLIENT_PROTOCOL;
private SslHandlerFactory sslHandlerFactory;
+ private NetconfSshClient sshClient;
private List<Uri> odlHelloCapabilities;
private List<Uri> odlHelloCapabilities;
+ @SuppressWarnings("checkstyle:hiddenField")
+ public NetconfClientConfigurationBuilder withSshClient(final NetconfSshClient sshClient) {
+ this.sshClient = sshClient;
+ return this;
+ }
+
@SuppressWarnings("checkstyle:hiddenField")
public NetconfClientConfigurationBuilder withOdlHelloCapabilities(final List<Uri> odlHelloCapabilities) {
this.odlHelloCapabilities = odlHelloCapabilities;
@SuppressWarnings("checkstyle:hiddenField")
public NetconfClientConfigurationBuilder withOdlHelloCapabilities(final List<Uri> odlHelloCapabilities) {
this.odlHelloCapabilities = odlHelloCapabilities;
return sslHandlerFactory;
}
return sslHandlerFactory;
}
+ public NetconfSshClient getSshClient() {
+ return sshClient;
+ }
+
final List<Uri> getOdlHelloCapabilities() {
return odlHelloCapabilities;
}
public NetconfClientConfiguration build() {
return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader,
final List<Uri> getOdlHelloCapabilities() {
return odlHelloCapabilities;
}
public NetconfClientConfiguration build() {
return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader,
- sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, odlHelloCapabilities);
+ sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.ReconnectStrategyFactory;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.ReconnectStrategyFactory;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
+import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public final class NetconfReconnectingClientConfiguration extends NetconfClientConfiguration {
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public final class NetconfReconnectingClientConfiguration extends NetconfClientConfiguration {
final ReconnectStrategyFactory connectStrategyFactory,
final AuthenticationHandler authHandler,
final SslHandlerFactory sslHandlerFactory,
final ReconnectStrategyFactory connectStrategyFactory,
final AuthenticationHandler authHandler,
final SslHandlerFactory sslHandlerFactory,
+ final NetconfSshClient sshClient,
final List<Uri> odlHelloCapabilities) {
super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
final List<Uri> odlHelloCapabilities) {
super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
- authHandler, sslHandlerFactory, odlHelloCapabilities);
+ authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
this.connectStrategyFactory = connectStrategyFactory;
validateReconnectConfiguration();
}
this.connectStrategyFactory = connectStrategyFactory;
validateReconnectConfiguration();
}
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.ReconnectStrategyFactory;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
import org.opendaylight.netconf.nettyutil.ReconnectStrategyFactory;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
+import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public final class NetconfReconnectingClientConfigurationBuilder extends NetconfClientConfigurationBuilder {
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
public final class NetconfReconnectingClientConfigurationBuilder extends NetconfClientConfigurationBuilder {
public NetconfReconnectingClientConfiguration build() {
return new NetconfReconnectingClientConfiguration(getProtocol(), getAddress(), getConnectionTimeoutMillis(),
getAdditionalHeader(), getSessionListener(), getReconnectStrategy(), connectStrategyFactory,
public NetconfReconnectingClientConfiguration build() {
return new NetconfReconnectingClientConfiguration(getProtocol(), getAddress(), getConnectionTimeoutMillis(),
getAdditionalHeader(), getSessionListener(), getReconnectStrategy(), connectStrategyFactory,
- getAuthHandler(), getSslHandlerFactory(), getOdlHelloCapabilities());
+ getAuthHandler(), getSslHandlerFactory(), getSshClient(), getOdlHelloCapabilities());
}
// Override setter methods to return subtype
}
// Override setter methods to return subtype
return (NetconfReconnectingClientConfigurationBuilder) super.withSslHandlerFactory(sslHandlerFactory);
}
return (NetconfReconnectingClientConfigurationBuilder) super.withSslHandlerFactory(sslHandlerFactory);
}
+ @Override
+ public NetconfReconnectingClientConfigurationBuilder withSshClient(
+ final NetconfSshClient sshClient) {
+ return (NetconfReconnectingClientConfigurationBuilder) super.withSshClient(sshClient);
+ }
+
@Override
public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(List<Uri> odlHelloCapabilities) {
return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities);
@Override
public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(List<Uri> odlHelloCapabilities) {
return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities);
import io.netty.channel.EventLoopGroup;
import io.netty.util.Timer;
import java.util.Set;
import io.netty.channel.EventLoopGroup;
import io.netty.util.Timer;
import java.util.Set;
-import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.netconf.client.NetconfClientDispatcherImpl;
import org.opendaylight.netconf.client.NetconfClientSessionNegotiatorFactory;
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
import org.opendaylight.netconf.client.NetconfClientDispatcherImpl;
import org.opendaylight.netconf.client.NetconfClientSessionNegotiatorFactory;
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
-import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
public final class ConfigurableClientDispatcher extends NetconfClientDispatcherImpl {
private final Set<String> capabilities;
private ConfigurableClientDispatcher(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
public final class ConfigurableClientDispatcher extends NetconfClientDispatcherImpl {
private final Set<String> capabilities;
private ConfigurableClientDispatcher(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
- final Timer timer, final Set<String> capabilities, final @Nullable NetconfSshClient sshClient) {
- super(bossGroup, workerGroup, timer, sshClient);
+ final Timer timer, final Set<String> capabilities) {
+ super(bossGroup, workerGroup, timer);
this.capabilities = capabilities;
}
this.capabilities = capabilities;
}
* EXI + chunked framing.
*/
public static ConfigurableClientDispatcher createChunkedExi(final EventLoopGroup bossGroup,
* EXI + chunked framing.
*/
public static ConfigurableClientDispatcher createChunkedExi(final EventLoopGroup bossGroup,
- final EventLoopGroup workerGroup, final Timer timer, final @Nullable NetconfSshClient sshClient) {
+ final EventLoopGroup workerGroup, final Timer timer) {
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
- NetconfClientSessionNegotiatorFactory.EXI_CLIENT_CAPABILITIES, sshClient);
+ NetconfClientSessionNegotiatorFactory.EXI_CLIENT_CAPABILITIES);
}
/**
* EXI + ]]gt;]]gt; framing.
*/
public static ConfigurableClientDispatcher createLegacyExi(final EventLoopGroup bossGroup,
}
/**
* EXI + ]]gt;]]gt; framing.
*/
public static ConfigurableClientDispatcher createLegacyExi(final EventLoopGroup bossGroup,
- final EventLoopGroup workerGroup, final Timer timer, final @Nullable NetconfSshClient sshClient) {
+ final EventLoopGroup workerGroup, final Timer timer) {
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
- NetconfClientSessionNegotiatorFactory.LEGACY_EXI_CLIENT_CAPABILITIES, sshClient);
+ NetconfClientSessionNegotiatorFactory.LEGACY_EXI_CLIENT_CAPABILITIES);
}
/**
* Chunked framing.
*/
public static ConfigurableClientDispatcher createChunked(final EventLoopGroup bossGroup,
}
/**
* Chunked framing.
*/
public static ConfigurableClientDispatcher createChunked(final EventLoopGroup bossGroup,
- final EventLoopGroup workerGroup, final Timer timer, final @Nullable NetconfSshClient sshClient) {
+ final EventLoopGroup workerGroup, final Timer timer) {
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
- NetconfClientSessionNegotiatorFactory.DEFAULT_CLIENT_CAPABILITIES, sshClient);
+ NetconfClientSessionNegotiatorFactory.DEFAULT_CLIENT_CAPABILITIES);
}
/**
* ]]gt;]]gt; framing.
*/
public static ConfigurableClientDispatcher createLegacy(final EventLoopGroup bossGroup,
}
/**
* ]]gt;]]gt; framing.
*/
public static ConfigurableClientDispatcher createLegacy(final EventLoopGroup bossGroup,
- final EventLoopGroup workerGroup, final Timer timer, final @Nullable NetconfSshClient sshClient) {
+ final EventLoopGroup workerGroup, final Timer timer) {
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
return new ConfigurableClientDispatcher(bossGroup, workerGroup, timer,
- NetconfClientSessionNegotiatorFactory.LEGACY_FRAMING_CLIENT_CAPABILITIES, sshClient);
+ NetconfClientSessionNegotiatorFactory.LEGACY_FRAMING_CLIENT_CAPABILITIES);
final NetconfClientDispatcherImpl netconfClientDispatcher;
if (params.exi) {
if (params.legacyFraming) {
final NetconfClientDispatcherImpl netconfClientDispatcher;
if (params.exi) {
if (params.legacyFraming) {
- netconfClientDispatcher = ConfigurableClientDispatcher.createLegacyExi(nioGroup, nioGroup, timer,
- null);
+ netconfClientDispatcher = ConfigurableClientDispatcher.createLegacyExi(nioGroup, nioGroup, timer);
- netconfClientDispatcher = ConfigurableClientDispatcher.createChunkedExi(nioGroup, nioGroup, timer,
- null);
+ netconfClientDispatcher = ConfigurableClientDispatcher.createChunkedExi(nioGroup, nioGroup, timer);
}
} else {
if (params.legacyFraming) {
}
} else {
if (params.legacyFraming) {
- netconfClientDispatcher = ConfigurableClientDispatcher.createLegacy(nioGroup, nioGroup, timer, null);
+ netconfClientDispatcher = ConfigurableClientDispatcher.createLegacy(nioGroup, nioGroup, timer);
- netconfClientDispatcher = ConfigurableClientDispatcher.createChunked(nioGroup, nioGroup, timer, null);
+ netconfClientDispatcher = ConfigurableClientDispatcher.createChunked(nioGroup, nioGroup, timer);
}
}
return netconfClientDispatcher;
}
}
return netconfClientDispatcher;