6432c98f06e60d5a3e13f70fb5acee5420b9444a
[openflowplugin.git] / applications / notification-supplier / src / main / java / org / opendaylight / openflowplugin / applications / notification / supplier / NotificationProvider.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
9 package org.opendaylight.openflowplugin.applications.notification.supplier;
10
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Preconditions;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.List;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
18 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.NodeConnectorNotificationSupplierImpl;
19 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.NodeNotificationSupplierImpl;
20 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.FlowNotificationSupplierImpl;
21 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.GroupNotificationSupplierImpl;
22 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.MeterNotificationSupplierImpl;
23 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.FlowStatNotificationSupplierImpl;
24 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.FlowTableStatNotificationSupplierImpl;
25 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.GroupStatNotificationSupplierImpl;
26 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.MeterStatNotificationSupplierImpl;
27 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.NodeConnectorStatNotificationSupplierImpl;
28 import org.opendaylight.openflowplugin.applications.notification.supplier.impl.item.stat.QueueStatNotificationSupplierImpl;
29 import org.opendaylight.openflowplugin.applications.notification.supplier.tools.NotificationProviderConfig;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemoved;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowUpdated;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdate;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.statistics.FlowStatistics;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdate;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.statistics.FlowTableStatistics;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupAdded;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupRemoved;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupUpdated;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.statistics.GroupStatistics;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.meter.MeterStatistics;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdate;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.flow.capable.node.connector.statistics.FlowCapableNodeConnectorStatistics;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.FlowCapableNodeConnectorQueueStatisticsData;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueStatisticsUpdate;
60
61 /**
62  * Provider Implementation.
63  */
64 public class NotificationProvider implements AutoCloseable {
65
66     private final DataBroker db;
67     private final NotificationProviderConfig config;
68     private final NotificationProviderService nps;
69
70     /* Supplier List property help for easy close method implementation and testing */
71     private List<NotificationSupplierDefinition<?>> supplierList;
72     private NotificationSupplierForItemRoot<FlowCapableNode, NodeUpdated, NodeRemoved> nodeSupp;
73     private NotificationSupplierForItemRoot<FlowCapableNodeConnector, NodeConnectorUpdated, NodeConnectorRemoved>
74             connectorSupp;
75     private NotificationSupplierForItem<Flow, FlowAdded, FlowUpdated, FlowRemoved> flowSupp;
76     private NotificationSupplierForItem<Meter, MeterAdded, MeterUpdated, MeterRemoved> meterSupp;
77     private NotificationSupplierForItem<Group, GroupAdded, GroupUpdated, GroupRemoved> groupSupp;
78     private NotificationSupplierForItemStat<FlowCapableNodeConnectorStatistics, NodeConnectorStatisticsUpdate>
79             connectorStatSupp;
80     private NotificationSupplierForItemStat<FlowStatistics, FlowsStatisticsUpdate> flowStatSupp;
81     private NotificationSupplierForItemStat<FlowTableStatistics, FlowTableStatisticsUpdate> flowTableStatSupp;
82     private NotificationSupplierForItemStat<MeterStatistics, MeterStatisticsUpdated> meterStatSupp;
83     private NotificationSupplierForItemStat<GroupStatistics, GroupStatisticsUpdated> groupStatSupp;
84     private NotificationSupplierForItemStat<FlowCapableNodeConnectorQueueStatisticsData, QueueStatisticsUpdate>
85             queueStatSupp;
86
87     /**
88      * Provider constructor set all needed final parameters.
89      *
90      * @param nps               - notifProviderService
91      * @param db                - dataBroker
92      * @param flowSupp          - Flow Support Flag
93      * @param meterSupp         - Meter Support Flag
94      * @param groupSupp         - Group Support Flag
95      * @param connectorStatSupp - Connector Stat Support Flag
96      * @param flowStatSupp      - Flow Stat Support Flag
97      * @param flowTableStatSupp - Flow Table Stat Support Flag
98      * @param meterStatSupp     - Meter Stat Support Flag
99      * @param groupStatSupp     - Group Stat Support Flag
100      * @param queueStatSupp     - Queue Stat Support Flag
101      */
102     public NotificationProvider(final NotificationProviderService nps, final DataBroker db, boolean flowSupp,
103                                 boolean meterSupp, boolean groupSupp, boolean connectorStatSupp, boolean flowStatSupp,
104                                 boolean flowTableStatSupp, boolean meterStatSupp, boolean groupStatSupp,
105                                 boolean queueStatSupp) {
106         this.nps = Preconditions.checkNotNull(nps);
107         this.db = Preconditions.checkNotNull(db);
108         this.config = initializeNotificationProviderConfig(flowSupp, meterSupp, groupSupp, connectorStatSupp,
109                                                            flowStatSupp, flowTableStatSupp, meterStatSupp,
110                                                            groupStatSupp, queueStatSupp);
111     }
112
113     /**
114      * Method to initialize NotificationProviderConfig.
115      */
116     private NotificationProviderConfig initializeNotificationProviderConfig(boolean hasFlowSupp,
117                                                                             boolean hasMeterSupp,
118                                                                             boolean hasGroupSupp,
119                                                                             boolean hasConnectorStatSupp,
120                                                                             boolean hasFlowStatSupp,
121                                                                             boolean hasFlowTableStatSupp,
122                                                                             boolean hasMeterStatSupp,
123                                                                             boolean hasGroupStatSupp,
124                                                                             boolean hasQueueStatSupp) {
125         NotificationProviderConfig.NotificationProviderConfigBuilder notif
126                 = new NotificationProviderConfig.NotificationProviderConfigBuilder();
127         notif.setFlowSupport(hasFlowSupp);
128         notif.setMeterSupport(hasMeterSupp);
129         notif.setGroupSupport(hasGroupSupp);
130         notif.setNodeConnectorStatSupport(hasConnectorStatSupp);
131         notif.setFlowStatSupport(hasFlowStatSupp);
132         notif.setFlowTableStatSupport(hasFlowTableStatSupp);
133         notif.setMeterStatSupport(hasMeterStatSupp);
134         notif.setGroupStatSupport(hasGroupStatSupp);
135         notif.setQueueStatSupport(hasQueueStatSupp);
136         return notif.build();
137     }
138
139     public void start() {
140         nodeSupp = new NodeNotificationSupplierImpl(nps, db);
141         connectorSupp = new NodeConnectorNotificationSupplierImpl(nps, db);
142         flowSupp = config.isFlowSupport() ? new FlowNotificationSupplierImpl(nps, db) : null;
143         meterSupp = config.isMeterSupport() ? new MeterNotificationSupplierImpl(nps, db) : null;
144         groupSupp = config.isGroupSupport() ? new GroupNotificationSupplierImpl(nps, db) : null;
145         connectorStatSupp = config.isNodeConnectorStatSupport() ? new NodeConnectorStatNotificationSupplierImpl(nps,
146                                                                                                                 db) :
147                 null;
148         flowStatSupp = config.isFlowStatSupport() ? new FlowStatNotificationSupplierImpl(nps, db) : null;
149         flowTableStatSupp = config.isFlowTableStatSupport() ? new FlowTableStatNotificationSupplierImpl(nps, db) : null;
150         meterStatSupp = config.isMeterStatSupport() ? new MeterStatNotificationSupplierImpl(nps, db) : null;
151         groupStatSupp = config.isGroupStatSupport() ? new GroupStatNotificationSupplierImpl(nps, db) : null;
152         queueStatSupp = config.isQueueStatSupport() ? new QueueStatNotificationSupplierImpl(nps, db) : null;
153
154         supplierList = new ArrayList<>(
155                 Arrays.asList(nodeSupp, connectorSupp, flowSupp, meterSupp, groupSupp, connectorStatSupp, flowStatSupp,
156                               flowTableStatSupp, meterStatSupp, groupStatSupp, queueStatSupp));
157     }
158
159     @Override
160     public void close() throws Exception {
161         for (NotificationSupplierDefinition<?> supplier : supplierList) {
162             if (supplier != null) {
163                 supplier.close();
164                 supplier = null;
165             }
166         }
167     }
168
169     @VisibleForTesting
170     List<NotificationSupplierDefinition<?>> getSupplierList() {
171         return supplierList;
172     }
173 }
174