Fixed topology-manager now that we have topology-lldp-discovery
[controller.git] / opendaylight / md-sal / topology-manager / src / main / java / org / opendaylight / md / controller / topology / manager / FlowCapableTopologyExporter.xtend
index fb129e47106a363d99f6729a3fd53490448b488c..de61daeae3380f35fee50acf43aeebc766416c5c 100644 (file)
 package org.opendaylight.md.controller.topology.manager
 
+import com.google.common.collect.FluentIterable
+import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader
+import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkOverutilized
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemoved
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkUtilizationNormal
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyBuilder
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
-
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
+
 import static extension org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.*
-import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction
-import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader
-import com.google.common.collect.FluentIterable
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
 
 class FlowCapableTopologyExporter implements //
 FlowTopologyDiscoveryListener, //
 OpendaylightInventoryListener //
 {
 
-    var TopologyKey topology;
+    var TopologyKey topology = new TopologyKey(new TopologyId("flow:1"));
 
     @Property
     var DataProviderService dataService;
+    
+    def start() {
+        val tb = new TopologyBuilder();
+        tb.setKey(topology);
+        val path = InstanceIdentifier.builder(NetworkTopology).child(Topology,topology).toInstance;
+        val top = tb.build();
+        val it = dataService.beginTransaction
+        putOperationalData(path,top);
+        commit()       
+    }
 
     override onNodeRemoved(NodeRemoved notification) {
-        val invNodeKey = notification.nodeRef.nodeKey
-        val tpNodeId = invNodeKey.id.toToplogyNodeId()
-        val tpNodeInstance = notification.nodeRef.toNodeIdentifier()
+        val nodeId = notification.nodeRef.nodeKey.id.toToplogyNodeId()
+        val nodeInstance = notification.nodeRef.toNodeIdentifier()
 
         val it = dataService.beginTransaction
-        removeRuntimeData(tpNodeInstance);
-        removeAffectedLinks(tpNodeId)
+        removeOperationalData(nodeInstance);
+        removeAffectedLinks(it,nodeId)
         commit()
 
     }
 
     override onNodeUpdated(NodeUpdated notification) {
-        throw new UnsupportedOperationException("TODO: auto-generated method stub")
+        val fcnu = notification.getAugmentation(FlowCapableNodeUpdated)
+        if(fcnu != null) {
+            val node = notification.id.toToplogyNodeId.toTopologyNode(notification.nodeRef)
+            val path = notification.id.toToplogyNodeId.nodePath;
+            val it = dataService.beginTransaction
+            putOperationalData(path, node);
+            commit()
+        }
     }
 
     override onNodeConnectorRemoved(NodeConnectorRemoved notification) {
-        val tpRef = notification.nodeConnectorRef.toTerminationPointIdentifier();
+        val tpInstance = notification.nodeConnectorRef.toTerminationPointIdentifier;
+        val tpId = notification.nodeConnectorRef.nodeConnectorKey.id.toTerminationPointId;
         val it = dataService.beginTransaction
-        removeRuntimeData(tpRef);
+        removeOperationalData(tpInstance);
+        removeAffectedLinks(it,tpId)
         commit()
 
     }
 
     override onNodeConnectorUpdated(NodeConnectorUpdated notification) {
-        val nodeId = notification.nodeConnectorRef.nodeKey.id.toToplogyNodeId();
-        val TerminationPoint point = notification.toTerminationPoint();
-        val path = tpPath(nodeId, point.key.tpId);
-
-        val it = dataService.beginTransaction
-        putRuntimeData(path, point);
-        commit()
+        val fcncu = notification.getAugmentation(FlowCapableNodeConnectorUpdated)
+        if(fcncu != null) {
+            val nodeId = notification.nodeConnectorRef.nodeKey.id.toToplogyNodeId;
+            val TerminationPoint point = notification.id.toTerminationPointId.toTerminationPoint(notification.nodeConnectorRef);
+            val path = tpPath(nodeId, point.key.tpId);
+    
+            val it = dataService.beginTransaction
+            putOperationalData(path, point);
+            commit()     
+       }
     }
 
     override onLinkDiscovered(LinkDiscovered notification) {
-        throw new UnsupportedOperationException("TODO: auto-generated method stub")
+        val link = notification.toTopologyLink;
+        val path = link.linkPath;
+        val it = dataService.beginTransaction
+        putOperationalData(path, link);
+        commit()
     }
 
     override onLinkOverutilized(LinkOverutilized notification) {
-        throw new UnsupportedOperationException("TODO: auto-generated method stub")
+        // NOOP
     }
 
     override onLinkRemoved(LinkRemoved notification) {
-        throw new UnsupportedOperationException("TODO: auto-generated method stub")
-
+        val path = notification.toTopologyLink.linkPath
+        val it = dataService.beginTransaction
+        removeOperationalData(path);
+        commit()
     }
 
     override onLinkUtilizationNormal(LinkUtilizationNormal notification) {
-        throw new UnsupportedOperationException("TODO: auto-generated method stub")
+        // NOOP
     }
 
     def InstanceIdentifier<Node> toNodeIdentifier(NodeRef ref) {
         val invNodeKey = ref.nodeKey
 
         val nodeKey = new NodeKey(invNodeKey.id.toToplogyNodeId);
-        return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
+        return InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
             toInstance;
     }
 
@@ -107,7 +138,7 @@ OpendaylightInventoryListener //
 
     private def void removeAffectedLinks(DataModificationTransaction transaction, NodeId id) {
         val reader = TypeSafeDataReader.forReader(transaction)
-        val topologyPath = InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).toInstance;
+        val topologyPath = InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).toInstance;
         val topologyData = reader.readOperationalData(topologyPath);
         if (topologyData === null) {
             return;
@@ -115,18 +146,52 @@ OpendaylightInventoryListener //
         val affectedLinkInstances = FluentIterable.from(topologyData.link).filter[
             source.sourceNode == id || destination.destNode == id].transform [
             //
-            InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).child(Link, key).toInstance
+            InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Link, key).toInstance
         //
         ]
         for(affectedLink : affectedLinkInstances) {
-            transaction.removeRuntimeData(affectedLink);
+            transaction.removeOperationalData(affectedLink);
         }
     }
     
+    private def void removeAffectedLinks(DataModificationTransaction transaction, TpId id) {
+        val reader = TypeSafeDataReader.forReader(transaction)
+        val topologyPath = InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).toInstance;
+        val topologyData = reader.readOperationalData(topologyPath);
+        if (topologyData === null) {
+            return;
+        }
+        val affectedLinkInstances = FluentIterable.from(topologyData.link).filter[
+            source.sourceTp == id || destination.destTp == id].transform [
+            //
+            InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Link, key).toInstance
+        //
+        ]
+        for(affectedLink : affectedLinkInstances) {
+            transaction.removeOperationalData(affectedLink);
+        }
+    }
+    
+    private def InstanceIdentifier<Node> nodePath(NodeId nodeId) {
+        val nodeKey = new NodeKey(nodeId);
+        return InstanceIdentifier.builder(NetworkTopology)
+            .child(Topology, topology)
+            .child(Node, nodeKey)
+            .toInstance;
+    }
+    
     private def InstanceIdentifier<TerminationPoint> tpPath(NodeId nodeId, TpId tpId) {
         val nodeKey = new NodeKey(nodeId);
         val tpKey = new TerminationPointKey(tpId)
-        return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
+        return InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
             child(TerminationPoint, tpKey).toInstance;
     }
+    
+    private def InstanceIdentifier<Link> linkPath(Link link) {
+        val linkInstanceId = InstanceIdentifier.builder(NetworkTopology)
+            .child(Topology, topology)
+            .child(Link, link.key)
+            .toInstance;
+        return linkInstanceId;
+    }    
 }