BUG 5014 - init topology for config datastore 96/33196/2
authorTomas Cere <tcere@cisco.com>
Thu, 21 Jan 2016 09:16:07 +0000 (10:16 +0100)
committerTomas Cere <tcere@cisco.com>
Thu, 21 Jan 2016 09:52:01 +0000 (10:52 +0100)
this adds initialization for both clustered and non-clustered version
of the feature.

Change-Id: Ia0bd0226853bdcaf9b1510a9a7ff3281209e2c33
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/impl/TopologyNodeWriter.java

index 73d238d1d3cf1edde28367fa51e381239d9f5813..0a147409038fa6e0597ef090eadab2d7466594c3 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.netconf.topology.impl;
 
 import akka.actor.ActorContext;
 import akka.actor.ActorRef;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
 import io.netty.util.concurrent.EventExecutor;
 import java.util.Collection;
 import javax.annotation.Nonnull;
@@ -20,6 +22,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
@@ -32,9 +35,16 @@ import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
 import org.opendaylight.netconf.topology.AbstractNetconfTopology;
 import org.opendaylight.netconf.topology.SchemaRepositoryProvider;
 import org.opendaylight.netconf.topology.pipeline.TopologyMountPointFacade.ConnectionStatusListenerRegistration;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
 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.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -97,10 +107,27 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology implements Data
     public void onSessionInitiated(ProviderContext session) {
         dataBroker = session.getSALService(DataBroker.class);
 
-        LOG.warn("Registering datastore listener");
+        final WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
+        initTopology(wtx, LogicalDatastoreType.CONFIGURATION);
+        initTopology(wtx, LogicalDatastoreType.OPERATIONAL);
+        Futures.addCallback(wtx.submit(), new FutureCallback<Void>() {
+            @Override
+            public void onSuccess(Void result) {
+                LOG.debug("topology initialization successful");
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                LOG.error("Unable to initialize netconf-topology, {}", t);
+            }
+        });
+
+        LOG.debug("Registering datastore listener");
         datastoreListenerRegistration =
                 dataBroker.registerDataTreeChangeListener(
                         new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, createTopologyId(topologyId).child(Node.class)), this);
+
+
     }
 
     @Override
@@ -129,4 +156,12 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology implements Data
         }
     }
 
+    private void initTopology(final WriteTransaction wtx, final LogicalDatastoreType datastoreType) {
+        final NetworkTopology networkTopology = new NetworkTopologyBuilder().build();
+        final InstanceIdentifier<NetworkTopology> networkTopologyId = InstanceIdentifier.builder(NetworkTopology.class).build();
+        wtx.merge(datastoreType, networkTopologyId, networkTopology);
+        final Topology topology = new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).build();
+        wtx.merge(datastoreType, networkTopologyId.child(Topology.class, new TopologyKey(new TopologyId(topologyId))), topology);
+    }
+
 }
index b0a84a9e54d3a32c310fbeb11a580deb75b77b21..a659db80f166ad950f8966f21891d2d577ece5e5 100644 (file)
@@ -72,7 +72,8 @@ public class TopologyNodeWriter implements NodeWriter{
 
         // write an empty topology container at the start
         final WriteTransaction wTx = txChain.newWriteOnlyTransaction();
-        createNetworkTopologyIfNotPresent(wTx);
+        createNetworkTopologyIfNotPresent(wTx, LogicalDatastoreType.OPERATIONAL);
+        createNetworkTopologyIfNotPresent(wTx, LogicalDatastoreType.CONFIGURATION);
         commitTransaction(wTx, "init topology container", new NodeId("topology-netconf"));
     }
 
@@ -82,7 +83,7 @@ public class TopologyNodeWriter implements NodeWriter{
         try {
             final WriteTransaction writeTx = txChain.newWriteOnlyTransaction();
 
-            createNetworkTopologyIfNotPresent(writeTx);
+            createNetworkTopologyIfNotPresent(writeTx, LogicalDatastoreType.OPERATIONAL);
             final InstanceIdentifier<Node> path = createBindingPathForTopology(new NodeKey(id), topologyId);
 
             LOG.trace("{}: Init device state transaction {} putting if absent operational data started. Putting data on path {}",
@@ -160,17 +161,17 @@ public class TopologyNodeWriter implements NodeWriter{
         });
     }
 
-    private void createNetworkTopologyIfNotPresent(final WriteTransaction writeTx) {
+    private void createNetworkTopologyIfNotPresent(final WriteTransaction writeTx, final LogicalDatastoreType datastoreType) {
 
         final NetworkTopology networkTopology = new NetworkTopologyBuilder().build();
         LOG.trace("{}: Merging {} container to ensure its presence", topologyId,
                 NetworkTopology.QNAME, writeTx.getIdentifier());
-        writeTx.merge(LogicalDatastoreType.OPERATIONAL, networkTopologyPath, networkTopology);
+        writeTx.merge(datastoreType, networkTopologyPath, networkTopology);
 
         final Topology topology = new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).build();
         LOG.trace("{}: Merging {} container to ensure its presence", topologyId,
                 Topology.QNAME, writeTx.getIdentifier());
-        writeTx.merge(LogicalDatastoreType.OPERATIONAL, topologyListPath, topology);
+        writeTx.merge(datastoreType, topologyListPath, topology);
     }
 
     private static InstanceIdentifier<Node> createBindingPathForTopology(final NodeKey key, final String topologyId) {