e22bd0874fb2e94db636b88c482682e32655c41e
[controller.git] / opendaylight / md-sal / statistics-manager / src / main / java / org / opendaylight / controller / md / statistics / manager / StatisticsUpdateHandler.java
1 /*
2  * Copyright IBM Corporation, 2013.  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.controller.md.statistics.manager;
9
10 import java.util.Map;
11 import java.util.Set;
12
13 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
14 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
15 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowStatisticsData;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupDescStats;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
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.inventory.rev130819.nodes.NodeKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterConfigStats;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterStatistics;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.FlowCapableNodeConnectorQueueStatisticsData;
30 import org.opendaylight.yangtools.yang.binding.DataObject;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32
33 /**
34  * Following are two main responsibilities of the class
35  * 1) Listen for the create changes in config data store for tree nodes (Flow,Group,Meter,Queue)
36  * and send statistics request to the switch to fetch the statistics
37  *
38  * 2)Listen for the remove changes in config data store for tree nodes (Flow,Group,Meter,Queue)
39  * and remove the relative statistics data from operational data store.
40  *
41  * @author avishnoi@in.ibm.com
42  *
43  */
44 public class StatisticsUpdateHandler implements DataChangeListener {
45     private final StatisticsProvider statisticsManager;
46
47     public StatisticsUpdateHandler(final StatisticsProvider manager){
48         this.statisticsManager = manager;
49     }
50
51     @SuppressWarnings("unchecked")
52     @Override
53     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
54         Map<InstanceIdentifier<?>, DataObject> additions = change.getCreatedConfigurationData();
55         for (InstanceIdentifier<? extends DataObject> dataObjectInstance : additions.keySet()) {
56             DataObject dataObject = additions.get(dataObjectInstance);
57             NodeKey nodeII = dataObjectInstance.firstKeyOf(Node.class, NodeKey.class);
58             if(dataObject instanceof Flow){
59                 Flow flow = (Flow) dataObject;
60                 this.statisticsManager.sendFlowStatsFromTableRequest(nodeII, flow);
61             }
62             if(dataObject instanceof Meter){
63                 this.statisticsManager.sendMeterConfigStatisticsRequest(nodeII);
64             }
65             if(dataObject instanceof Group){
66                 this.statisticsManager.sendGroupDescriptionRequest(nodeII);
67             }
68             if(dataObject instanceof Queue){
69                 Queue queue = (Queue) dataObject;
70                 InstanceIdentifier<NodeConnector> nodeConnectorII = dataObjectInstance.firstIdentifierOf(NodeConnector.class);
71                 NodeConnectorKey nodeConnectorKey = InstanceIdentifier.keyOf(nodeConnectorII);
72                 this.statisticsManager.sendQueueStatsFromGivenNodeConnector(nodeII, nodeConnectorKey.getId(), queue.getQueueId());
73             }
74         }
75
76         DataModificationTransaction it = this.statisticsManager.startChange();
77         Set<InstanceIdentifier<? extends DataObject>> removals = change.getRemovedConfigurationData();
78         for (InstanceIdentifier<? extends DataObject> dataObjectInstance : removals) {
79             DataObject dataObject = change.getOriginalConfigurationData().get(dataObjectInstance);
80
81             if(dataObject instanceof Flow){
82                 InstanceIdentifier<Flow> flowII = (InstanceIdentifier<Flow>)dataObjectInstance;
83                 InstanceIdentifier<?> flowAugmentation =
84                         InstanceIdentifier.builder(flowII).augmentation(FlowStatisticsData.class).toInstance();
85                 it.removeOperationalData(flowAugmentation);
86             }
87             if(dataObject instanceof Meter){
88                 InstanceIdentifier<Meter> meterII = (InstanceIdentifier<Meter>)dataObjectInstance;
89
90                 InstanceIdentifier<?> nodeMeterConfigStatsAugmentation =
91                         InstanceIdentifier.builder(meterII).augmentation(NodeMeterConfigStats.class).toInstance();
92                 it.removeOperationalData(nodeMeterConfigStatsAugmentation);
93
94                 InstanceIdentifier<?> nodeMeterStatisticsAugmentation =
95                         InstanceIdentifier.builder(meterII).augmentation(NodeMeterStatistics.class).toInstance();
96                 it.removeOperationalData(nodeMeterStatisticsAugmentation);
97             }
98
99             if(dataObject instanceof Group){
100                 InstanceIdentifier<Group> groupII = (InstanceIdentifier<Group>)dataObjectInstance;
101
102                 InstanceIdentifier<?> nodeGroupDescStatsAugmentation =
103                         InstanceIdentifier.builder(groupII).augmentation(NodeGroupDescStats.class).toInstance();
104                 it.removeOperationalData(nodeGroupDescStatsAugmentation);
105
106                 InstanceIdentifier<?> nodeGroupStatisticsAugmentation =
107                         InstanceIdentifier.builder(groupII).augmentation(NodeGroupStatistics.class).toInstance();
108                 it.removeOperationalData(nodeGroupStatisticsAugmentation);
109             }
110
111             if(dataObject instanceof Queue){
112                 InstanceIdentifier<Queue> queueII = (InstanceIdentifier<Queue>)dataObjectInstance;
113
114                 InstanceIdentifier<?> nodeConnectorQueueStatisticsDataAugmentation =
115                         InstanceIdentifier.builder(queueII).augmentation(FlowCapableNodeConnectorQueueStatisticsData.class).toInstance();
116                 it.removeOperationalData(nodeConnectorQueueStatisticsDataAugmentation);
117             }
118         }
119         it.commit();
120     }
121 }