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
8 package org.opendaylight.openflowplugin.applications.notification.supplier;
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;
61 * Provider Implementation.
63 public class NotificationProvider implements AutoCloseable {
65 private final DataBroker db;
66 private final NotificationProviderConfig config;
67 private final NotificationPublishService nps;
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>
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>
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>
87 * Provider constructor set all needed final parameters.
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
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);
113 * Method to initialize NotificationProviderConfig.
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();
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() {