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
9 package org.opendaylight.openflowplugin.applications.notification.supplier;
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;
62 * Provider Implementation.
64 public class NotificationProvider implements AutoCloseable {
66 private final DataBroker db;
67 private final NotificationProviderConfig config;
68 private final NotificationProviderService nps;
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>
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>
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>
88 * Provider constructor set all needed final parameters.
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
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);
114 * Method to initialize NotificationProviderConfig.
116 private NotificationProviderConfig initializeNotificationProviderConfig(boolean flowSupp, boolean meterSupp,
118 boolean connectorStatSupp,
119 boolean flowStatSupp,
120 boolean flowTableStatSupp,
121 boolean meterStatSupp,
122 boolean groupStatSupp,
123 boolean queueStatSupp) {
124 NotificationProviderConfig.NotificationProviderConfigBuilder notif
125 = new NotificationProviderConfig.NotificationProviderConfigBuilder();
126 notif.setFlowSupport(flowSupp);
127 notif.setMeterSupport(meterSupp);
128 notif.setGroupSupport(groupSupp);
129 notif.setNodeConnectorStatSupport(connectorStatSupp);
130 notif.setFlowStatSupport(flowStatSupp);
131 notif.setFlowTableStatSupport(flowTableStatSupp);
132 notif.setMeterStatSupport(meterStatSupp);
133 notif.setGroupStatSupport(groupStatSupp);
134 notif.setQueueStatSupport(queueStatSupp);
135 return notif.build();
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,
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;
153 supplierList = new ArrayList<>(
154 Arrays.asList(nodeSupp, connectorSupp, flowSupp, meterSupp, groupSupp, connectorStatSupp, flowStatSupp,
155 flowTableStatSupp, meterStatSupp, groupStatSupp, queueStatSupp));
159 public void close() throws Exception {
160 for (NotificationSupplierDefinition<?> supplier : supplierList) {
161 if (supplier != null) {
169 List<NotificationSupplierDefinition<?>> getSupplierList() {