1 package test.mock.util;
3 import java.math.BigInteger;
4 import java.util.ArrayList;
5 import java.util.Collections;
7 import java.util.concurrent.ExecutionException;
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;
47 public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
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);
54 private static final int DEFAULT_MIN_REQUEST_NET_MONITOR_INTERVAL = 5000;
55 private static final int MAX_NODES_FOR_COLLECTOR = 16;
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;
65 private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
66 protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
67 protected RpcProviderRegistryMock rpcRegistry;
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");
82 rpcRegistry = new RpcProviderRegistryMock(notificationMock);
85 // node with statistics capabilities will enable cyclic statistics collection
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);
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);
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();
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),
125 writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
126 writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
127 assertCommit(writeTx.submit());
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());
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);
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();
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());
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());
165 protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
166 final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
168 final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
169 writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
170 writeTx.submit().get();
172 final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
173 nrBuilder.setNodeRef(new NodeRef(nodeII));
174 notificationMock.pushNotification(nrBuilder.build());
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;
186 public static Flow getFlow() {
190 public static Group getGroup() {
194 public static Meter getMeter() {
198 public static Port getPort() {
202 public static Queue getQueue() {
206 public static TableId getTableId() {
210 public static NodeConnectorId getNodeConnectorId() {
211 return nodeConnectorId;