Topology manager - write to topology reference to inventory
[openflowplugin.git] / applications / topology-manager / src / main / java / org / opendaylight / openflowplugin / applications / topology / manager / TerminationPointChangeListenerImpl.java
1 /**
2  * Copyright (c) 2015 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.openflowplugin.applications.topology.manager;
9
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnector;
11
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnectorBuilder;
14 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
17 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import java.util.Map.Entry;
25 import java.util.Map;
26 import java.util.Set;
27 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35
36 public class TerminationPointChangeListenerImpl extends DataChangeListenerImpl {
37     private final static Logger LOG = LoggerFactory.getLogger(TerminationPointChangeListenerImpl.class);
38
39     public TerminationPointChangeListenerImpl(final DataBroker dataBroker, final OperationProcessor operationProcessor) {
40         super(operationProcessor, dataBroker, InstanceIdentifier.builder(Nodes.class).child(Node.class)
41                 .child(NodeConnector.class).augmentation(FlowCapableNodeConnector.class).build());
42         this.operationProcessor = operationProcessor;
43     }
44
45     @Override
46     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
47         processAddedTerminationPoints(change.getCreatedData());
48         processUpdatedTerminationPoints(change.getUpdatedData());
49         processRemovedTerminationPoints(change.getRemovedPaths());
50     }
51
52     /**
53      * @param removedPaths
54      */
55     private void processRemovedTerminationPoints(Set<InstanceIdentifier<?>> removedNodes) {
56         for (final InstanceIdentifier<?> removedNode : removedNodes) {
57             InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
58                     provideTopologyTerminationPointId(removedNode), removedNode);
59             if (iiToTopologyTerminationPoint != null) {
60                 operationProcessor.enqueueOperation(new TopologyOperation() {
61
62                     @Override
63                     public void applyOperation(ReadWriteTransaction transaction) {
64                         transaction.delete(LogicalDatastoreType.OPERATIONAL, removedNode);
65                     }
66                 });
67
68             } else {
69                 LOG.debug("Instance identifier to inventory wasn't translated to topology while deleting termination point.");
70             }
71         }
72     }
73
74     /**
75      * @param updatedData
76      */
77     private void processUpdatedTerminationPoints(Map<InstanceIdentifier<?>, DataObject> updatedData) {
78         // TODO Auto-generated method stub
79     }
80
81     private void processAddedTerminationPoints(Map<InstanceIdentifier<?>, DataObject> addedDatas) {
82         for (Entry<InstanceIdentifier<?>, DataObject> addedData : addedDatas.entrySet()) {
83             createData(addedData.getKey(), addedData.getValue());
84         }
85     }
86
87     protected void createData(InstanceIdentifier<?> iiToNodeInInventory, final DataObject data) {
88         TpId terminationPointIdInTopology = provideTopologyTerminationPointId(iiToNodeInInventory);
89         if (terminationPointIdInTopology != null) {
90             InstanceIdentifier<TerminationPoint> iiToTopologyTerminationPoint = provideIIToTopologyTerminationPoint(
91                     terminationPointIdInTopology, iiToNodeInInventory);
92             sendToTransactionChain(prepareTopologyTerminationPoint(terminationPointIdInTopology, iiToNodeInInventory),
93                     iiToTopologyTerminationPoint);
94         } else {
95             LOG.debug("Inventory node connector key is null. Data can't be written to topology termination point");
96         }
97     }
98
99     private TerminationPoint prepareTopologyTerminationPoint(final TpId terminationPointIdInTopology,
100             final InstanceIdentifier<?> iiToNodeInInventory) {
101         final InventoryNodeConnector inventoryNodeConnector = new InventoryNodeConnectorBuilder()
102                 .setInventoryNodeConnectorRef(
103                         new NodeConnectorRef(iiToNodeInInventory.firstIdentifierOf(NodeConnector.class))).build();
104
105         final TerminationPointBuilder terminationPointBuilder = new TerminationPointBuilder();
106         terminationPointBuilder.setTpId(terminationPointIdInTopology);
107         terminationPointBuilder.addAugmentation(InventoryNodeConnector.class, inventoryNodeConnector);
108         return terminationPointBuilder.build();
109     }
110
111     /**
112      * @param terminationPointIdInTopology
113      * @return
114      */
115     private InstanceIdentifier<TerminationPoint> provideIIToTopologyTerminationPoint(TpId terminationPointIdInTopology,
116             InstanceIdentifier<?> iiToNodeInInventory) {
117         NodeId nodeIdInTopology = provideTopologyNodeId(iiToNodeInInventory);
118         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> iiToTopologyNode = provideIIToTopologyNode(nodeIdInTopology);
119         return iiToTopologyNode.builder()
120                 .child(TerminationPoint.class, new TerminationPointKey(terminationPointIdInTopology)).build();
121     }
122
123     /**
124      * @param iiToNodeInInventory
125      * @return
126      */
127     private TpId provideTopologyTerminationPointId(InstanceIdentifier<?> iiToNodeInInventory) {
128         NodeConnectorKey inventoryNodeConnectorKey = iiToNodeInInventory.firstKeyOf(NodeConnector.class,
129                 NodeConnectorKey.class);
130         if (inventoryNodeConnectorKey != null) {
131             return new TpId(inventoryNodeConnectorKey.getId().getValue());
132         }
133         return null;
134     }
135
136 }