From 7bf7d3fd39c6966a2414d4ca6fd77d195021c1f8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 29 Jul 2022 19:37:09 +0200 Subject: [PATCH] Teach netconf-client abount maximum incoming chunk size 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 --- .../client/NetconfClientDispatcherImpl.java | 2 +- .../NetconfClientSessionNegotiator.java | 7 +++--- ...NetconfClientSessionNegotiatorFactory.java | 23 ++++++++++++++++++- .../conf/NetconfClientConfiguration.java | 10 ++++++-- .../NetconfClientConfigurationBuilder.java | 22 ++++++++++++++++-- ...etconfReconnectingClientConfiguration.java | 6 +++-- ...econnectingClientConfigurationBuilder.java | 8 ++++--- .../NetconfClientSessionNegotiatorTest.java | 4 +--- 8 files changed, 65 insertions(+), 17 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 2b3634d7c6..e1754111b6 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 @@ -138,7 +138,7 @@ public class NetconfClientDispatcherImpl final List 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. diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiator.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiator.java index a15dd2747e..0c98fa3f42 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiator.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiator.java @@ -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 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; } diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java index 8a8cb2927d..6215f4f0a8 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java @@ -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 additionalHeader; + private final @NonNegative int maximumIncomingChunkSize; private final Set 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 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 additionalHeader, final long connectionTimeoutMillis, final Set capabilities) { @@ -93,11 +104,21 @@ public class NetconfClientSessionNegotiatorFactory final Optional additionalHeader, final long connectionTimeoutMillis, final EXIParameters exiOptions, final Set capabilities) { + this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, capabilities, + AbstractNetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE); + } + + public NetconfClientSessionNegotiatorFactory(final Timer timer, + final Optional additionalHeader, + final long connectionTimeoutMillis, final EXIParameters exiOptions, + final Set 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); } } 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 cf8d8030d2..c1edb5abc8 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 @@ -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 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 odlHelloCapabilities) { + final List 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: 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 9101315379..09002ab1e4 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 @@ -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 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); } } 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 d6d7d586d1..e9d4889d9b 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 @@ -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 odlHelloCapabilities) { + final List 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(); } 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 c430fa41a4..177f452f3d 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 @@ -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 odlHelloCapabilities) { + public NetconfReconnectingClientConfigurationBuilder withOdlHelloCapabilities( + final List odlHelloCapabilities) { return (NetconfReconnectingClientConfigurationBuilder) super.withOdlHelloCapabilities(odlHelloCapabilities); } } diff --git a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java index 29a6879817..5714eb4b6c 100644 --- a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java +++ b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java @@ -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 promise = mock(Promise.class); -- 2.36.6