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