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 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();
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,
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;
154 supplierList = new ArrayList<>(
155 Arrays.asList(nodeSupp, connectorSupp, flowSupp, meterSupp, groupSupp, connectorStatSupp, flowStatSupp,
156 flowTableStatSupp, meterStatSupp, groupStatSupp, queueStatSupp));
160 public void close() throws Exception {
161 for (NotificationSupplierDefinition<?> supplier : supplierList) {
162 if (supplier != null) {
170 List<NotificationSupplierDefinition<?>> getSupplierList() {