X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2FAbstractNetconfSessionNegotiator.java;h=7f2d8c30f045fb6830458aa7fd461cc7885e8349;hb=8f15fef884bc20239625850c4a2fcdaf36395526;hp=95d2feb65c482ea564bce7794d61d6360e35f379;hpb=38dbf4451a20bee38ccb5a9c685dcf9fa9d6fb33;p=controller.git diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java index 95d2feb65c..7f2d8c30f0 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java @@ -8,10 +8,9 @@ package org.opendaylight.controller.netconf.util; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; import io.netty.handler.ssl.SslHandler; import io.netty.util.Timeout; import io.netty.util.Timer; @@ -20,35 +19,39 @@ import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.Promise; -import org.opendaylight.controller.netconf.api.NetconfSession; +import java.util.concurrent.TimeUnit; + +import io.netty.channel.ChannelInboundHandlerAdapter; +import org.opendaylight.controller.netconf.api.AbstractNetconfSession; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.api.NetconfSessionListener; import org.opendaylight.controller.netconf.api.NetconfSessionPreferences; import org.opendaylight.controller.netconf.util.handler.FramingMechanismHandlerFactory; -import org.opendaylight.controller.netconf.util.handler.NetconfMessageAggregator; -import org.opendaylight.controller.netconf.util.handler.NetconfMessageChunkDecoder; +import org.opendaylight.controller.netconf.util.handler.NetconfChunkAggregator; +import org.opendaylight.controller.netconf.util.handler.NetconfMessageToXMLEncoder; +import org.opendaylight.controller.netconf.util.handler.NetconfXMLToMessageDecoder; import org.opendaylight.controller.netconf.util.messages.FramingMechanism; -import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; +import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.protocol.framework.AbstractSessionNegotiator; -import org.opendaylight.protocol.framework.SessionListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; -import java.util.concurrent.TimeUnit; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; -public abstract class AbstractNetconfSessionNegotiator

- extends AbstractSessionNegotiator { +public abstract class AbstractNetconfSessionNegotiator

, L extends NetconfSessionListener> +extends AbstractSessionNegotiator { - // TODO what time ? - private static final long INITIAL_HOLDTIMER = 1; private static final Logger logger = LoggerFactory.getLogger(AbstractNetconfSessionNegotiator.class); + public static final String NAME_OF_EXCEPTION_HANDLER = "lastExceptionHandler"; - protected final P sessionPreferences; + private final P sessionPreferences; - private final SessionListener sessionListener; + private final L sessionListener; + private Timeout timeout; /** * Possible states for Finite State Machine @@ -59,30 +62,33 @@ public abstract class AbstractNetconfSessionNegotiator

promise, Channel channel, Timer timer, - SessionListener sessionListener) { + L sessionListener, long connectionTimeoutMillis) { super(promise, channel); this.sessionPreferences = sessionPreferences; this.timer = timer; this.sessionListener = sessionListener; + this.connectionTimeoutMillis = connectionTimeoutMillis; } @Override - protected void startNegotiation() throws Exception { + protected void startNegotiation() { final Optional sslHandler = getSslHandler(channel); if (sslHandler.isPresent()) { Future future = sslHandler.get().handshakeFuture(); future.addListener(new GenericFutureListener>() { @Override - public void operationComplete(Future future) throws Exception { + public void operationComplete(Future future) { Preconditions.checkState(future.isSuccess(), "Ssl handshake was not successful"); logger.debug("Ssl handshake complete"); start(); } }); - } else + } else { start(); + } } private static Optional getSslHandler(Channel channel) { @@ -90,26 +96,41 @@ public abstract class AbstractNetconfSessionNegotiator

absent() : Optional.of(sslHandler); } + public P getSessionPreferences() { + return sessionPreferences; + } + private void start() { final NetconfMessage helloMessage = this.sessionPreferences.getHelloMessage(); logger.debug("Session negotiation started with hello message {}", XmlUtil.toString(helloMessage.getDocument())); - sendMessage(helloMessage); - changeState(State.OPEN_WAIT); + channel.pipeline().addLast(NAME_OF_EXCEPTION_HANDLER, new ExceptionHandlingInboundChannelHandler()); - this.timer.newTimeout(new TimerTask() { + timeout = this.timer.newTimeout(new TimerTask() { @Override - public void run(final Timeout timeout) throws Exception { + public void run(final Timeout timeout) { synchronized (this) { if (state != State.ESTABLISHED) { + logger.debug("Connection timeout after {}, session is in state {}", timeout, state); final IllegalStateException cause = new IllegalStateException( "Session was not established after " + timeout); negotiationFailed(cause); changeState(State.FAILED); + } else if(channel.isOpen()) { + channel.pipeline().remove(NAME_OF_EXCEPTION_HANDLER); } } } - }, INITIAL_HOLDTIMER, TimeUnit.MINUTES); + }, connectionTimeoutMillis, TimeUnit.MILLISECONDS); + + sendMessage(helloMessage); + changeState(State.OPEN_WAIT); + } + + private void cancelTimeout() { + if(timeout!=null) { + timeout.cancel(); + } } private void sendMessage(NetconfMessage message) { @@ -117,43 +138,53 @@ public abstract class AbstractNetconfSessionNegotiator