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