bb633ca2e4b8bec99ea6b580d850c7aaaf48d3ef
[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
9 package org.opendaylight.bgpcep.pcep.topology.stats.rpc;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
13
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;
65
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";
76
77     TopologyStatsRpcServiceImpl rpcService;
78
79     @Before
80     public void setUp() throws Exception {
81         rpcService = new TopologyStatsRpcServiceImpl(getDataBroker());
82         rpcService.init();
83
84         // PCEP topology with one PCC node
85         final Topology t1 = createTopology(TOPOLOGY_ID1, Collections.singletonList(createPcepNode(NODE_ID1)));
86
87         // PCEP topology with two PCC node
88         final Topology t2 =
89                 createTopology(TOPOLOGY_ID2, Arrays.asList(createPcepNode(NODE_ID2), createPcepNode(NODE_ID3)));
90
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()));
94
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(),
99                 ntb.build());
100         wtx.commit().get();
101     }
102
103     private Topology createTopology(final String topologyId, final List<Node> nodes) {
104         return new TopologyBuilder().setTopologyId(new TopologyId(topologyId)).setNode(nodes).build();
105     }
106
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())
111                 .build();
112     }
113
114     private PcepSessionState createTopologySessionState() {
115         final ReplyTime replyTime = new ReplyTimeBuilder().setAverageTime(1L).setMaxTime(3L).setMinTime(2L).build();
116
117         final ErrorMessages errorMsg =
118                 new ErrorMessagesBuilder().setReceivedErrorMsgCount(1L).setSentErrorMsgCount(2L).build();
119
120         final StatefulMessagesStatsAug statefulMsg =
121                 new StatefulMessagesStatsAugBuilder().setLastReceivedRptMsgTimestamp(1553183614L).setSentUpdMsgCount(1L)
122                         .setReceivedRptMsgCount(2L).setSentInitMsgCount(3L).build();
123
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();
127
128         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
129                 .addAugmentation(StatefulCapabilitiesStatsAug.class, new StatefulCapabilitiesStatsAugBuilder()
130                         .setStateful(true).setInstantiation(true).setActive(true).build())
131                 .build();
132
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())
137                         .build();
138
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();
142     }
143
144     private PcepSessionState createRpcSessionState() {
145         final ReplyTime replyTime = new ReplyTimeBuilder().setAverageTime(1L).setMaxTime(3L).setMinTime(2L).build();
146
147         final ErrorMessages errorMsg =
148                 new ErrorMessagesBuilder().setReceivedErrorMsgCount(1L).setSentErrorMsgCount(2L).build();
149
150         final StatefulMessagesRpcAug statefulMsg =
151                 new StatefulMessagesRpcAugBuilder().setLastReceivedRptMsgTimestamp(1553183614L).setSentUpdMsgCount(1L)
152                         .setReceivedRptMsgCount(2L).setSentInitMsgCount(3L).build();
153
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();
157
158         final PeerCapabilities capabilities = new PeerCapabilitiesBuilder()
159                 .addAugmentation(StatefulCapabilitiesRpcAug.class, new StatefulCapabilitiesRpcAugBuilder()
160                         .setStateful(true).setInstantiation(true).setActive(true).build())
161                 .build();
162
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())
167                         .build();
168
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();
172     }
173
174     @Test
175     public void testGetStatsNoMatch() throws Exception {
176         GetStatsInput in;
177         GetStatsOutput out;
178
179         // Non-existing topology
180         in = createGetStatsInput(NONEXISTENT_TOPOLOGY, null);
181         out = createGetStatsOutput(NONEXISTENT_TOPOLOGY, Collections.emptyList(), null);
182         performTest(in, out);
183
184         // Non-existent node
185         in = createGetStatsInput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE));
186         out = createGetStatsOutput(TOPOLOGY_ID1, Collections.singletonList(NONEXISTENT_NODE), null);
187         performTest(in, out);
188
189         // Non-PCEP topology
190         in = createGetStatsInput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE));
191         out = createGetStatsOutput(NONPCEP_TOPOLOGY, Collections.singletonList(NONPCEP_NODE), null);
192         performTest(in, out);
193     }
194
195     @Test
196     public void testGetStatsPartialMatch() throws Exception {
197         GetStatsInput in;
198         GetStatsOutput out;
199
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);
204
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);
209
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);
214     }
215
216     @Test
217     @SuppressWarnings("checkstyle:LineLength")
218     public void testGetStatsAllMatch() throws Exception {
219         GetStatsInput in;
220
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();
228
229         // Implicitly match all PCEP topologies and nodes
230         in = createGetStatsInput(null, null);
231         performCountTest(in, out);
232
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);
240     }
241
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());
247     }
248
249     /*
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
253      */
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());
262     }
263
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());
272         } else {
273             nodes = null;
274         }
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) {
277             topology =
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();
280         } else {
281             topology = null;
282         }
283         return new GetStatsInputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
284                 .build();
285     }
286
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());
296         } else {
297             nodes = null;
298         }
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) {
301             topology =
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();
304         } else {
305             topology = null;
306         }
307         return new GetStatsOutputBuilder().setTopology(topology != null ? Collections.singletonList(topology) : null)
308                 .build();
309     }
310
311     @After
312     public void tearDown() {
313         rpcService.close();
314     }
315 }