Merge "BUG-272: remove trailing whitespace from Java files"
[controller.git] / opendaylight / md-sal / topology-manager / src / main / java / org / opendaylight / md / controller / topology / manager / FlowCapableTopologyExporter.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.md.controller.topology.manager;
9
10 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.getNodeConnectorKey;
11 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.getNodeKey;
12 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTerminationPoint;
13 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTerminationPointId;
14 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTopologyLink;
15 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTopologyNode;
16 import static org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.toTopologyNodeId;
17
18 import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader;
19 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkOverutilized;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemoved;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkUtilizationNormal;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44
45 import com.google.common.base.Preconditions;
46
47 class FlowCapableTopologyExporter implements FlowTopologyDiscoveryListener, OpendaylightInventoryListener {
48     private final InstanceIdentifier<Topology> topology;
49     private final OperationProcessor processor;
50
51     FlowCapableTopologyExporter(final OperationProcessor processor, final InstanceIdentifier<Topology> topology) {
52         this.processor = Preconditions.checkNotNull(processor);
53         this.topology = Preconditions.checkNotNull(topology);
54     }
55
56     @Override
57     public void onNodeRemoved(final NodeRemoved notification) {
58         processor.enqueueOperation(new TopologyOperation() {
59             @Override
60             public void applyOperation(final DataModificationTransaction transaction) {
61                 NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeRef()).getId());
62                 InstanceIdentifier<Node> nodeInstance = toNodeIdentifier(notification.getNodeRef());
63                 transaction.removeOperationalData(nodeInstance);
64                 removeAffectedLinks(transaction, nodeId);
65             }
66         });
67     }
68
69     @Override
70     public void onNodeUpdated(final NodeUpdated notification) {
71         FlowCapableNodeUpdated fcnu = notification.getAugmentation(FlowCapableNodeUpdated.class);
72         if (fcnu != null) {
73             processor.enqueueOperation(new TopologyOperation() {
74                 @Override
75                 public void applyOperation(final DataModificationTransaction transaction) {
76                     Node node = toTopologyNode(toTopologyNodeId(notification.getId()), notification.getNodeRef());
77                     InstanceIdentifier<Node> path = getNodePath(toTopologyNodeId(notification.getId()));
78                     transaction.putOperationalData(path, node);
79                 }
80             });
81         }
82     }
83
84     @Override
85     public void onNodeConnectorRemoved(final NodeConnectorRemoved notification) {
86         processor.enqueueOperation(new TopologyOperation() {
87             @Override
88             public void applyOperation(final DataModificationTransaction transaction) {
89                 InstanceIdentifier<TerminationPoint> tpInstance = toTerminationPointIdentifier(notification
90                         .getNodeConnectorRef());
91                 TpId tpId = toTerminationPointId(getNodeConnectorKey(notification.getNodeConnectorRef()).getId());
92
93                 transaction.removeOperationalData(tpInstance);
94                 removeAffectedLinks(transaction, tpId);
95             }
96         });
97     }
98
99     @Override
100     public void onNodeConnectorUpdated(final NodeConnectorUpdated notification) {
101         final FlowCapableNodeConnectorUpdated fcncu = notification.getAugmentation(FlowCapableNodeConnectorUpdated.class);
102         if (fcncu != null) {
103             processor.enqueueOperation(new TopologyOperation() {
104                 @Override
105                 public void applyOperation(final DataModificationTransaction transaction) {
106                     NodeId nodeId = toTopologyNodeId(getNodeKey(notification.getNodeConnectorRef()).getId());
107                     TerminationPoint point = toTerminationPoint(toTerminationPointId(notification.getId()),
108                             notification.getNodeConnectorRef());
109                     InstanceIdentifier<TerminationPoint> path = tpPath(nodeId, point.getKey().getTpId());
110
111                     transaction.putOperationalData(path, point);
112                     if ((fcncu.getState() != null && fcncu.getState().isLinkDown())
113                             || (fcncu.getConfiguration() != null && fcncu.getConfiguration().isPORTDOWN())) {
114                         removeAffectedLinks(transaction, point.getTpId());
115                     }
116                 }
117             });
118         }
119     }
120
121     @Override
122     public void onLinkDiscovered(final LinkDiscovered notification) {
123         processor.enqueueOperation(new TopologyOperation() {
124             @Override
125             public void applyOperation(final DataModificationTransaction transaction) {
126                 Link link = toTopologyLink(notification);
127                 InstanceIdentifier<Link> path = linkPath(link);
128                 transaction.putOperationalData(path, link);
129             }
130         });
131     }
132
133     @Override
134     public void onLinkOverutilized(final LinkOverutilized notification) {
135         // NOOP
136     }
137
138     @Override
139     public void onLinkRemoved(final LinkRemoved notification) {
140         processor.enqueueOperation(new TopologyOperation() {
141             @Override
142             public void applyOperation(final DataModificationTransaction transaction) {
143                 transaction.removeOperationalData(linkPath(toTopologyLink(notification)));
144             }
145         });
146     }
147
148     @Override
149     public void onLinkUtilizationNormal(final LinkUtilizationNormal notification) {
150         // NOOP
151     }
152
153     private InstanceIdentifier<Node> toNodeIdentifier(final NodeRef ref) {
154         org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey invNodeKey = getNodeKey(ref);
155         NodeKey nodeKey = new NodeKey(toTopologyNodeId(invNodeKey.getId()));
156         return topology.child(Node.class, nodeKey);
157     }
158
159     private InstanceIdentifier<TerminationPoint> toTerminationPointIdentifier(final NodeConnectorRef ref) {
160         org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey invNodeKey = getNodeKey(ref);
161         NodeConnectorKey invNodeConnectorKey = getNodeConnectorKey(ref);
162         return tpPath(toTopologyNodeId(invNodeKey.getId()), toTerminationPointId(invNodeConnectorKey.getId()));
163     }
164
165     private void removeAffectedLinks(final DataModificationTransaction transaction, final NodeId id) {
166         TypeSafeDataReader reader = TypeSafeDataReader.forReader(transaction);
167         Topology topologyData = reader.readOperationalData(topology);
168         if (topologyData != null) {
169             for (Link link : topologyData.getLink()) {
170                 if (id.equals(link.getSource().getSourceNode()) || id.equals(link.getDestination().getDestNode())) {
171                     transaction.removeOperationalData(linkPath(link));
172                 }
173             }
174         }
175     }
176
177     private void removeAffectedLinks(final DataModificationTransaction transaction, final TpId id) {
178         TypeSafeDataReader reader = TypeSafeDataReader.forReader(transaction);
179         Topology topologyData = reader.readOperationalData(topology);
180         if (topologyData != null) {
181             for (Link link : topologyData.getLink()) {
182                 if (id.equals(link.getSource().getSourceTp()) || id.equals(link.getDestination().getDestTp())) {
183                     transaction.removeOperationalData(linkPath(link));
184                 }
185             }
186         }
187     }
188
189     private InstanceIdentifier<Node> getNodePath(final NodeId nodeId) {
190         return topology.child(Node.class, new NodeKey(nodeId));
191     }
192
193     private InstanceIdentifier<TerminationPoint> tpPath(final NodeId nodeId, final TpId tpId) {
194         NodeKey nodeKey = new NodeKey(nodeId);
195         TerminationPointKey tpKey = new TerminationPointKey(tpId);
196         return topology.child(Node.class, nodeKey).child(TerminationPoint.class, tpKey);
197     }
198
199     private InstanceIdentifier<Link> linkPath(final Link link) {
200         return topology.child(Link.class, link.getKey());
201     }
202 }