Allow SshClient to be customized via NetconfClientConfiguration 96/89896/5
authorTibor Král <tibor.kral@pantheon.tech>
Wed, 20 May 2020 13:16:40 +0000 (15:16 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 25 May 2020 10:52:34 +0000 (10:52 +0000)
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>
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientDispatcherImpl.java
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfiguration.java
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfClientConfigurationBuilder.java
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfiguration.java
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/conf/NetconfReconnectingClientConfigurationBuilder.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/ConfigurableClientDispatcher.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/stress/StressClient.java

index 7e824792bac1d5ec3602b28874bef8e076b3b7e7..747a5f75fd72750dbb36353511d7deab60dd6d90 100644 (file)
@@ -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<Void> 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<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(),
index 9ad03b915df50926539f5391e1f9cdefe346fd43..3a17dc3694dd4f1d3437d01c4788adb5cb5bfbbd 100644 (file)
@@ -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<Uri> 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<Uri> 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<Uri> getOdlHelloCapabilities() {
         return odlHelloCapabilities;
     }
index d79d5d5cc9b76d429c61fb7af09b08f14e192ac3..91013153797a4eb7893b46a55e261ddcbd51e3ca 100644 (file)
@@ -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<Uri> 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<Uri> odlHelloCapabilities) {
         this.odlHelloCapabilities = odlHelloCapabilities;
@@ -128,12 +136,16 @@ public class NetconfClientConfigurationBuilder {
         return sslHandlerFactory;
     }
 
+    public NetconfSshClient getSshClient() {
+        return sshClient;
+    }
+
     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);
     }
 }
index c43cd2d2b96d1454f5bbbd237221865f21b5547d..cc030035581a85249f5a44f9507dbc871ea80003 100644 (file)
@@ -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<Uri> odlHelloCapabilities) {
         super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
-                authHandler, sslHandlerFactory, odlHelloCapabilities);
+                authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
         this.connectStrategyFactory = connectStrategyFactory;
         validateReconnectConfiguration();
     }
index a23996c95568e91a674f3e4298f98672f8c6ae4a..c430fa41a487f1c93c4fd2379726caf733fa7b8c 100644 (file)
@@ -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<Uri> odlHelloCapabilities) {
         return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities);
index c14bc0b9f34eb64a0527826559d10ea408f5f044..fbfbcb246d18b66e9d4b85c8d10fbe654791ce1d 100644 (file)
@@ -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<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;
     }
 
@@ -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
index 3832d9e11db1928028fc3748b8771276c4e7865e..6d02ba259a94585aa3c4fdedcfc763ce522f8967 100644 (file)
@@ -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;