Merge "Fixed GlobalEventExecutorCloseable - override "unsupported opearaion" methods."
[controller.git] / opendaylight / md-sal / topology-manager / src / main / java / org / opendaylight / md / controller / topology / manager / FlowCapableTopologyExporter.xtend
1 package org.opendaylight.md.controller.topology.manager
2
3 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener
4 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered
5 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkOverutilized
6 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemoved
7 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkUtilizationNormal
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
13 import org.opendaylight.controller.sal.binding.api.data.DataProviderService
14 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
15 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef
17 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
18 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
21
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
27 import static extension org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.*
28 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction
29 import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader
30 import com.google.common.collect.FluentIterable
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
32
33 class FlowCapableTopologyExporter implements //
34 FlowTopologyDiscoveryListener, //
35 OpendaylightInventoryListener //
36 {
37
38     var TopologyKey topology;
39
40     @Property
41     var DataProviderService dataService;
42
43     override onNodeRemoved(NodeRemoved notification) {
44         val invNodeKey = notification.nodeRef.nodeKey
45         val tpNodeId = invNodeKey.id.toToplogyNodeId()
46         val tpNodeInstance = notification.nodeRef.toNodeIdentifier()
47
48         val it = dataService.beginTransaction
49         removeRuntimeData(tpNodeInstance);
50         removeAffectedLinks(tpNodeId)
51         commit()
52
53     }
54
55     override onNodeUpdated(NodeUpdated notification) {
56         throw new UnsupportedOperationException("TODO: auto-generated method stub")
57     }
58
59     override onNodeConnectorRemoved(NodeConnectorRemoved notification) {
60         val tpRef = notification.nodeConnectorRef.toTerminationPointIdentifier();
61         val it = dataService.beginTransaction
62         removeRuntimeData(tpRef);
63         commit()
64
65     }
66
67     override onNodeConnectorUpdated(NodeConnectorUpdated notification) {
68         val nodeId = notification.nodeConnectorRef.nodeKey.id.toToplogyNodeId();
69         val TerminationPoint point = notification.toTerminationPoint();
70         val path = tpPath(nodeId, point.key.tpId);
71
72         val it = dataService.beginTransaction
73         putRuntimeData(path, point);
74         commit()
75     }
76
77     override onLinkDiscovered(LinkDiscovered notification) {
78         throw new UnsupportedOperationException("TODO: auto-generated method stub")
79     }
80
81     override onLinkOverutilized(LinkOverutilized notification) {
82         throw new UnsupportedOperationException("TODO: auto-generated method stub")
83     }
84
85     override onLinkRemoved(LinkRemoved notification) {
86         throw new UnsupportedOperationException("TODO: auto-generated method stub")
87
88     }
89
90     override onLinkUtilizationNormal(LinkUtilizationNormal notification) {
91         throw new UnsupportedOperationException("TODO: auto-generated method stub")
92     }
93
94     def InstanceIdentifier<Node> toNodeIdentifier(NodeRef ref) {
95         val invNodeKey = ref.nodeKey
96
97         val nodeKey = new NodeKey(invNodeKey.id.toToplogyNodeId);
98         return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
99             toInstance;
100     }
101
102     def InstanceIdentifier<TerminationPoint> toTerminationPointIdentifier(NodeConnectorRef ref) {
103         val invNodeKey = ref.nodeKey
104         val invNodeConnectorKey = ref.nodeConnectorKey
105         return tpPath(invNodeKey.id.toToplogyNodeId(), invNodeConnectorKey.id.toTerminationPointId())
106     }
107
108     private def void removeAffectedLinks(DataModificationTransaction transaction, NodeId id) {
109         val reader = TypeSafeDataReader.forReader(transaction)
110         val topologyPath = InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).toInstance;
111         val topologyData = reader.readOperationalData(topologyPath);
112         if (topologyData === null) {
113             return;
114         }
115         val affectedLinkInstances = FluentIterable.from(topologyData.link).filter[
116             source.sourceNode == id || destination.destNode == id].transform [
117             //
118             InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).child(Link, key).toInstance
119         //
120         ]
121         for(affectedLink : affectedLinkInstances) {
122             transaction.removeRuntimeData(affectedLink);
123         }
124     }
125     
126     private def InstanceIdentifier<TerminationPoint> tpPath(NodeId nodeId, TpId tpId) {
127         val nodeKey = new NodeKey(nodeId);
128         val tpKey = new TerminationPointKey(tpId)
129         return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey).
130             child(TerminationPoint, tpKey).toInstance;
131     }
132 }