Add SslHandlerFactory to NetconfClientConfiguration 54/69254/2
authorLiGuosheng <li.guosheng6@zte.com.cn>
Thu, 8 Mar 2018 08:40:15 +0000 (16:40 +0800)
committerJakubToth <jakub.toth@pantheon.tech>
Tue, 13 Mar 2018 10:15:07 +0000 (10:15 +0000)
If client protocol is TLS, then add a SslHandlerFactory instance to
NetconfClientConfiguration instead of SSH AuthenticationHandler.

Change-Id: Ie0d06a31e1cfca7f78dc0721a76b4995d69cd529
Signed-off-by: Li guosheng <li.guosheng6@zte.com.cn>
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/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientConfigurationTest.java
netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfReconnectingClientConfigurationTest.java

index ae0d3330087c4db4f7d4f5a97c9f509284ae8c76..b25071156234e1a02b3a174413cfb6766a1893e7 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.base.Preconditions;
 import java.net.InetSocketAddress;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
+import org.opendaylight.netconf.client.SslHandlerFactory;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 import org.slf4j.Logger;
@@ -33,12 +34,14 @@ public class NetconfClientConfiguration {
     private final ReconnectStrategy reconnectStrategy;
 
     private final AuthenticationHandler authHandler;
+    private final SslHandlerFactory sslHandlerFactory;
 
     NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
                                final Long connectionTimeoutMillis,
                                final NetconfHelloMessageAdditionalHeader additionalHeader,
                                final NetconfClientSessionListener sessionListener,
-                               final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler) {
+                               final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
+                               final SslHandlerFactory sslHandlerFactory) {
         this.address = address;
         this.connectionTimeoutMillis = connectionTimeoutMillis;
         this.additionalHeader = additionalHeader;
@@ -46,6 +49,7 @@ public class NetconfClientConfiguration {
         this.clientProtocol = protocol;
         this.reconnectStrategy = reconnectStrategy;
         this.authHandler = authHandler;
+        this.sslHandlerFactory = sslHandlerFactory;
         validateConfiguration();
     }
 
@@ -77,13 +81,22 @@ public class NetconfClientConfiguration {
         return clientProtocol;
     }
 
+    public SslHandlerFactory getSslHandlerFactory() {
+        return sslHandlerFactory;
+    }
+
     @SuppressWarnings("checkstyle:FallThrough")
     private void validateConfiguration() {
         Preconditions.checkNotNull(clientProtocol, " ");
         switch (clientProtocol) {
+            case TLS:
             case SSH:
-                validateSshConfiguration();
-                // Fall through intentional (ssh validation is a superset of tcp validation)
+                if (clientProtocol == NetconfClientProtocol.SSH) {
+                    validateSshConfiguration();
+                } else {
+                    validateTlsConfiguration();
+                }
+                // Fall through intentional (ssh or tls validation is a superset of tcp validation)
             case TCP:
                 validateTcpConfiguration();
                 break;
@@ -92,6 +105,10 @@ public class NetconfClientConfiguration {
         }
     }
 
+    protected void validateTlsConfiguration() {
+        Preconditions.checkNotNull(sslHandlerFactory, "sslHandlerFactory");
+    }
+
     protected void validateSshConfiguration() {
         Preconditions.checkNotNull(authHandler, "authHandler");
     }
@@ -117,10 +134,11 @@ public class NetconfClientConfiguration {
                 .add("sessionListener", sessionListener)
                 .add("reconnectStrategy", reconnectStrategy)
                 .add("clientProtocol", clientProtocol)
-                .add("authHandler", authHandler);
+                .add("authHandler", authHandler)
+                .add("sslHandlerFactory", sslHandlerFactory);
     }
 
     public enum NetconfClientProtocol {
-        TCP, SSH
+        TCP, SSH, TLS
     }
 }
\ No newline at end of file
index 73f664cdceaa8dcc18e84affa840b37ca9ed614c..fd1d6276e40ae0e0364c66f2a2d8d0a56ef0c8b9 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netconf.client.conf;
 import java.net.InetSocketAddress;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
+import org.opendaylight.netconf.client.SslHandlerFactory;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 
@@ -26,6 +27,7 @@ public class NetconfClientConfigurationBuilder {
     private ReconnectStrategy reconnectStrategy;
     private AuthenticationHandler authHandler;
     private NetconfClientConfiguration.NetconfClientProtocol clientProtocol = DEFAULT_CLIENT_PROTOCOL;
+    private SslHandlerFactory sslHandlerFactory;
 
     protected NetconfClientConfigurationBuilder() {
     }
@@ -78,6 +80,12 @@ public class NetconfClientConfigurationBuilder {
         return this;
     }
 
+    @SuppressWarnings("checkstyle:hiddenField")
+    public NetconfClientConfigurationBuilder withSslHandlerFactory(final SslHandlerFactory sslHandlerFactory) {
+        this.sslHandlerFactory = sslHandlerFactory;
+        return this;
+    }
+
     final InetSocketAddress getAddress() {
         return address;
     }
@@ -106,8 +114,12 @@ public class NetconfClientConfigurationBuilder {
         return clientProtocol;
     }
 
+    final SslHandlerFactory getSslHandlerFactory() {
+        return sslHandlerFactory;
+    }
+
     public NetconfClientConfiguration build() {
         return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader,
-                sessionListener, reconnectStrategy, authHandler);
+                sessionListener, reconnectStrategy, authHandler, sslHandlerFactory);
     }
 }
index a2512687e4ad569a35adc5bfd5f91472edc62797..3c5931e49d924cd382d947ee89f661d4b6f77419 100644 (file)
@@ -12,6 +12,7 @@ import com.google.common.base.Preconditions;
 import java.net.InetSocketAddress;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
+import org.opendaylight.netconf.client.SslHandlerFactory;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
@@ -26,9 +27,10 @@ public final class NetconfReconnectingClientConfiguration extends NetconfClientC
                                            final NetconfClientSessionListener sessionListener,
                                            final ReconnectStrategy reconnectStrategy,
                                            final ReconnectStrategyFactory connectStrategyFactory,
-                                           final AuthenticationHandler authHandler) {
+                                           final AuthenticationHandler authHandler,
+                                           final SslHandlerFactory sslHandlerFactory) {
         super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
-                authHandler);
+                authHandler, sslHandlerFactory);
         this.connectStrategyFactory = connectStrategyFactory;
         validateReconnectConfiguration();
     }
index e705d3cca62e3fb8798f554d22ceca0f8b90a1c7..4d3dcdaaaba79c6e10b630acb0041f9b0d0c9f5c 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netconf.client.conf;
 import java.net.InetSocketAddress;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
+import org.opendaylight.netconf.client.SslHandlerFactory;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
@@ -36,7 +37,7 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf
     public NetconfReconnectingClientConfiguration build() {
         return new NetconfReconnectingClientConfiguration(getProtocol(), getAddress(), getConnectionTimeoutMillis(),
                 getAdditionalHeader(), getSessionListener(), getReconnectStrategy(), connectStrategyFactory,
-                getAuthHandler());
+                getAuthHandler(), getSslHandlerFactory());
     }
 
     // Override setter methods to return subtype
@@ -81,4 +82,10 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf
             NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
         return (NetconfReconnectingClientConfigurationBuilder) super.withProtocol(clientProtocol);
     }
+
+    @Override
+    public NetconfReconnectingClientConfigurationBuilder withSslHandlerFactory(
+            final SslHandlerFactory sslHandlerFactory) {
+        return (NetconfReconnectingClientConfigurationBuilder) super.withSslHandlerFactory(sslHandlerFactory);
+    }
 }
index e5aec5d402da77928491b2bb0a6b9b9ac8052070..f7e63bb896e752e2cb87939f0f71e2feceb75ae6 100644 (file)
@@ -45,5 +45,23 @@ public class NetconfClientConfigurationTest {
         Assert.assertEquals(strategy, cfg.getReconnectStrategy());
         Assert.assertEquals(NetconfClientConfiguration.NetconfClientProtocol.SSH, cfg.getProtocol());
         Assert.assertEquals(address, cfg.getAddress());
+
+        SslHandlerFactory sslHandlerFactory = Mockito.mock(SslHandlerFactory.class);
+        NetconfClientConfiguration cfg2 = NetconfClientConfigurationBuilder.create()
+                .withProtocol(NetconfClientConfiguration.NetconfClientProtocol.TLS)
+                .withAddress(address)
+                .withConnectionTimeoutMillis(timeout)
+                .withReconnectStrategy(strategy)
+                .withAdditionalHeader(header)
+                .withSessionListener(listener)
+                .withSslHandlerFactory(sslHandlerFactory).build();
+
+        Assert.assertEquals(timeout, cfg2.getConnectionTimeoutMillis());
+        Assert.assertEquals(Optional.fromNullable(header), cfg2.getAdditionalHeader());
+        Assert.assertEquals(listener, cfg2.getSessionListener());
+        Assert.assertEquals(sslHandlerFactory, cfg2.getSslHandlerFactory());
+        Assert.assertEquals(strategy, cfg2.getReconnectStrategy());
+        Assert.assertEquals(NetconfClientConfiguration.NetconfClientProtocol.TLS, cfg2.getProtocol());
+        Assert.assertEquals(address, cfg2.getAddress());
     }
 }
index d6e480014c5b74a4f5576bc9ce36e9c01772ed29..406c19a8c3539fc6da385d77c87798d9c9d593dd 100644 (file)
@@ -51,5 +51,25 @@ public class NetconfReconnectingClientConfigurationTest {
         Assert.assertEquals(NetconfClientConfiguration.NetconfClientProtocol.SSH, cfg.getProtocol());
         Assert.assertEquals(address, cfg.getAddress());
         Assert.assertEquals(reconnect, cfg.getReconnectStrategy());
+
+        SslHandlerFactory sslHandlerFactory = Mockito.mock(SslHandlerFactory.class);
+        NetconfReconnectingClientConfiguration cfg2 = NetconfReconnectingClientConfigurationBuilder.create()
+                .withProtocol(NetconfClientConfiguration.NetconfClientProtocol.TLS)
+                .withAddress(address)
+                .withConnectionTimeoutMillis(timeout)
+                .withReconnectStrategy(reconnect)
+                .withAdditionalHeader(header)
+                .withSessionListener(listener)
+                .withConnectStrategyFactory(strategy)
+                .withSslHandlerFactory(sslHandlerFactory).build();
+
+        Assert.assertEquals(timeout, cfg2.getConnectionTimeoutMillis());
+        Assert.assertEquals(Optional.fromNullable(header), cfg2.getAdditionalHeader());
+        Assert.assertEquals(listener, cfg2.getSessionListener());
+        Assert.assertEquals(sslHandlerFactory, cfg2.getSslHandlerFactory());
+        Assert.assertEquals(strategy, cfg2.getConnectStrategyFactory());
+        Assert.assertEquals(NetconfClientConfiguration.NetconfClientProtocol.TLS, cfg2.getProtocol());
+        Assert.assertEquals(address, cfg2.getAddress());
+        Assert.assertEquals(reconnect, cfg2.getReconnectStrategy());
     }
 }