Add completeable future to NetconfDeviceCommunicator 45/27045/13
authorTomas Cere <tcere@cisco.com>
Wed, 16 Sep 2015 12:16:42 +0000 (14:16 +0200)
committerTomas Cere <tcere@cisco.com>
Mon, 5 Oct 2015 12:02:53 +0000 (14:02 +0200)
Add a future that completes when first connection attemp succeeds.

Change-Id: I68c31bb75ed0576a79257a0c6ddb9eef0cd64c74
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java

index 02f50b4221729d900cea95c5bcef38ded0cae737..2765712e596758f71d11dd6f2bd5290b5fba1a60 100644 (file)
@@ -12,6 +12,7 @@ import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import io.netty.util.concurrent.Future;
 import io.netty.util.concurrent.FutureListener;
 import io.netty.util.concurrent.GenericFutureListener;
@@ -55,7 +56,9 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
     // TODO implement concurrent message limit
     private final Queue<Request> requests = new ArrayDeque<>();
     private NetconfClientSession session;
+
     private Future<?> initFuture;
+    private SettableFuture<NetconfDeviceCapabilities> firstConnectionFuture;
 
     public NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice,
             final NetconfSessionPreferences NetconfSessionPreferences) {
@@ -72,6 +75,7 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
         this.id = id;
         this.remoteDevice = remoteDevice;
         this.overrideNetconfCapabilities = overrideNetconfCapabilities;
+        this.firstConnectionFuture = SettableFuture.create();
     }
 
     @Override
@@ -93,14 +97,25 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
                         id, netconfSessionPreferences);
             }
 
+
             remoteDevice.onRemoteSessionUp(netconfSessionPreferences, this);
+            if (!firstConnectionFuture.isDone()) {
+                firstConnectionFuture.set(netconfSessionPreferences.getNetconfDeviceCapabilities());
+            }
         }
         finally {
             sessionLock.unlock();
         }
     }
 
-    public void initializeRemoteConnection(final NetconfClientDispatcher dispatcher, final NetconfClientConfiguration config) {
+    /**
+     *
+     * @param dispatcher
+     * @param config
+     * @return future that returns succes on first succesfull connection and failure when the underlying
+     * reconnecting strategy runs out of reconnection attempts
+     */
+    public ListenableFuture<NetconfDeviceCapabilities> initializeRemoteConnection(final NetconfClientDispatcher dispatcher, final NetconfClientConfiguration config) {
         // TODO 2313 extract listener from configuration
         if(config instanceof NetconfReconnectingClientConfiguration) {
             initFuture = dispatcher.createReconnectingClient((NetconfReconnectingClientConfiguration) config);
@@ -116,10 +131,13 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
                 if (!future.isSuccess() && !future.isCancelled()) {
                     LOG.debug("{}: Connection failed", id, future.cause());
                     NetconfDeviceCommunicator.this.remoteDevice.onRemoteSessionFailed(future.cause());
+                    if (firstConnectionFuture.isDone()) {
+                        firstConnectionFuture.setException(future.cause());
+                    }
                 }
             }
         });
-
+        return firstConnectionFuture;
     }
 
     public void disconnect() {