Add missing license headers
[openflowplugin.git] / applications / statistics-manager / src / test / java / test / mock / util / StatisticsManagerTest.java
1 /*
2  * Copyright (c) 2014, 2016 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 test.mock.util;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.concurrent.ExecutionException;
15 import org.junit.Before;
16 import org.junit.BeforeClass;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager;
21 import org.opendaylight.openflowplugin.applications.statistics.manager.impl.StatisticsManagerConfig;
22 import org.opendaylight.openflowplugin.applications.statistics.manager.impl.StatisticsManagerImpl;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FeatureCapability;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdatedBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SwitchFeaturesBuilder;
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;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemovedBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeatures;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeaturesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.MeterFeaturesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
53
54 public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
55
56     public static final Counter64 COUNTER_64_TEST_VALUE = new Counter64(BigInteger.valueOf(128));
57     public static final Counter32 COUNTER_32_TEST_VALUE = new Counter32(64L);
58     public static final Long MAX_GROUPS_TEST_VALUE = 2000L;
59     public static final BigInteger BIG_INTEGER_TEST_VALUE = BigInteger.valueOf(1000);
60
61     private static final int DEFAULT_MIN_REQUEST_NET_MONITOR_INTERVAL = 5000;
62     private static final int MAX_NODES_FOR_COLLECTOR = 16;
63
64     private static Flow flow;
65     private static Group group;
66     private static Meter meter;
67     private static Port port;
68     private static Queue queue;
69     private static TableId tableId;
70     private static NodeConnectorId nodeConnectorId;
71
72     private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
73     protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
74     protected RpcProviderRegistryMock rpcRegistry;
75
76     @BeforeClass
77     public static void setupTests() {
78         flow = FlowMockGenerator.getRandomFlow();
79         group = GroupMockGenerator.getRandomGroup();
80         meter = MeterMockGenerator.getRandomMeter();
81         port = PortMockGenerator.getRandomPort();
82         queue = QueueMockGenerator.getRandomQueueWithPortNum(port.getPortNumber().getUint32());
83         tableId = new TableId((short) 2);
84         nodeConnectorId = new NodeConnectorId("connector.1");
85     }
86
87     @Before
88     public void init() {
89         rpcRegistry = new RpcProviderRegistryMock(notificationMock);
90     }
91
92     // node with statistics capabilities will enable cyclic statistics collection
93     @SafeVarargs
94     protected final void addFlowCapableNodeWithFeatures(final NodeKey nodeKey, final Boolean hasMeterCapabilities,
95                                                      final Class<? extends FeatureCapability>... capabilities)
96             throws ExecutionException, InterruptedException {
97         final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
98         final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
99                 .child(Node.class, nodeKey);
100
101         final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
102         final SwitchFeaturesBuilder sfBuilder = new SwitchFeaturesBuilder();
103         final List<Class<? extends FeatureCapability>> capabilitiyList = new ArrayList<>();
104         for (final Class<? extends FeatureCapability> capability : capabilities) {
105             capabilitiyList.add(capability);
106         }
107         sfBuilder.setCapabilities(capabilitiyList);
108         sfBuilder.setMaxTables((short) 255);
109         final NodeBuilder nodeBuilder = new NodeBuilder();
110         nodeBuilder.setKey(nodeKey);
111         fcnBuilder.setSwitchFeatures(sfBuilder.build());
112         final List<Table> tables = new ArrayList<>();
113         final TableBuilder tBuilder = new TableBuilder();
114         tBuilder.setId(getFlow().getTableId());
115         tables.add(tBuilder.build());
116         fcnBuilder.setTable(tables);
117         final FlowCapableNode flowCapableNode = fcnBuilder.build();
118         nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
119         final Node node = nodeBuilder.build();
120
121         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
122         writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
123         writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, nodeBuilder.build());
124         if (hasMeterCapabilities) {
125             final NodeMeterFeaturesBuilder nmfBuilder = new NodeMeterFeaturesBuilder();
126             final MeterFeaturesBuilder mfBuilder = new MeterFeaturesBuilder();
127             mfBuilder.setMaxBands((short) 4);
128             nmfBuilder.setMeterFeatures(mfBuilder.build());
129             writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier.augmentation(NodeMeterFeatures.class),
130                     nmfBuilder.build());
131         }
132         writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
133         writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
134         assertCommit(writeTx.submit());
135
136         final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
137         final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
138         nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
139         nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
140         notificationMock.pushNotification(nuBuilder.build());
141     }
142
143     public void addFlowCapableNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
144         final Nodes nodes = new NodesBuilder().setNode(Collections.<Node>emptyList()).build();
145         final InstanceIdentifier<Node> flowNodeIdentifier = InstanceIdentifier.create(Nodes.class)
146                 .child(Node.class, nodeKey);
147
148         final FlowCapableNodeBuilder fcnBuilder = new FlowCapableNodeBuilder();
149         final NodeBuilder nodeBuilder = new NodeBuilder();
150         nodeBuilder.setKey(nodeKey);
151         final SwitchFeaturesBuilder sfBuilder = new SwitchFeaturesBuilder();
152         sfBuilder.setMaxTables((short) 255);
153         fcnBuilder.setSwitchFeatures(sfBuilder.build());
154         final FlowCapableNode flowCapableNode = fcnBuilder.build();
155         nodeBuilder.addAugmentation(FlowCapableNode.class, flowCapableNode);
156         final Node node = nodeBuilder.build();
157
158         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
159         writeTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class), nodes);
160         writeTx.put(LogicalDatastoreType.OPERATIONAL, flowNodeIdentifier, node);
161         writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
162         writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
163         assertCommit(writeTx.submit());
164
165         final NodeUpdatedBuilder nuBuilder = new NodeUpdatedBuilder(node);
166         final FlowCapableNodeUpdatedBuilder fcnuBuilder = new FlowCapableNodeUpdatedBuilder(flowCapableNode);
167         nuBuilder.setNodeRef(new NodeRef(flowNodeIdentifier));
168         nuBuilder.addAugmentation(FlowCapableNodeUpdated.class, fcnuBuilder.build());
169         notificationMock.pushNotification(nuBuilder.build());
170     }
171
172     protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
173         final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
174
175         final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
176         writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
177         writeTx.submit().get();
178
179         final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
180         nrBuilder.setNodeRef(new NodeRef(nodeII));
181         notificationMock.pushNotification(nrBuilder.build());
182     }
183
184     public StatisticsManager setupStatisticsManager() {
185         StatisticsManagerConfig.StatisticsManagerConfigBuilder confBuilder = StatisticsManagerConfig.builder();
186         confBuilder.setMaxNodesForCollector(MAX_NODES_FOR_COLLECTOR);
187         confBuilder.setMinRequestNetMonitorInterval(DEFAULT_MIN_REQUEST_NET_MONITOR_INTERVAL);
188         StatisticsManager statsProvider = new StatisticsManagerImpl(getDataBroker(), confBuilder.build());
189         statsProvider.start(notificationMock.getNotifBroker(), rpcRegistry);
190         statsProvider.setOwnershipService(new EntityOwnershipServiceMock());
191         return statsProvider;
192     }
193
194     public static Flow getFlow() {
195         return flow;
196     }
197
198     public static Group getGroup() {
199         return group;
200     }
201
202     public static Meter getMeter() {
203         return meter;
204     }
205
206     public static Port getPort() {
207         return port;
208     }
209
210     public static Queue getQueue() {
211         return queue;
212     }
213
214     public static TableId getTableId() {
215         return tableId;
216     }
217
218     public static NodeConnectorId getNodeConnectorId() {
219         return nodeConnectorId;
220     }
221 }