2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.applications.topology.manager;
10 import java.util.Collection;
11 import java.util.Optional;
12 import java.util.concurrent.ExecutionException;
13 import javax.annotation.PreDestroy;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.apache.aries.blueprint.annotation.service.Reference;
17 import org.opendaylight.mdsal.binding.api.DataBroker;
18 import org.opendaylight.mdsal.binding.api.DataTreeModification;
19 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnectorBuilder;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
37 public class TerminationPointChangeListenerImpl extends DataTreeChangeListenerImpl<FlowCapableNodeConnector> {
38 private static final Logger LOG = LoggerFactory.getLogger(TerminationPointChangeListenerImpl.class);
41 public TerminationPointChangeListenerImpl(@Reference final DataBroker dataBroker,
42 final OperationProcessor operationProcessor) {
43 super(operationProcessor, dataBroker,
44 InstanceIdentifier.builder(Nodes.class).child(Node.class).child(NodeConnector.class)
45 .augmentation(FlowCapableNodeConnector.class).build());
46 this.operationProcessor = operationProcessor;
50 public void onDataTreeChanged(final Collection<DataTreeModification<FlowCapableNodeConnector>> modifications) {
51 for (DataTreeModification<FlowCapableNodeConnector> modification : modifications) {
52 switch (modification.getRootNode().getModificationType()) {
54 processAddedTerminationPoints(modification);
56 case SUBTREE_MODIFIED:
57 processUpdatedTerminationPoints(modification);
60 processRemovedTerminationPoints(modification);
63 throw new IllegalArgumentException(
64 "Unhandled modification type: {}" + modification.getRootNode().getModificationType());
75 private void processRemovedTerminationPoints(final DataTreeModification<FlowCapableNodeConnector> modification) {
76 final InstanceIdentifier<FlowCapableNodeConnector> removedNode = modification.getRootPath().getRootIdentifier();
77 final TpId terminationPointId = provideTopologyTerminationPointId(removedNode);
78 final InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
79 terminationPointId, removedNode);
81 if (iiToTopologyTerminationPoint != null) {
82 final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology
83 .rev131021.network.topology.topology.Node>
84 node = iiToTopologyTerminationPoint.firstIdentifierOf(
85 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network
86 .topology.topology.Node.class);
87 operationProcessor.enqueueOperation(manager -> {
88 Optional<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network
89 .topology.topology.Node>
90 nodeOptional = Optional.empty();
92 nodeOptional = manager.readFromTransaction(LogicalDatastoreType.OPERATIONAL, node).get();
93 } catch (InterruptedException | ExecutionException e) {
94 LOG.warn("Error occurred when trying to read NodeConnector: {}", e.getMessage());
95 LOG.debug("Error occurred when trying to read NodeConnector.. ", e);
97 if (nodeOptional.isPresent()) {
98 TopologyManagerUtil.removeAffectedLinks(terminationPointId, manager, II_TO_TOPOLOGY);
99 manager.addDeleteOperationToTxChain(LogicalDatastoreType.OPERATIONAL,
100 iiToTopologyTerminationPoint);
105 "Instance identifier to inventory wasn't translated to topology while deleting termination point.");
109 private void processUpdatedTerminationPoints(final DataTreeModification<FlowCapableNodeConnector> modification) {
110 // TODO Auto-generated method stub
113 private void processAddedTerminationPoints(final DataTreeModification<FlowCapableNodeConnector> modification) {
114 final InstanceIdentifier<FlowCapableNodeConnector> iiToNodeInInventory = modification.getRootPath()
115 .getRootIdentifier();
116 TpId terminationPointIdInTopology = provideTopologyTerminationPointId(iiToNodeInInventory);
117 if (terminationPointIdInTopology != null) {
118 InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
119 terminationPointIdInTopology, iiToNodeInInventory);
120 TerminationPoint point = prepareTopologyTerminationPoint(terminationPointIdInTopology, iiToNodeInInventory);
121 sendToTransactionChain(point, iiToTopologyTerminationPoint);
122 removeLinks(modification.getRootNode().getDataAfter(), point);
124 LOG.debug("Inventory node connector key is null. Data can't be written to topology termination point");
128 private void removeLinks(final FlowCapableNodeConnector flowCapNodeConnector, final TerminationPoint point) {
129 operationProcessor.enqueueOperation(manager -> {
130 if (flowCapNodeConnector.getState() != null && flowCapNodeConnector.getState().getLinkDown()
131 || flowCapNodeConnector.getConfiguration() != null
132 && flowCapNodeConnector.getConfiguration().getPORTDOWN()) {
133 TopologyManagerUtil.removeAffectedLinks(point.getTpId(), manager, II_TO_TOPOLOGY);
138 private static TerminationPoint prepareTopologyTerminationPoint(final TpId terminationPointIdInTopology,
140 InstanceIdentifier<FlowCapableNodeConnector>
141 iiToNodeInInventory) {
142 return new TerminationPointBuilder()
143 .setTpId(terminationPointIdInTopology)
144 .addAugmentation(new InventoryNodeConnectorBuilder()
145 .setInventoryNodeConnectorRef(
146 new NodeConnectorRef(iiToNodeInInventory.firstIdentifierOf(NodeConnector.class)))
151 private InstanceIdentifier<TerminationPoint> provideIIToTopologyTerminationPoint(
152 final TpId terminationPointIdInTopology,
153 final InstanceIdentifier<FlowCapableNodeConnector> iiToNodeInInventory) {
154 NodeId nodeIdInTopology = provideTopologyNodeId(iiToNodeInInventory);
155 if (terminationPointIdInTopology != null && nodeIdInTopology != null) {
156 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology
157 .rev131021.network.topology.topology.Node>
158 iiToTopologyNode = provideIIToTopologyNode(nodeIdInTopology);
159 return iiToTopologyNode.builder()
160 .child(TerminationPoint.class, new TerminationPointKey(terminationPointIdInTopology)).build();
163 "Value of termination point ID in topology is null. Instance identifier to topology can't be "
169 private static TpId provideTopologyTerminationPointId(
170 final InstanceIdentifier<FlowCapableNodeConnector> iiToNodeInInventory) {
171 NodeConnectorKey inventoryNodeConnectorKey = iiToNodeInInventory.firstKeyOf(NodeConnector.class);
172 if (inventoryNodeConnectorKey != null) {
173 return new TpId(inventoryNodeConnectorKey.getId().getValue());