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 org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
11 import com.google.common.base.Optional;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnector;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnectorBuilder;
15 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
18 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25 import java.util.Map.Entry;
28 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 public class TerminationPointChangeListenerImpl extends DataChangeListenerImpl {
38 private final static Logger LOG = LoggerFactory.getLogger(TerminationPointChangeListenerImpl.class);
40 public TerminationPointChangeListenerImpl(final DataBroker dataBroker, final OperationProcessor operationProcessor) {
41 super(operationProcessor, dataBroker, InstanceIdentifier.builder(Nodes.class).child(Node.class)
42 .child(NodeConnector.class).augmentation(FlowCapableNodeConnector.class).build());
43 this.operationProcessor = operationProcessor;
47 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
48 processAddedTerminationPoints(change.getCreatedData());
49 processUpdatedTerminationPoints(change.getUpdatedData());
50 processRemovedTerminationPoints(change.getRemovedPaths());
56 private void processRemovedTerminationPoints(Set<InstanceIdentifier<?>> removedNodes) {
57 for (final InstanceIdentifier<?> removedNode : removedNodes) {
58 final TpId terminationPointId = provideTopologyTerminationPointId(removedNode);
59 final InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
60 terminationPointId, removedNode);
61 final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> node = iiToTopologyTerminationPoint.firstIdentifierOf(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class);
64 if (iiToTopologyTerminationPoint != null) {
65 operationProcessor.enqueueOperation(new TopologyOperation() {
68 public void applyOperation(ReadWriteTransaction transaction) {
69 Optional<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> nodeOptional = Optional.absent();
71 nodeOptional = transaction.read(LogicalDatastoreType.OPERATIONAL, node).checkedGet();
72 } catch (ReadFailedException e) {
73 LOG.error("Error occured when trying to read NodeConnector ", e);
75 if (nodeOptional.isPresent()) {
76 TopologyManagerUtil.removeAffectedLinks(terminationPointId, transaction, II_TO_TOPOLOGY);
77 transaction.delete(LogicalDatastoreType.OPERATIONAL, iiToTopologyTerminationPoint);
83 LOG.debug("Instance identifier to inventory wasn't translated to topology while deleting termination point.");
91 private void processUpdatedTerminationPoints(Map<InstanceIdentifier<?>, DataObject> updatedData) {
92 // TODO Auto-generated method stub
95 private void processAddedTerminationPoints(Map<InstanceIdentifier<?>, DataObject> addedDatas) {
96 for (Entry<InstanceIdentifier<?>, DataObject> addedData : addedDatas.entrySet()) {
97 createData(addedData.getKey(), addedData.getValue());
101 protected void createData(InstanceIdentifier<?> iiToNodeInInventory, final DataObject data) {
102 TpId terminationPointIdInTopology = provideTopologyTerminationPointId(iiToNodeInInventory);
103 if (terminationPointIdInTopology != null) {
104 InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
105 terminationPointIdInTopology, iiToNodeInInventory);
106 TerminationPoint point = prepareTopologyTerminationPoint(terminationPointIdInTopology, iiToNodeInInventory);
107 sendToTransactionChain(point, iiToTopologyTerminationPoint);
108 if (data instanceof FlowCapableNodeConnector) {
109 removeLinks((FlowCapableNodeConnector) data, point);
113 LOG.debug("Inventory node connector key is null. Data can't be written to topology termination point");
120 private void removeLinks(final FlowCapableNodeConnector flowCapNodeConnector, final TerminationPoint point) {
121 operationProcessor.enqueueOperation(new TopologyOperation() {
124 public void applyOperation(ReadWriteTransaction transaction) {
125 if ((flowCapNodeConnector.getState() != null && flowCapNodeConnector.getState().isLinkDown())
126 || (flowCapNodeConnector.getConfiguration() != null && flowCapNodeConnector.getConfiguration().isPORTDOWN())) {
127 TopologyManagerUtil.removeAffectedLinks(point.getTpId(), transaction, II_TO_TOPOLOGY);
133 private TerminationPoint prepareTopologyTerminationPoint(final TpId terminationPointIdInTopology,
134 final InstanceIdentifier<?> iiToNodeInInventory) {
135 final InventoryNodeConnector inventoryNodeConnector = new InventoryNodeConnectorBuilder()
136 .setInventoryNodeConnectorRef(
137 new NodeConnectorRef(iiToNodeInInventory.firstIdentifierOf(NodeConnector.class))).build();
139 final TerminationPointBuilder terminationPointBuilder = new TerminationPointBuilder();
140 terminationPointBuilder.setTpId(terminationPointIdInTopology);
141 terminationPointBuilder.addAugmentation(InventoryNodeConnector.class, inventoryNodeConnector);
142 return terminationPointBuilder.build();
146 * @param terminationPointIdInTopology
149 private InstanceIdentifier<TerminationPoint> provideIIToTopologyTerminationPoint(TpId terminationPointIdInTopology,
150 InstanceIdentifier<?> iiToNodeInInventory) {
151 NodeId nodeIdInTopology = provideTopologyNodeId(iiToNodeInInventory);
152 if (terminationPointIdInTopology != null && nodeIdInTopology != null) {
153 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> iiToTopologyNode = provideIIToTopologyNode(nodeIdInTopology);
154 return iiToTopologyNode.builder().child(TerminationPoint.class, new TerminationPointKey(terminationPointIdInTopology)).build();
156 LOG.debug("Value of termination point ID in topology is null. Instance identifier to topology can't be built");
162 * @param iiToNodeInInventory
165 private TpId provideTopologyTerminationPointId(InstanceIdentifier<?> iiToNodeInInventory) {
166 NodeConnectorKey inventoryNodeConnectorKey = iiToNodeInInventory.firstKeyOf(NodeConnector.class,
167 NodeConnectorKey.class);
168 if (inventoryNodeConnectorKey != null) {
169 return new TpId(inventoryNodeConnectorKey.getId().getValue());