From 5b2a2e7681adc7c4872b66cddd43a979741f91dc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tibor=20Kr=C3=A1l?= Date: Wed, 20 May 2020 15:16:40 +0200 Subject: [PATCH] Allow SshClient to be customized via NetconfClientConfiguration MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Robert Varga --- .../client/NetconfClientDispatcherImpl.java | 19 +++++----------- .../conf/NetconfClientConfiguration.java | 9 +++++++- .../NetconfClientConfigurationBuilder.java | 14 +++++++++++- ...etconfReconnectingClientConfiguration.java | 4 +++- ...econnectingClientConfigurationBuilder.java | 9 +++++++- .../stress/ConfigurableClientDispatcher.java | 22 +++++++++---------- .../test/tool/client/stress/StressClient.java | 10 ++++----- 7 files changed, 51 insertions(+), 36 deletions(-) diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientDispatcherImpl.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientDispatcherImpl.java index 7e824792ba..747a5f75fd 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientDispatcherImpl.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientDispatcherImpl.java @@ -13,11 +13,9 @@ import io.netty.util.concurrent.Future; 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.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; @@ -29,18 +27,11 @@ public class NetconfClientDispatcherImpl 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, - final Timer timer, @Nullable final NetconfSshClient sshClient) { + final 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() { @@ -79,8 +70,7 @@ public class NetconfClientDispatcherImpl 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 createReconnectingTcpClient( @@ -100,14 +90,15 @@ public class NetconfClientDispatcherImpl 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 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(), diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfiguration.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfiguration.java index 9ad03b915d..3a17dc3694 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfiguration.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfiguration.java @@ -18,6 +18,7 @@ import org.opendaylight.netconf.client.NetconfClientSessionListener; 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; @@ -37,6 +38,7 @@ public class NetconfClientConfiguration { private final AuthenticationHandler authHandler; private final SslHandlerFactory sslHandlerFactory; + private final NetconfSshClient sshClient; private final List odlHelloCapabilities; @@ -45,7 +47,7 @@ public class NetconfClientConfiguration { final NetconfHelloMessageAdditionalHeader additionalHeader, final NetconfClientSessionListener sessionListener, final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler, - final SslHandlerFactory sslHandlerFactory, + final SslHandlerFactory sslHandlerFactory, final NetconfSshClient sshClient, final List odlHelloCapabilities) { this.address = address; this.connectionTimeoutMillis = connectionTimeoutMillis; @@ -55,6 +57,7 @@ public class NetconfClientConfiguration { this.reconnectStrategy = reconnectStrategy; this.authHandler = authHandler; this.sslHandlerFactory = sslHandlerFactory; + this.sshClient = sshClient; this.odlHelloCapabilities = odlHelloCapabilities; validateConfiguration(); } @@ -91,6 +94,10 @@ public class NetconfClientConfiguration { return sslHandlerFactory; } + public NetconfSshClient getSshClient() { + return sshClient; + } + public List getOdlHelloCapabilities() { return odlHelloCapabilities; } diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfigurationBuilder.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfigurationBuilder.java index d79d5d5cc9..9101315379 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfigurationBuilder.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfigurationBuilder.java @@ -14,6 +14,7 @@ import org.opendaylight.netconf.client.NetconfClientSessionListener; 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 { @@ -30,6 +31,7 @@ public class NetconfClientConfigurationBuilder { private AuthenticationHandler authHandler; private NetconfClientConfiguration.NetconfClientProtocol clientProtocol = DEFAULT_CLIENT_PROTOCOL; private SslHandlerFactory sslHandlerFactory; + private NetconfSshClient sshClient; private List odlHelloCapabilities; @@ -90,6 +92,12 @@ public class NetconfClientConfigurationBuilder { return this; } + @SuppressWarnings("checkstyle:hiddenField") + public NetconfClientConfigurationBuilder withSshClient(final NetconfSshClient sshClient) { + this.sshClient = sshClient; + return this; + } + @SuppressWarnings("checkstyle:hiddenField") public NetconfClientConfigurationBuilder withOdlHelloCapabilities(final List odlHelloCapabilities) { this.odlHelloCapabilities = odlHelloCapabilities; @@ -128,12 +136,16 @@ public class NetconfClientConfigurationBuilder { return sslHandlerFactory; } + public NetconfSshClient getSshClient() { + return sshClient; + } + final List getOdlHelloCapabilities() { return odlHelloCapabilities; } public NetconfClientConfiguration build() { return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader, - sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, odlHelloCapabilities); + sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities); } } diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfiguration.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfiguration.java index c43cd2d2b9..cc03003558 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfiguration.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfiguration.java @@ -17,6 +17,7 @@ import org.opendaylight.netconf.client.SslHandlerFactory; 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 { @@ -31,9 +32,10 @@ public final class NetconfReconnectingClientConfiguration extends NetconfClientC final ReconnectStrategyFactory connectStrategyFactory, final AuthenticationHandler authHandler, final SslHandlerFactory sslHandlerFactory, + final NetconfSshClient sshClient, final List odlHelloCapabilities) { super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy, - authHandler, sslHandlerFactory, odlHelloCapabilities); + authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities); this.connectStrategyFactory = connectStrategyFactory; validateReconnectConfiguration(); } diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfigurationBuilder.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfigurationBuilder.java index a23996c955..c430fa41a4 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfigurationBuilder.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfigurationBuilder.java @@ -15,6 +15,7 @@ import org.opendaylight.netconf.client.SslHandlerFactory; 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 { @@ -39,7 +40,7 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf 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 @@ -91,6 +92,12 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf return (NetconfReconnectingClientConfigurationBuilder) super.withSslHandlerFactory(sslHandlerFactory); } + @Override + public NetconfReconnectingClientConfigurationBuilder withSshClient( + final NetconfSshClient sshClient) { + return (NetconfReconnectingClientConfigurationBuilder) super.withSshClient(sshClient); + } + @Override public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(List odlHelloCapabilities) { return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities); diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/ConfigurableClientDispatcher.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/ConfigurableClientDispatcher.java index c14bc0b9f3..fbfbcb246d 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/ConfigurableClientDispatcher.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/ConfigurableClientDispatcher.java @@ -10,19 +10,17 @@ package org.opendaylight.netconf.test.tool.client.stress; 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.nettyutil.handler.ssh.client.NetconfSshClient; public final class ConfigurableClientDispatcher extends NetconfClientDispatcherImpl { private final Set capabilities; private ConfigurableClientDispatcher(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup, - final Timer timer, final Set capabilities, final @Nullable NetconfSshClient sshClient) { - super(bossGroup, workerGroup, timer, sshClient); + final Timer timer, final Set capabilities) { + super(bossGroup, workerGroup, timer); this.capabilities = capabilities; } @@ -30,36 +28,36 @@ public final class ConfigurableClientDispatcher extends NetconfClientDispatcherI * 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, - NetconfClientSessionNegotiatorFactory.EXI_CLIENT_CAPABILITIES, sshClient); + NetconfClientSessionNegotiatorFactory.EXI_CLIENT_CAPABILITIES); } /** * 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, - NetconfClientSessionNegotiatorFactory.LEGACY_EXI_CLIENT_CAPABILITIES, sshClient); + NetconfClientSessionNegotiatorFactory.LEGACY_EXI_CLIENT_CAPABILITIES); } /** * 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, - NetconfClientSessionNegotiatorFactory.DEFAULT_CLIENT_CAPABILITIES, sshClient); + NetconfClientSessionNegotiatorFactory.DEFAULT_CLIENT_CAPABILITIES); } /** * ]]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, - NetconfClientSessionNegotiatorFactory.LEGACY_FRAMING_CLIENT_CAPABILITIES, sshClient); + NetconfClientSessionNegotiatorFactory.LEGACY_FRAMING_CLIENT_CAPABILITIES); } @Override diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/StressClient.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/StressClient.java index 3832d9e11d..6d02ba259a 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/StressClient.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/StressClient.java @@ -234,17 +234,15 @@ public final class StressClient { final NetconfClientDispatcherImpl netconfClientDispatcher; if (params.exi) { if (params.legacyFraming) { - netconfClientDispatcher = ConfigurableClientDispatcher.createLegacyExi(nioGroup, nioGroup, timer, - null); + netconfClientDispatcher = ConfigurableClientDispatcher.createLegacyExi(nioGroup, nioGroup, timer); } else { - netconfClientDispatcher = ConfigurableClientDispatcher.createChunkedExi(nioGroup, nioGroup, timer, - null); + netconfClientDispatcher = ConfigurableClientDispatcher.createChunkedExi(nioGroup, nioGroup, timer); } } else { if (params.legacyFraming) { - netconfClientDispatcher = ConfigurableClientDispatcher.createLegacy(nioGroup, nioGroup, timer, null); + netconfClientDispatcher = ConfigurableClientDispatcher.createLegacy(nioGroup, nioGroup, timer); } else { - netconfClientDispatcher = ConfigurableClientDispatcher.createChunked(nioGroup, nioGroup, timer, null); + netconfClientDispatcher = ConfigurableClientDispatcher.createChunked(nioGroup, nioGroup, timer); } } return netconfClientDispatcher; -- 2.36.6