Update MRI projects for Aluminium
[bgpcep.git] / pcep / topology / topology-stats / src / test / java / org / opendaylight / bgpcep / pcep / topology / stats / rpc / TopologyStatsRpcServiceImplTest.java
1 /*
2  * Copyright (c) 2019 Lumina Networks, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.bgpcep.pcep.topology.stats.rpc;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12
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;
62
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";
73
74     TopologyStatsRpcServiceImpl rpcService;
75
76     @Before
77     public void setUp() throws Exception {
78         rpcService = new TopologyStatsRpcServiceImpl(getDataBroker());
79         rpcService.init();
80
81         // PCEP topology with one PCC node
82         final Topology t1 = createTopology(TOPOLOGY_ID1, Collections.singletonList(createPcepNode(NODE_ID1)));
83
84         // PCEP topology with two PCC node
85         final Topology t2 =
86                 createTopology(TOPOLOGY_ID2, Arrays.asList(createPcepNode(NODE_ID2), createPcepNode(NODE_ID3)));
87
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()));
91
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(),
96                 ntb.build());
97         wtx.commit().get();
98     }
99
100     private static Topology createTopology(final String topologyId, final List<Node> nodes) {
101         return new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
102     }
103
104     private static Node createPcepNode(final String nodeId) {
105         return new NodeBuilder()
106                 .setNodeId(new NodeId(nodeId))
107                 .addAugmentation(new PcepTopologyNodeStatsAugBuilder()
108                     .setPcepSessionState(createTopologySessionState())
109                     .build())
110                 .build();
111     }
112
113     private static PcepSessionState createTopologySessionState() {
114         final ReplyTime replyTime = new ReplyTimeBuilder()
115                 .setAverageTime(Uint32.ONE)
116                 .setMaxTime(Uint32.valueOf(3))
117                 .setMinTime(Uint32.TWO)
118                 .build();
119
120         final ErrorMessages errorMsg = new ErrorMessagesBuilder()
121                 .setReceivedErrorMsgCount(Uint32.ONE)
122                 .setSentErrorMsgCount(Uint32.valueOf(2))
123                 .build();
124
125         final StatefulMessagesStatsAug statefulMsg = new StatefulMessagesStatsAugBuilder()
126                 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
127                 .setSentUpdMsgCount(Uint32.ONE)
128                 .setReceivedRptMsgCount(Uint32.TWO)
129                 .setSentInitMsgCount(Uint32.valueOf(3))
130                 .build();
131
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();
140
141         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
142                 .addAugmentation(new StatefulCapabilitiesStatsAugBuilder()
143                     .setStateful(true)
144                     .setInstantiation(true)
145                     .setActive(true)
146                     .build())
147                 .build();
148
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})
156                     .build())
157                 .build();
158
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();
163     }
164
165     private static PcepSessionState createRpcSessionState() {
166         final ReplyTime replyTime = new ReplyTimeBuilder()
167                 .setAverageTime(Uint32.ONE)
168                 .setMaxTime(Uint32.valueOf(3))
169                 .setMinTime(Uint32.TWO)
170                 .build();
171
172         final ErrorMessages errorMsg = new ErrorMessagesBuilder()
173                 .setReceivedErrorMsgCount(Uint32.ONE).setSentErrorMsgCount(Uint32.TWO).build();
174
175         final StatefulMessagesRpcAug statefulMsg = new StatefulMessagesRpcAugBuilder()
176                 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(1553183614L))
177                 .setSentUpdMsgCount(Uint32.ONE)
178                 .setReceivedRptMsgCount(Uint32.TWO)
179                 .setSentInitMsgCount(Uint32.valueOf(3))
180                 .build();
181
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();
190
191         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
192                 .addAugmentation(new StatefulCapabilitiesRpcAugBuilder()
193                         .setStateful(true).setInstantiation(true).setActive(true).build())
194                 .build();
195
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})
203                     .build())
204                 .build();
205
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)
210                 .build();
211     }
212
213     @Test
214     public void testGetStatsNoMatch() throws Exception {
215         GetStatsInput in;
216         GetStatsOutput out;
217
218         // Non-existing topology
219         in = createGetStatsInput(NONEXISTENT_TOPOLOGY, null);
220         out = createGetStatsOutput(NONEXISTENT_TOPOLOGY, Collections.emptyList(), null);
221         performTest(in, out);
222
223         // Non-existent node
224         in = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE));
225         out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE), null);
226         performTest(in, out);
227
228         // Non-PCEP topology
229         in = createGetStatsInput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE));
230         out = createGetStatsOutput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE), null);
231         performTest(in, out);
232     }
233
234     @Test
235     public void testGetStatsPartialMatch() throws Exception {
236         GetStatsInput in;
237         GetStatsOutput out;
238
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);
243
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);
248
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);
253     }
254
255     @Test
256     public void testGetStatsAllMatch() throws Exception {
257         GetStatsInput in;
258
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();
264
265         // Implicitly match all PCEP topologies and nodes
266         in = createGetStatsInput(null, null);
267         performCountTest(in, out);
268
269         // Explicitly match all PCEP topologies and nodes
270         final var it1 = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NODE_ID1)).getTopology().values()
271                 .iterator().next();
272         final var it2 = createGetStatsInput(TOPOLOGY_ID2, Arrays.asList(NODE_ID2, NODE_ID3)).getTopology().values()
273                 .iterator().next();
274         in = new GetStatsInputBuilder().setTopology(Arrays.asList(it1, it2)).build();
275         performCountTest(in, out);
276     }
277
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());
283     }
284
285     /*
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
289      */
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());
299     }
300
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))
309                             .build())
310                 .collect(Collectors.toList());
311         } else {
312             nodes = null;
313         }
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))
320                         .setNode(nodes)
321                         .build();
322         } else {
323             topology = null;
324         }
325         return new GetStatsInputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
326                 .build();
327     }
328
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)
339                             .build())
340                 .collect(Collectors.toList());
341         } else {
342             nodes = null;
343         }
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))
350                             .setNode(nodes)
351                             .build();
352         } else {
353             topology = null;
354         }
355         return new GetStatsOutputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
356                 .build();
357     }
358
359     @After
360     public void tearDown() {
361         rpcService.close();
362     }
363 }