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