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
9 package org.opendaylight.bgpcep.pcep.topology.stats.rpc;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
14 import java.util.Arrays;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.stream.Collectors;
18 import org.junit.After;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.mdsal.binding.api.WriteTransaction;
22 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdRpcAug;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdRpcAugBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAug;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesRpcAug;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesRpcAugBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAug;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAug;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesRpcAugBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessages;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.error.messages.grouping.ErrorMessagesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPrefBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionState;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.grouping.PcepSessionStateBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.GetStatsOutputBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev181109.PcepTopologyNodeStatsAug;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.stats.rev181109.PcepTopologyNodeStatsAugBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.common.RpcResult;
66 public class TopologyStatsRpcServiceImplTest extends AbstractConcurrentDataBrokerTest {
67 private static final String TOPOLOGY_ID1 = "pcep-topology-1";
68 private static final String TOPOLOGY_ID2 = "pcep-topology-2";
69 private static final String NONEXISTENT_TOPOLOGY = "nonexistent-topology";
70 private static final String NONPCEP_TOPOLOGY = "nonpcep-topology";
71 private static final String NODE_ID1 = "pcc://1.1.1.1";
72 private static final String NODE_ID2 = "pcc://2.2.2.2";
73 private static final String NODE_ID3 = "pcc://3.3.3.3";
74 private static final String NONEXISTENT_NODE = "pcc://4.4.4.4";
75 private static final String NONPCEP_NODE = "nonpcep-node";
77 TopologyStatsRpcServiceImpl rpcService;
80 public void setUp() throws Exception {
81 rpcService = new TopologyStatsRpcServiceImpl(getDataBroker());
84 // PCEP topology with one PCC node
85 final Topology t1 = createTopology(TOPOLOGY_ID1, Collections.singletonList(createPcepNode(NODE_ID1)));
87 // PCEP topology with two PCC node
89 createTopology(TOPOLOGY_ID2, Arrays.asList(createPcepNode(NODE_ID2), createPcepNode(NODE_ID3)));
91 // Non-PCEP topology with one non-PCC node
92 final Topology t3 = createTopology(NONPCEP_TOPOLOGY,
93 Collections.singletonList(new NodeBuilder().setNodeId(new NodeId(NONPCEP_NODE)).build()));
95 final WriteTransaction wtx = getDataBroker().newWriteOnlyTransaction();
96 final NetworkTopologyBuilder ntb = new NetworkTopologyBuilder();
97 ntb.setTopology(Arrays.asList(t1, t2, t3));
98 wtx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetworkTopology.class).build(),
103 private Topology createTopology(final String topologyId, final List<Node> nodes) {
104 return new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
107 private Node createPcepNode(final String nodeId) {
108 return new NodeBuilder().setNodeId(new NodeId(nodeId))
109 .addAugmentation(PcepTopologyNodeStatsAug.class,
110 new PcepTopologyNodeStatsAugBuilder().setPcepSessionState(createTopologySessionState()).build())
114 private PcepSessionState createTopologySessionState() {
115 final ReplyTime replyTime = new ReplyTimeBuilder().setAverageTime(1L).setMaxTime(3L).setMinTime(2L).build();
117 final ErrorMessages errorMsg =
118 new ErrorMessagesBuilder().setReceivedErrorMsgCount(1L).setSentErrorMsgCount(2L).build();
120 final StatefulMessagesStatsAug statefulMsg =
121 new StatefulMessagesStatsAugBuilder().setLastReceivedRptMsgTimestamp(1553183614L).setSentUpdMsgCount(1L)
122 .setReceivedRptMsgCount(2L).setSentInitMsgCount(3L).build();
124 final Messages messages = new MessagesBuilder().setLastSentMsgTimestamp(1553183734L).setUnknownMsgReceived(1)
125 .setSentMsgCount(5L).setReceivedMsgCount(4L).setReplyTime(replyTime).setErrorMessages(errorMsg)
126 .addAugmentation(StatefulMessagesStatsAug.class, statefulMsg).build();
128 final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
129 .addAugmentation(StatefulCapabilitiesStatsAug.class, new StatefulCapabilitiesStatsAugBuilder()
130 .setStateful(true).setInstantiation(true).setActive(true).build())
133 final LocalPref localPref =
134 new LocalPrefBuilder().setKeepalive((short) 30).setDeadtimer((short) 120).setIpAddress("127.0.0.1")
135 .setSessionId(0).addAugmentation(PcepEntityIdStatsAug.class, new PcepEntityIdStatsAugBuilder()
136 .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04}).build())
139 return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
140 .setDelegatedLspsCount(1).setLocalPref(localPref).setPeerPref(new PeerPrefBuilder(localPref).build())
141 .setPeerCapabilities(capabilities).setMessages(messages).build();
144 private PcepSessionState createRpcSessionState() {
145 final ReplyTime replyTime = new ReplyTimeBuilder().setAverageTime(1L).setMaxTime(3L).setMinTime(2L).build();
147 final ErrorMessages errorMsg =
148 new ErrorMessagesBuilder().setReceivedErrorMsgCount(1L).setSentErrorMsgCount(2L).build();
150 final StatefulMessagesRpcAug statefulMsg =
151 new StatefulMessagesRpcAugBuilder().setLastReceivedRptMsgTimestamp(1553183614L).setSentUpdMsgCount(1L)
152 .setReceivedRptMsgCount(2L).setSentInitMsgCount(3L).build();
154 final Messages messages = new MessagesBuilder().setLastSentMsgTimestamp(1553183734L).setUnknownMsgReceived(1)
155 .setSentMsgCount(5L).setReceivedMsgCount(4L).setReplyTime(replyTime).setErrorMessages(errorMsg)
156 .addAugmentation(StatefulMessagesRpcAug.class, statefulMsg).build();
158 final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
159 .addAugmentation(StatefulCapabilitiesRpcAug.class, new StatefulCapabilitiesRpcAugBuilder()
160 .setStateful(true).setInstantiation(true).setActive(true).build())
163 final LocalPref localPref =
164 new LocalPrefBuilder().setKeepalive((short) 30).setDeadtimer((short) 120).setIpAddress("127.0.0.1")
165 .setSessionId(0).addAugmentation(PcepEntityIdRpcAug.class, new PcepEntityIdRpcAugBuilder()
166 .setSpeakerEntityIdValue(new byte[] {0x01, 0x02, 0x03, 0x04}).build())
169 return new PcepSessionStateBuilder().setSynchronized(true).setSessionDuration("0:00:05:18")
170 .setDelegatedLspsCount(1).setLocalPref(localPref).setPeerPref(new PeerPrefBuilder(localPref).build())
171 .setPeerCapabilities(capabilities).setMessages(messages).build();
175 public void testGetStatsNoMatch() throws Exception {
179 // Non-existing topology
180 in = createGetStatsInput(NONEXISTENT_TOPOLOGY, null);
181 out = createGetStatsOutput(NONEXISTENT_TOPOLOGY, Collections.emptyList(), null);
182 performTest(in, out);
185 in = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE));
186 out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE), null);
187 performTest(in, out);
190 in = createGetStatsInput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE));
191 out = createGetStatsOutput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE), null);
192 performTest(in, out);
196 public void testGetStatsPartialMatch() throws Exception {
200 // Match one PCEP topology
201 in = createGetStatsInput(TOPOLOGY_ID1, null);
202 out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState());
203 performTest(in, out);
205 // Match one PCEP node in one topology
206 in = createGetStatsInput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3));
207 out = createGetStatsOutput(TOPOLOGY_ID2, Collections.singletonList(NODE_ID3), createRpcSessionState());
208 performTest(in, out);
210 // Match two PCEP nodes in one topology
211 in = createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3));
212 out = createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState());
213 performCountTest(in, out);
217 @SuppressWarnings("checkstyle:LineLength")
218 public void testGetStatsAllMatch() throws Exception {
221 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology ot1 =
222 createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1), createRpcSessionState())
223 .getTopology().get(0);
224 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology ot2 =
225 createGetStatsOutput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3), createRpcSessionState())
226 .getTopology().get(0);
227 final GetStatsOutput out = new GetStatsOutputBuilder().setTopology(Arrays.asList(ot1, ot2)).build();
229 // Implicitly match all PCEP topologies and nodes
230 in = createGetStatsInput(null, null);
231 performCountTest(in, out);
233 // Explicitly match all PCEP topologies and nodes
234 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology it1 =
235 createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1)).getTopology().get(0);
236 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology it2 =
237 createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3)).getTopology().get(0);
238 in = new GetStatsInputBuilder().setTopology(Arrays.asList(it1, it2)).build();
239 performCountTest(in, out);
242 private void performTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
243 final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
244 assertEquals(result.getResult(), out);
245 assertTrue(result.isSuccessful());
246 assertTrue(result.getErrors().isEmpty());
250 * When topology and/or node list is expected to contain more than one item,
251 * direct comparison will fail due to potential list ordering differences. So
252 * just compare the number of nodes
254 private void performCountTest(final GetStatsInput in, final GetStatsOutput out) throws Exception {
255 final RpcResult<GetStatsOutput> result = rpcService.getStats(in).get();
256 assertEquals(result.getResult().getTopology().size(), out.getTopology().size());
257 assertTrue(result.isSuccessful());
258 assertEquals(result.getResult().getTopology().stream().flatMap(t -> t.getNode().stream()).count(),
259 out.getTopology().stream().flatMap(t -> t.getNode().stream()).count());
260 assertTrue(result.isSuccessful());
261 assertTrue(result.getErrors().isEmpty());
264 @SuppressWarnings("checkstyle:LineLength")
265 private GetStatsInput createGetStatsInput(final String topologyId, final List<String> nodeIds) {
266 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.topology.Node> nodes;
267 if (nodeIds != null) {
268 nodes = nodeIds.stream().map(
269 nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.topology.NodeBuilder()
270 .setNodeId(new NodeId(nodeId)).build())
271 .collect(Collectors.toList());
275 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.Topology topology;
276 if (topologyId != null) {
278 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.input.TopologyBuilder()
279 .setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
283 return new GetStatsInputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
287 @SuppressWarnings("checkstyle:LineLength")
288 private GetStatsOutput createGetStatsOutput(final String topologyId, final List<String> nodeIds,
289 final PcepSessionState state) {
290 final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.topology.Node> nodes;
291 if (nodeIds != null) {
292 nodes = nodeIds.stream().map(
293 nodeId -> new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.topology.NodeBuilder()
294 .setNodeId(new NodeId(nodeId)).setPcepSessionState(state).build())
295 .collect(Collectors.toList());
299 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.Topology topology;
300 if (topologyId != null) {
302 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.get.stats.output.TopologyBuilder()
303 .setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
307 return new GetStatsOutputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
312 public void tearDown() {