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;
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;
46 public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
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);
53 private static final int DEFAULT_MIN_REQUEST_NET_MONITOR_INTERVAL = 5000;
54 private static final int MAX_NODES_FOR_COLLECTOR = 16;
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;
64 private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
65 protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
66 protected RpcProviderRegistryMock rpcRegistry;
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");
81 rpcRegistry = new RpcProviderRegistryMock(notificationMock);
84 // node with statistics capabilities will enable cyclic statistics collection
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);
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);
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();
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),
124 writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
125 writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
126 assertCommit(writeTx.submit());
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());
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);
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();
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());
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());
164 protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
165 final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
167 final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
168 writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
169 writeTx.submit().get();
171 final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
172 nrBuilder.setNodeRef(new NodeRef(nodeII));
173 notificationMock.pushNotification(nrBuilder.build());
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;
185 public static Flow getFlow() {
189 public static Group getGroup() {
193 public static Meter getMeter() {
197 public static Port getPort() {
201 public static Queue getQueue() {
205 public static TableId getTableId() {
209 public static NodeConnectorId getNodeConnectorId() {
210 return nodeConnectorId;