Teach netconf-client abount maximum incoming chunk size 24/101924/5
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 29 Jul 2022 17:37:09 +0000 (19:37 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 18 Aug 2022 21:54:03 +0000 (23:54 +0200)
Negotiators can specify custom maximum chunk size, this patch teaches
netconf-client's configuration to take advantage of that.

JIRA: NETCONF-897
Change-Id: I3ae11a860a61b4fb061ca785a545a38381b90e7c
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/NetconfClientSessionNegotiator.java
netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.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/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java

index 2b3634d7c62e814c21ee79f6081a058bba8dfc7c..e1754111b6f79c98cebd99656a219db4157b254c 100644 (file)
@@ -138,7 +138,7 @@ public class NetconfClientDispatcherImpl
         final List<Uri> odlHelloCapabilities = cfg.getOdlHelloCapabilities();
         if (odlHelloCapabilities == null || odlHelloCapabilities.isEmpty()) {
             return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
-                    cfg.getConnectionTimeoutMillis());
+                    cfg.getConnectionTimeoutMillis(), cfg.getMaximumIncomingChunkSize());
         }
 
         // LinkedHashSet since perhaps the device cares about order of hello message capabilities.
index a15dd2747ed3e9e5a36102930fda5bdd0894912e..0c98fa3f42edf08fbc86c90e7b515c514fe9ce6e 100644 (file)
@@ -19,6 +19,7 @@ import io.netty.util.concurrent.Promise;
 import java.util.Set;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpression;
+import org.checkerframework.checker.index.qual.NonNegative;
 import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.api.NetconfMessage;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
@@ -54,9 +55,9 @@ class NetconfClientSessionNegotiator
 
     NetconfClientSessionNegotiator(final NetconfHelloMessage hello, final NetconfStartExiMessage startExi,
             final Promise<NetconfClientSession> promise, final Channel channel, final Timer timer,
-            final NetconfClientSessionListener sessionListener, final long connectionTimeoutMillis) {
-        super(hello, promise, channel, timer, sessionListener, connectionTimeoutMillis,
-            DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE);
+            final NetconfClientSessionListener sessionListener, final long connectionTimeoutMillis,
+            final @NonNegative int maximumIncomingChunkSize) {
+        super(hello, promise, channel, timer, sessionListener, connectionTimeoutMillis, maximumIncomingChunkSize);
         this.startExi = startExi;
     }
 
index 8a8cb2927d618e09365b995dbe82b816202f2bfa..6215f4f0a82b2db3e8f21f06400a74e27d749ce7 100644 (file)
@@ -15,10 +15,12 @@ import io.netty.util.Timer;
 import io.netty.util.concurrent.Promise;
 import java.util.Optional;
 import java.util.Set;
+import org.checkerframework.checker.index.qual.NonNegative;
 import org.opendaylight.netconf.api.NetconfSessionListenerFactory;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
 import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory;
 import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
 import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
@@ -65,6 +67,7 @@ public class NetconfClientSessionNegotiatorFactory
     }
 
     private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
+    private final @NonNegative int maximumIncomingChunkSize;
     private final Set<String> clientCapabilities;
     private final long connectionTimeoutMillis;
     private final Timer timer;
@@ -76,6 +79,14 @@ public class NetconfClientSessionNegotiatorFactory
         this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS);
     }
 
+    public NetconfClientSessionNegotiatorFactory(final Timer timer,
+                                                 final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
+                                                 final long connectionTimeoutMillis,
+                                                 final @NonNegative int maximumIncomingChunkSize) {
+        this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS, EXI_CLIENT_CAPABILITIES,
+            maximumIncomingChunkSize);
+    }
+
     public NetconfClientSessionNegotiatorFactory(final Timer timer,
                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
                                                  final long connectionTimeoutMillis, final Set<String> capabilities) {
@@ -93,11 +104,21 @@ public class NetconfClientSessionNegotiatorFactory
                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
                                                  final long connectionTimeoutMillis, final EXIParameters exiOptions,
                                                  final Set<String> capabilities) {
+        this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, capabilities,
+            AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE);
+    }
+
+    public NetconfClientSessionNegotiatorFactory(final Timer timer,
+                                                 final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
+                                                 final long connectionTimeoutMillis, final EXIParameters exiOptions,
+                                                 final Set<String> capabilities,
+                                                 final @NonNegative int maximumIncomingChunkSize) {
         this.timer = requireNonNull(timer);
         this.additionalHeader = additionalHeader;
         this.connectionTimeoutMillis = connectionTimeoutMillis;
         options = exiOptions;
         clientCapabilities = capabilities;
+        this.maximumIncomingChunkSize = maximumIncomingChunkSize;
     }
 
     public long getConnectionTimeoutMillis() {
@@ -111,6 +132,6 @@ public class NetconfClientSessionNegotiatorFactory
         return new NetconfClientSessionNegotiator(
             NetconfHelloMessage.createClientHello(clientCapabilities, additionalHeader),
             NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID), promise, channel, timer,
-                sessionListenerFactory.getSessionListener(), connectionTimeoutMillis);
+                sessionListenerFactory.getSessionListener(), connectionTimeoutMillis, maximumIncomingChunkSize);
     }
 }
index cf8d8030d2604fa90ef901b389cb6728e974a65e..c1edb5abc89b0e313ab732b0287a1455c70887ea 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.base.MoreObjects.ToStringHelper;
 import java.net.InetSocketAddress;
 import java.util.List;
 import java.util.Optional;
+import org.checkerframework.checker.index.qual.NonNegative;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
 import org.opendaylight.netconf.client.SslHandlerFactory;
@@ -25,7 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class NetconfClientConfiguration {
-
     private static final Logger LOG = LoggerFactory.getLogger(NetconfClientConfiguration.class);
 
     private final NetconfClientProtocol clientProtocol;
@@ -42,6 +42,7 @@ public class NetconfClientConfiguration {
     private final NetconfSshClient sshClient;
 
     private final List<Uri> odlHelloCapabilities;
+    private final @NonNegative int maximumIncomingChunkSize;
 
     NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
                                final Long connectionTimeoutMillis,
@@ -49,7 +50,7 @@ public class NetconfClientConfiguration {
                                final NetconfClientSessionListener sessionListener,
                                final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
                                final SslHandlerFactory sslHandlerFactory, final NetconfSshClient sshClient,
-                               final List<Uri> odlHelloCapabilities) {
+                               final List<Uri> odlHelloCapabilities, final @NonNegative int maximumIncomingChunkSize) {
         this.address = address;
         this.connectionTimeoutMillis = connectionTimeoutMillis;
         this.additionalHeader = additionalHeader;
@@ -60,6 +61,7 @@ public class NetconfClientConfiguration {
         this.sslHandlerFactory = sslHandlerFactory;
         this.sshClient = sshClient;
         this.odlHelloCapabilities = odlHelloCapabilities;
+        this.maximumIncomingChunkSize = maximumIncomingChunkSize;
         validateConfiguration();
     }
 
@@ -104,6 +106,10 @@ public class NetconfClientConfiguration {
         return odlHelloCapabilities;
     }
 
+    public @NonNegative int getMaximumIncomingChunkSize() {
+        return maximumIncomingChunkSize;
+    }
+
     private void validateConfiguration() {
         switch (requireNonNull(clientProtocol)) {
             case TLS:
index 91013153797a4eb7893b46a55e261ddcbd51e3ca..09002ab1e430c675c3d17174d0b6aed3e518e979 100644 (file)
@@ -7,11 +7,15 @@
  */
 package org.opendaylight.netconf.client.conf;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.net.InetSocketAddress;
 import java.util.List;
+import org.checkerframework.checker.index.qual.NonNegative;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
 import org.opendaylight.netconf.client.SslHandlerFactory;
+import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator;
 import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
@@ -33,7 +37,8 @@ public class NetconfClientConfigurationBuilder {
     private SslHandlerFactory sslHandlerFactory;
     private NetconfSshClient sshClient;
     private List<Uri> odlHelloCapabilities;
-
+    private @NonNegative int maximumIncomingChunkSize =
+        AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE;
 
     protected NetconfClientConfigurationBuilder() {
     }
@@ -104,6 +109,14 @@ public class NetconfClientConfigurationBuilder {
         return this;
     }
 
+    @SuppressWarnings("checkstyle:hiddenField")
+    public NetconfClientConfigurationBuilder withMaximumIncomingChunkSize(
+            final @NonNegative int maximumIncomingChunkSize) {
+        checkArgument(maximumIncomingChunkSize > 0);
+        this.maximumIncomingChunkSize  = maximumIncomingChunkSize;
+        return this;
+    }
+
     final InetSocketAddress getAddress() {
         return address;
     }
@@ -144,8 +157,13 @@ public class NetconfClientConfigurationBuilder {
         return odlHelloCapabilities;
     }
 
+    final @NonNegative int getMaximumIncomingChunkSize() {
+        return maximumIncomingChunkSize;
+    }
+
     public NetconfClientConfiguration build() {
         return new NetconfClientConfiguration(clientProtocol, address, connectionTimeoutMillis, additionalHeader,
-                sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
+                sessionListener, reconnectStrategy, authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities,
+                maximumIncomingChunkSize);
     }
 }
index d6d7d586d183e0fcec495b104699c38acb2e9ea3..e9d4889d9bdbabf64dcee42711ac6ca68bdfd085 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import java.net.InetSocketAddress;
 import java.util.List;
+import org.checkerframework.checker.index.qual.NonNegative;
 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
 import org.opendaylight.netconf.client.SslHandlerFactory;
@@ -34,9 +35,10 @@ public final class NetconfReconnectingClientConfiguration extends NetconfClientC
                                            final AuthenticationHandler authHandler,
                                            final SslHandlerFactory sslHandlerFactory,
                                            final NetconfSshClient sshClient,
-                                           final List<Uri> odlHelloCapabilities) {
+                                           final List<Uri> odlHelloCapabilities,
+                                           final @NonNegative int maximumIncomingChunkSize) {
         super(clientProtocol, address, connectionTimeoutMillis, additionalHeader, sessionListener, reconnectStrategy,
-                authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities);
+                authHandler, sslHandlerFactory, sshClient, odlHelloCapabilities, maximumIncomingChunkSize);
         this.connectStrategyFactory = connectStrategyFactory;
         validateReconnectConfiguration();
     }
index c430fa41a487f1c93c4fd2379726caf733fa7b8c..177f452f3d17d04993a764beeeb99fefb0795cac 100644 (file)
@@ -40,7 +40,8 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf
     public NetconfReconnectingClientConfiguration build() {
         return new NetconfReconnectingClientConfiguration(getProtocol(), getAddress(), getConnectionTimeoutMillis(),
                 getAdditionalHeader(), getSessionListener(), getReconnectStrategy(), connectStrategyFactory,
-                getAuthHandler(), getSslHandlerFactory(), getSshClient(), getOdlHelloCapabilities());
+                getAuthHandler(), getSslHandlerFactory(), getSshClient(), getOdlHelloCapabilities(),
+                getMaximumIncomingChunkSize());
     }
 
     // Override setter methods to return subtype
@@ -82,7 +83,7 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf
 
     @Override
     public NetconfReconnectingClientConfigurationBuilder withProtocol(
-            NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
+            final NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
         return (NetconfReconnectingClientConfigurationBuilder) super.withProtocol(clientProtocol);
     }
 
@@ -99,7 +100,8 @@ public final class NetconfReconnectingClientConfigurationBuilder extends Netconf
     }
 
     @Override
-    public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(List<Uri> odlHelloCapabilities) {
+    public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities(
+            final List<Uri> odlHelloCapabilities) {
         return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities);
     }
 }
index 29a687981725540a64bfeb70afd48c3c9cad653d..5714eb4b6cdcaafd16ff8015435956253c790636 100644 (file)
@@ -54,7 +54,6 @@ import org.opendaylight.netconf.util.test.XmlFileLoader;
 import org.w3c.dom.Document;
 
 public class NetconfClientSessionNegotiatorTest {
-
     private NetconfHelloMessage helloMessage;
     private ChannelPipeline pipeline;
     private ChannelPromise future;
@@ -136,7 +135,7 @@ public class NetconfClientSessionNegotiatorTest {
         NetconfClientSessionListener sessionListener = mock(NetconfClientSessionListener.class);
         Timer timer = new HashedWheelTimer();
         return new NetconfClientSessionNegotiator(helloMessage, startExi, promise, channel, timer, sessionListener,
-            timeout);
+            timeout, 16384);
     }
 
     private static NetconfHelloMessage createHelloMsg(final String name) throws Exception {
@@ -180,7 +179,6 @@ public class NetconfClientSessionNegotiatorTest {
         verify(promise).setSuccess(any());
     }
 
-
     @Test
     public void testNetconfClientSessionNegotiatorWithEXI() throws Exception {
         Promise<NetconfClientSession> promise = mock(Promise.class);