Prevent NPE's on failures 04/31204/2
authorTomas Cere <tcere@cisco.com>
Fri, 11 Dec 2015 12:23:25 +0000 (13:23 +0100)
committerTomas Cere <tcere@cisco.com>
Tue, 15 Dec 2015 09:33:30 +0000 (10:33 +0100)
Change-Id: I7f69aa4f9a695c7d03cd7db6cd5c539bfd255cdd
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/abstract-topology/src/main/java/org/opendaylight/netconf/topology/InitialStateProvider.java
opendaylight/netconf/abstract-topology/src/main/java/org/opendaylight/netconf/topology/TopologyManagerCallback.java
opendaylight/netconf/abstract-topology/src/main/java/org/opendaylight/netconf/topology/example/ExampleTopologyManagerCallback.java
opendaylight/netconf/abstract-topology/src/main/java/org/opendaylight/netconf/topology/util/BaseTopologyManager.java
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/impl/ClusteredNetconfTopology.java
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/impl/NetconfNodeManagerCallback.java
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyManagerCallback.java
opendaylight/netconf/netconf-topology/src/test/java/org/opendaylight/netconf/topology/ActorTest.java

index ed3623da49fc4e09f21260d70c85a5dc674c6fa1..ae53a9dc797a25a11d0c7e8f19872f7637a1c290 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netconf.topology;
 
 import com.google.common.annotations.Beta;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 
@@ -22,5 +23,5 @@ public interface InitialStateProvider {
     Node getInitialState(@Nonnull final NodeId nodeId, @Nonnull final Node configNode);
 
     @Nonnull
-    Node getFailedState(@Nonnull final NodeId nodeId, @Nonnull final Node configNode);
+    Node getFailedState(@Nonnull final NodeId nodeId, @Nullable final Node configNode);
 }
index ea7d05d98fcce15146dc9b305a92720b00eaab49..8eee06a54ed642af28fa4f3fafff772db45c27f7 100644 (file)
@@ -16,7 +16,7 @@ import com.google.common.annotations.Beta;
  * Customizable extension layer between the top level TopologyManager and NodeManager
  */
 @Beta
-public interface TopologyManagerCallback extends NodeListener, Receiver, RoleChangeListener {
+public interface TopologyManagerCallback extends InitialStateProvider, NodeListener, Receiver, RoleChangeListener {
 
     interface TopologyManagerCallbackFactory {
         TopologyManagerCallback create(ActorSystem actorSystem, String topologyId);
index 76e55acf4ad45fc7e6f85efc22ae7a8d04b66dc2..a2eed6a01954cb3988ad6ff487e8f51c476101a6 100644 (file)
@@ -17,6 +17,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.util.HashMap;
 import java.util.Map;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.netconf.topology.NodeManager;
 import org.opendaylight.netconf.topology.NodeManagerCallback.NodeManagerCallbackFactory;
@@ -147,4 +148,16 @@ public class ExampleTopologyManagerCallback implements TopologyManagerCallback {
     public void onReceive(Object o, ActorRef actorRef) {
 
     }
+
+    @Nonnull
+    @Override
+    public Node getInitialState(@Nonnull NodeId nodeId, @Nonnull Node configNode) {
+        return nodes.get(nodeId).getInitialState(nodeId, configNode);
+    }
+
+    @Nonnull
+    @Override
+    public Node getFailedState(@Nonnull NodeId nodeId, @Nullable Node configNode) {
+        return nodes.get(nodeId).getFailedState(nodeId, configNode);
+    }
 }
index ca55bb0552ee5e5bf4d7ce41e56652f023ee5fec..f3bceab49aa3d0fcb5dd30a10c2f302788f0095d 100644 (file)
@@ -35,7 +35,6 @@ import java.util.Map.Entry;
 import java.util.Random;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.netconf.topology.NodeManager;
 import org.opendaylight.netconf.topology.RoleChangeStrategy;
 import org.opendaylight.netconf.topology.StateAggregator;
 import org.opendaylight.netconf.topology.TopologyManager;
@@ -81,7 +80,6 @@ public final class BaseTopologyManager
     private final String topologyId;
     private final TopologyManagerCallback delegateTopologyHandler;
 
-    private final Map<NodeId, NodeManager> nodes = new HashMap<>();
     private final Map<Address, TopologyManager> peers = new HashMap<>();
     private TopologyManager masterPeer = null;
     private final int id = new Random().nextInt();
@@ -191,7 +189,7 @@ public final class BaseTopologyManager
                 public void onFailure(final Throwable t) {
                     // If the combined connection attempt failed, set the node to connection failed
                     LOG.debug("Futures aggregation failed");
-                    naSalNodeWriter.update(nodeId, nodes.get(nodeId).getFailedState(nodeId, node));
+                    naSalNodeWriter.update(nodeId, delegateTopologyHandler.getFailedState(nodeId, node));
                     // FIXME disconnect those which succeeded
                     // just issue a delete on delegateTopologyHandler that gets handled on lower level
                 }
@@ -250,7 +248,7 @@ public final class BaseTopologyManager
                 @Override
                 public void onFailure(final Throwable t) {
                     // If the combined connection attempt failed, set the node to connection failed
-                    naSalNodeWriter.update(nodeId, nodes.get(nodeId).getFailedState(nodeId, node));
+                    naSalNodeWriter.update(nodeId, delegateTopologyHandler.getFailedState(nodeId, node));
                     // FIXME disconnect those which succeeded
                     // just issue a delete on delegateTopologyHandler that gets handled on lower level
                 }
@@ -376,7 +374,7 @@ public final class BaseTopologyManager
                 public void onFailure(final Throwable t) {
                     // If the combined connection attempt failed, set the node to connection failed
                     LOG.debug("Futures aggregation failed");
-                    naSalNodeWriter.update(nodeId, nodes.get(nodeId).getFailedState(nodeId, null));
+                    naSalNodeWriter.update(nodeId, delegateTopologyHandler.getFailedState(nodeId, null));
                     // FIXME disconnect those which succeeded
                     // just issue a delete on delegateTopologyHandler that gets handled on lower level
                 }
index bf03fe1eaa7c1215697a2f86aaa099e4ca9b38e5..bc472e98d8a9ee9fa79cce10a8c72049c8f38c89 100644 (file)
@@ -118,7 +118,7 @@ public class ClusteredNetconfTopology extends AbstractNetconfTopology implements
     public void close() throws Exception {
         // close all existing connectors, delete whole topology in datastore?
         for (NetconfConnectorDTO connectorDTO : activeConnectors.values()) {
-            connectorDTO.getCommunicator().disconnect();
+            connectorDTO.getCommunicator().close();
         }
         activeConnectors.clear();
     }
index 5f0eb2e179ffe910b1947375984d2e400833aae4..cb74134708409f97355df2041427621e700d61f0 100644 (file)
@@ -181,8 +181,8 @@ public class NetconfNodeManagerCallback implements NodeManagerCallback{
     }
 
     @Nonnull @Override public Node getFailedState(@Nonnull final NodeId nodeId,
-                                                  @Nonnull final Node configNode) {
-        final NetconfNode netconfNode = configNode.getAugmentation(NetconfNode.class);
+                                                  @Nullable final Node configNode) {
+        final NetconfNode netconfNode = configNode == null ? currentOperationalNode.getAugmentation(NetconfNode.class) : configNode.getAugmentation(NetconfNode.class);
 
         return new NodeBuilder()
                 .setNodeId(nodeId)
index eaa5d6cab744d6afc1a8d0b4f12d414bb718d2e3..739aa66eb2df6e452d9ce0291d04fcde614a9450 100644 (file)
@@ -149,4 +149,16 @@ public class NetconfTopologyManagerCallback implements TopologyManagerCallback {
     public void onReceive(Object o, ActorRef actorRef) {
 
     }
+
+    @Nonnull
+    @Override
+    public Node getInitialState(@Nonnull NodeId nodeId, @Nonnull Node configNode) {
+        return nodes.get(nodeId).getInitialState(nodeId, configNode);
+    }
+
+    @Nonnull
+    @Override
+    public Node getFailedState(@Nonnull NodeId nodeId, @Nonnull Node configNode) {
+        return nodes.get(nodeId).getFailedState(nodeId, configNode);
+    }
 }
index 544cb87d21c37a80d36e20ba28c2424b23f38a72..599acc92473dc7c1289f9f4aa1c60503cb1f3120 100644 (file)
@@ -572,6 +572,34 @@ public class ActorTest {
         public void onReceive(Object o, ActorRef actorRef) {
 
         }
+
+        @Nonnull
+        @Override
+        public Node getInitialState(@Nonnull NodeId nodeId, @Nonnull Node configNode) {
+            return new NodeBuilder()
+                    .setNodeId(nodeId)
+                    .addAugmentation(NetconfNode.class,
+                            new NetconfNodeBuilder()
+                                    .setConnectionStatus(ConnectionStatus.Connecting)
+                                    .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
+                                    .setPort(new PortNumber(65535))
+                                    .build())
+                    .build();
+        }
+
+        @Nonnull
+        @Override
+        public Node getFailedState(@Nonnull NodeId nodeId, @Nonnull Node configNode) {
+            return new NodeBuilder()
+                    .setNodeId(nodeId)
+                    .addAugmentation(NetconfNode.class,
+                            new NetconfNodeBuilder()
+                                    .setConnectionStatus(ConnectionStatus.UnableToConnect)
+                                    .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
+                                    .setPort(new PortNumber(65535))
+                                    .build())
+                    .build();
+        }
     }
 
     public class TestingSuccesfulStateAggregator implements StateAggregator {