2 * Copyright (c) 2019 Lumina Networks, 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 org.opendaylight.bgpcep.pcep.topology.stats.rpc;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
13 import java.util.Arrays;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.stream.Collectors;
17 import org.junit.After;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.binding.api.WriteTransaction;
21 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdRpcAugBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesRpcAugBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAug;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAugBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessages;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessagesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPrefBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionState;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionStateBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev181109.PcepTopologyNodeStatsAugBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.yangtools.yang.common.RpcResult;
59 import org.opendaylight.yangtools.yang.common.Uint16;
60 import org.opendaylight.yangtools.yang.common.Uint32;
61 import org.opendaylight.yangtools.yang.common.Uint8;
63 public class TopologyStatsRpcServiceImplTest extends AbstractConcurrentDataBrokerTest {
64 private static final String TOPOLOGY_ID1 = "pcep-topology-1";
65 private static final String TOPOLOGY_ID2 = "pcep-topology-2";
66 private static final String NONEXISTENT_TOPOLOGY = "nonexistent-topology";
67 private static final String NONPCEP_TOPOLOGY = "nonpcep-topology";
68 private static final String NODE_ID1 = "pcc://1.1.1.1";
69 private static final String NODE_ID2 = "pcc://2.2.2.2";
70 private static final String NODE_ID3 = "pcc://3.3.3.3";
71 private static final String NONEXISTENT_NODE = "pcc://4.4.4.4";
72 private static final String NONPCEP_NODE = "nonpcep-node";
74 TopologyStatsRpcServiceImpl rpcService;
77 public void setUp() throws Exception {
78 rpcService = new TopologyStatsRpcServiceImpl(getDataBroker());
81 // PCEP topology with one PCC node
82 final Topology t1 = createTopology(TOPOLOGY_ID1, Collections.singletonList(createPcepNode(NODE_ID1)));
84 // PCEP topology with two PCC node
86 createTopology(TOPOLOGY_ID2, Arrays.asList(createPcepNode(NODE_ID2), createPcepNode(NODE_ID3)));
88 // Non-PCEP topology with one non-PCC node
89 final Topology t3 = createTopology(NONPCEP_TOPOLOGY,
90 Collections.singletonList(new NodeBuilder().setNodeId(new NodeId(NONPCEP_NODE)).build()));
92 final WriteTransaction wtx = getDataBroker().newWriteOnlyTransaction();
93 final NetworkTopologyBuilder ntb = new NetworkTopologyBuilder();
94 ntb.setTopology(Arrays.asList(t1, t2, t3));
95 wtx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetworkTopology.class).build(),
100 private static Topology createTopology(final String topologyId, final List<Node> nodes) {
101 return new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
104 private static Node createPcepNode(final String nodeId) {
105 return new NodeBuilder()
106 .setNodeId(new NodeId(nodeId))
107 .addAugmentation(new PcepTopologyNodeStatsAugBuilder()
108 .setPcepSessionState(createTopologySessionState())
113 private static PcepSessionState createTopologySessionState() {
114 final ReplyTime replyTime = new ReplyTimeBuilder()
115 .setAverageTime(Uint32.ONE)
116 .setMaxTime(Uint32.valueOf(3))
117 .setMinTime(Uint32.TWO)
120 final ErrorMessages errorMsg = new ErrorMessagesBuilder()
121 .setReceivedErrorMsgCount(Uint32.ONE)
122 .setSentErrorMsgCount(Uint32.valueOf(2))
125 final StatefulMessagesStatsAug statefulMsg = new StatefulMessagesStatsAugBuilder()
126 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
127 .setSentUpdMsgCount(Uint32.ONE)
128 .setReceivedRptMsgCount(Uint32.TWO)
129 .setSentInitMsgCount(Uint32.valueOf(3))
132 final Messages messages = new MessagesBuilder()
133 .setLastSentMsgTimestamp(Uint32.valueOf(1553183734L))
134 .setUnknownMsgReceived(Uint16.ONE)
135 .setSentMsgCount(Uint32.valueOf(5))
136 .setReceivedMsgCount(Uint32.valueOf(4))
137 .setReplyTime(replyTime)
138 .setErrorMessages(errorMsg)
139 .addAugmentation(statefulMsg).build();
141 final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
142 .addAugmentation(new StatefulCapabilitiesStatsAugBuilder()
144 .setInstantiation(true)
149 final LocalPref localPref = new LocalPrefBuilder()
150 .setKeepalive(Uint8.valueOf(30))
151 .setDeadtimer(Uint8.valueOf(120))
152 .setIpAddress("127.0.0.1")
153 .setSessionId(Uint16.ZERO)
154 .addAugmentation(new PcepEntityIdStatsAugBuilder()
155 .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04})
159 return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
160 .setDelegatedLspsCount(Uint16.ONE).setLocalPref(localPref)
161 .setPeerPref(new PeerPrefBuilder(localPref).build())
162 .setPeerCapabilities(capabilities).setMessages(messages).build();
165 private static PcepSessionState createRpcSessionState() {
166 final ReplyTime replyTime = new ReplyTimeBuilder()
167 .setAverageTime(Uint32.ONE)
168 .setMaxTime(Uint32.valueOf(3))
169 .setMinTime(Uint32.TWO)
172 final ErrorMessages errorMsg = new ErrorMessagesBuilder()
173 .setReceivedErrorMsgCount(Uint32.ONE).setSentErrorMsgCount(Uint32.TWO).build();
175 final StatefulMessagesRpcAug statefulMsg = new StatefulMessagesRpcAugBuilder()
176 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
177 .setSentUpdMsgCount(Uint32.ONE)
178 .setReceivedRptMsgCount(Uint32.TWO)
179 .setSentInitMsgCount(Uint32.valueOf(3))
182 final Messages messages = new MessagesBuilder()
183 .setLastSentMsgTimestamp(Uint32.valueOf(1553183734L))
184 .setUnknownMsgReceived(Uint16.ONE)
185 .setSentMsgCount(Uint32.valueOf(5))
186 .setReceivedMsgCount(Uint32.valueOf(4))
187 .setReplyTime(replyTime)
188 .setErrorMessages(errorMsg)
189 .addAugmentation(statefulMsg).build();
191 final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
192 .addAugmentation(new StatefulCapabilitiesRpcAugBuilder()
193 .setStateful(true).setInstantiation(true).setActive(true).build())
196 final LocalPref localPref = new LocalPrefBuilder()
197 .setKeepalive(Uint8.valueOf(30))
198 .setDeadtimer(Uint8.valueOf(120))
199 .setIpAddress("127.0.0.1")
200 .setSessionId(Uint16.ZERO)
201 .addAugmentation(new PcepEntityIdRpcAugBuilder()
202 .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04})
206 return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
207 .setDelegatedLspsCount(Uint16.ONE).setLocalPref(localPref)
208 .setPeerPref(new PeerPrefBuilder(localPref).build())
209 .setPeerCapabilities(capabilities).setMessages(messages)
214 public void testGetStatsNoMatch() throws Exception {
218 // Non-existing topology
219 in = createGetStatsInput(NONEXISTENT_TOPOLOGY, null);
220 out = createGetStatsOutput(NONEXISTENT_TOPOLOGY, Collections.emptyList(), null);
221 performTest(in, out);
224 in = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE));
225 out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE), null);
226 performTest(in, out);
229 in = createGetStatsInput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE));
230 out = createGetStatsOutput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE), null);
231 performTest(in, out);
235 public void testGetStatsPartialMatch() throws Exception {
239 // Match one PCEP topology
240 in = createGetStatsInput(TOPOLOGY_ID1, null);
241 out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState());
242 performTest(in, out);
244 // Match one PCEP node in one topology
245 in = createGetStatsInput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3));
246 out = createGetStatsOutput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3), createRpcSessionState());
247 performTest(in, out);
249 // Match two PCEP nodes in one topology
250 in = createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3));
251 out = createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState());
252 performCountTest(in, out);
256 public void testGetStatsAllMatch() throws Exception {
259 final var ot1 = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState())
260 .getTopology().values() .iterator().next();
261 final var ot2 = createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState())
262 .getTopology().values().iterator().next();
263 final GetStatsOutput out = new GetStatsOutputBuilder().setTopology(Arrays.asList(ot1, ot2)).build();
265 // Implicitly match all PCEP topologies and nodes
266 in = createGetStatsInput(null, null);
267 performCountTest(in, out);
269 // Explicitly match all PCEP topologies and nodes
270 final var it1 = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1)).getTopology().values()
272 final var it2 = createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3)).getTopology().values()
274 in = new GetStatsInputBuilder().setTopology(Arrays.asList(it1, it2)).build();
275 performCountTest(in, out);
278 private void performTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
279 final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
280 assertEquals(out, result.getResult());
281 assertTrue(result.isSuccessful());
282 assertTrue(result.getErrors().isEmpty());
286 * When topology and/or node list is expected to contain more than one item,
287 * direct comparison will fail due to potential list ordering differences. So
288 * just compare the number of nodes
290 private void performCountTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
291 final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
292 assertEquals(result.getResult().getTopology().size(), out.getTopology().size());
293 assertTrue(result.isSuccessful());
294 assertEquals(result.getResult().nonnullTopology().values().stream()
295 .flatMap(t -> t.nonnullNode().values().stream()).count(),
296 out.nonnullTopology().values().stream().flatMap(t -> t.nonnullNode().values().stream()).count());
297 assertTrue(result.isSuccessful());
298 assertTrue(result.getErrors().isEmpty());
301 private static GetStatsInput createGetStatsInput(final String topologyId, final List<String> nodeIds) {
302 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321
303 .get.stats.input.topology.Node> nodes;
304 if (nodeIds != null) {
305 nodes = nodeIds.stream()
306 .map(nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology
307 .stats.rpc.rev190321.get.stats.input.topology.NodeBuilder()
308 .setNodeId(new NodeId(nodeId))
310 .collect(Collectors.toList());
314 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get
315 .stats.input.Topology topology;
316 if (topologyId != null) {
317 topology = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc
318 .rev190321.get.stats.input.TopologyBuilder()
319 .setTopologyId(new TopologyId(topologyId))
325 return new GetStatsInputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
329 private static GetStatsOutput createGetStatsOutput(final String topologyId, final List<String> nodeIds,
330 final PcepSessionState state) {
331 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321
332 .get.stats.output.topology.Node> nodes;
333 if (nodeIds != null) {
334 nodes = nodeIds.stream()
335 .map(nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology
336 .stats.rpc.rev190321.get.stats.output.topology.NodeBuilder()
337 .setNodeId(new NodeId(nodeId))
338 .setPcepSessionState(state)
340 .collect(Collectors.toList());
344 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get
345 .stats.output.Topology topology;
346 if (topologyId != null) {
347 topology = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc
348 .rev190321.get.stats.output.TopologyBuilder()
349 .setTopologyId(new TopologyId(topologyId))
355 return new GetStatsOutputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
360 public void tearDown() {