2 * Copyright (c) 2014, 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package test.mock.util;
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;
54 public abstract class StatisticsManagerTest extends AbstractDataBrokerTest {
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);
61 private static final int DEFAULT_MIN_REQUEST_NET_MONITOR_INTERVAL = 5000;
62 private static final int MAX_NODES_FOR_COLLECTOR = 16;
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;
72 private final NotificationProviderServiceHelper notificationMock = new NotificationProviderServiceHelper();
73 protected final NodeKey s1Key = new NodeKey(new NodeId("S1"));
74 protected RpcProviderRegistryMock rpcRegistry;
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");
89 rpcRegistry = new RpcProviderRegistryMock(notificationMock);
92 // node with statistics capabilities will enable cyclic statistics collection
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);
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);
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();
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),
132 writeTx.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class), nodes);
133 writeTx.put(LogicalDatastoreType.CONFIGURATION, flowNodeIdentifier, node);
134 assertCommit(writeTx.submit());
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());
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);
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();
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());
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());
172 protected void removeNode(final NodeKey nodeKey) throws ExecutionException, InterruptedException {
173 final InstanceIdentifier<Node> nodeII = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeKey);
175 final WriteTransaction writeTx = getDataBroker().newWriteOnlyTransaction();
176 writeTx.delete(LogicalDatastoreType.OPERATIONAL, nodeII);
177 writeTx.submit().get();
179 final NodeRemovedBuilder nrBuilder = new NodeRemovedBuilder();
180 nrBuilder.setNodeRef(new NodeRef(nodeII));
181 notificationMock.pushNotification(nrBuilder.build());
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;
194 public static Flow getFlow() {
198 public static Group getGroup() {
202 public static Meter getMeter() {
206 public static Port getPort() {
210 public static Queue getQueue() {
214 public static TableId getTableId() {
218 public static NodeConnectorId getNodeConnectorId() {
219 return nodeConnectorId;