4acee5cbda6f2b79394b0f1e47bd0f8be18f7c83
[transportpce.git] / networkmodel / src / test / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmTopologyTest.java
1 /*
2  * Copyright © 2020 Orange Labs, 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.transportpce.networkmodel.util;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.mockito.ArgumentMatchers.any;
16 import static org.mockito.Mockito.never;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 import com.google.common.util.concurrent.FluentFuture;
21 import com.google.common.util.concurrent.ListenableFuture;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Optional;
26 import java.util.concurrent.ExecutionException;
27 import java.util.concurrent.Executor;
28 import java.util.concurrent.TimeUnit;
29 import java.util.concurrent.TimeoutException;
30 import java.util.stream.Collectors;
31 import org.junit.Ignore;
32 import org.junit.Test;
33 import org.junit.runner.RunWith;
34 import org.mockito.Mock;
35 import org.mockito.invocation.InvocationOnMock;
36 import org.mockito.junit.MockitoJUnitRunner;
37 import org.mockito.stubbing.Answer;
38 import org.opendaylight.mdsal.common.api.CommitInfo;
39 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
40 import org.opendaylight.transportpce.common.NetworkUtils;
41 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
42 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
43 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
44 import org.opendaylight.transportpce.networkmodel.util.test.NetworkmodelTestUtil;
45 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
71 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
72 import org.opendaylight.yangtools.yang.common.Uint16;
73
74
75 @RunWith(MockitoJUnitRunner.StrictStubs.class)
76 public class OpenRoadmTopologyTest {
77     @Mock
78     private NetworkTransactionService networkTransactionService;
79
80     @Test
81     public void createTopologyShardForDegreeTest() {
82         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2, List.of());
83         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
84         assertNotNull(topologyShard);
85         assertEquals("Should contain 2 Degree nodes only", 2, topologyShard.getNodes().size());
86         assertEquals("Should contain 2 links", 2, topologyShard.getLinks().size());
87         List<Node> nodes = topologyShard.getNodes().stream()
88             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
89             .collect(Collectors.toList());
90         for (Node node : nodes) {
91             String nodeNb = node.getNodeId().getValue().substring(node.getNodeId().getValue().length() - 1);
92             checkDegreeNode(nodeNb, node);
93         }
94
95         List<Link> links = topologyShard.getLinks().stream()
96             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
97             .collect(Collectors.toList());
98         assertEquals("Should contain 2 express links", 2, links.size());
99         assertEquals("ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX", links.get(0).getLinkId().getValue());
100         assertEquals("ROADMA01-DEG1", links.get(0).getSource().getSourceNode().getValue());
101         assertEquals("DEG1-CTP-TXRX", links.get(0).getSource().getSourceTp().getValue());
102         assertEquals("ROADMA01-DEG2", links.get(0).getDestination().getDestNode().getValue());
103         assertEquals("DEG2-CTP-TXRX", links.get(0).getDestination().getDestTp().getValue());
104         assertEquals("ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX", links.get(1).getLinkId().getValue());
105         assertEquals("ROADMA01-DEG2", links.get(1).getSource().getSourceNode().getValue());
106         assertEquals("DEG2-CTP-TXRX", links.get(1).getSource().getSourceTp().getValue());
107         assertEquals("ROADMA01-DEG1", links.get(1).getDestination().getDestNode().getValue());
108         assertEquals("DEG1-CTP-TXRX", links.get(1).getDestination().getDestTp().getValue());
109     }
110
111     @Test
112     public void createTopologyShardForSrgTest() {
113         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 0,
114             List.of(Integer.valueOf(1)));
115         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
116         assertNotNull(topologyShard);
117         List<Node> nodes = topologyShard.getNodes();
118         assertEquals("Should contain 1 SRG node only", 1, nodes.size());
119         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
120         checkSrgNode("1", nodes.get(0));
121     }
122
123     @Test
124     public void createTopologyShardForMultipleSrgTest() {
125         List<Integer> srgNbs = List.of(Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(10),
126             Integer.valueOf(11));
127         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 0, srgNbs);
128         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
129         assertNotNull(topologyShard);
130         List<Node> nodes = topologyShard.getNodes().stream()
131             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
132             .collect(Collectors.toList());
133         assertEquals("Should contain 4 SRG nodes", 4, nodes.size());
134         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
135         checkSrgNode("1", nodes.get(0));
136         checkSrgNode("10", nodes.get(1));
137         checkSrgNode("11", nodes.get(2));
138         checkSrgNode("2", nodes.get(3));
139     }
140
141     @Test
142     public void createTopologyShardForCompleteRdmNodeTest() {
143         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2,
144             List.of(Integer.valueOf(1), Integer.valueOf(2)));
145         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
146         assertNotNull(topologyShard);
147         assertEquals("Should contain 2 Deg and 2 SRG nodes", 4, topologyShard.getNodes().size());
148         List<Link> addLinks = topologyShard.getLinks().stream()
149             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.ADDLINK))
150             .collect(Collectors.toList());
151         assertEquals("Should contain 4 add links", 4, addLinks.size());
152         List<Link> dropLinks = topologyShard.getLinks().stream()
153             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.DROPLINK))
154             .collect(Collectors.toList());
155         assertEquals("Should contain 4 drop links", 4, dropLinks.size());
156         List<Link> expressLinks = topologyShard.getLinks().stream()
157             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.EXPRESSLINK))
158             .collect(Collectors.toList());
159         assertEquals("Should contain 2 express links", 2, expressLinks.size());
160     }
161
162     @Test
163     public void createTopologyShardForTpdrNodeTest() {
164         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, null);
165         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
166         assertNotNull(topologyShard);
167         assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
168         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
169         checkTpdrNode(topologyShard.getNodes().get(0));
170     }
171
172     @Test
173     public void createTopologyShardForTpdrNode2Test() {
174         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Tpdr);
175         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
176         assertNotNull(topologyShard);
177         assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
178         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
179         checkTpdrNode(topologyShard.getNodes().get(0));
180     }
181
182     @Test
183     public void createTopologyShardForMpdrNodeTest() {
184         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Mpdr);
185         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
186         assertNotNull(topologyShard);
187         assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
188         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
189         checkOtnXpdrNode(topologyShard.getNodes().get(0));
190     }
191
192     @Test
193     public void createTopologyShardForSwitchNodeTest() {
194         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Switch);
195         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
196         assertNotNull(topologyShard);
197         assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
198         assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
199         checkOtnXpdrNode(topologyShard.getNodes().get(0));
200     }
201
202     @Ignore
203     @Test
204     public void createTopologyShardForRdmWithoutClliTest() {
205         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", null, 2, List.of());
206         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
207         assertNull("clli must not be null", topologyShard);
208     }
209
210     @Test
211     public void deleteLinkOkTest() throws InterruptedException, ExecutionException {
212         String srcNode = "ROADM-A1-DEG1";
213         String dstNode = "ROADM-A1-SRG1";
214         String srcTp = "DEG1-CTP-TXRX";
215         String destTp = "SRG1-CP-TXRX";
216         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
217         org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1 link1 =
218             new Link1Builder().build();
219         Link link = new LinkBuilder()
220             .setLinkId(linkId)
221             .setSource(new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp)).build())
222             .setDestination(new DestinationBuilder().setDestNode(new NodeId(dstNode)).setDestTp(new TpId(destTp))
223                 .build())
224             .addAugmentation(link1)
225             .build();
226         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
227             new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
228             .child(Link.class, new LinkKey(linkId)).build();
229         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
230             .thenReturn(new LinkFuture(link));
231
232         Answer<FluentFuture<CommitInfo>> answer = new Answer<FluentFuture<CommitInfo>>() {
233
234             @Override
235             public FluentFuture<CommitInfo> answer(InvocationOnMock invocation) throws Throwable {
236                 return CommitInfo.emptyFluentFuture();
237             }
238
239         };
240         when(networkTransactionService.commit()).then(answer);
241
242         boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
243             networkTransactionService);
244         assertTrue("link deletion should be ok", result);
245     }
246
247     @Test
248     public void deleteLinkNotOkTest() throws InterruptedException, ExecutionException {
249         String srcNode = "ROADM-A1-DEG1";
250         String dstNode = "ROADM-A1-SRG1";
251         String srcTp = "DEG1-CTP-TXRX";
252         String destTp = "SRG1-CP-TXRX";
253         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
254
255         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
256             new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
257             .child(Link.class, new LinkKey(linkId)).build();
258         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID)).thenReturn(new LinkFuture());
259
260         boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
261             networkTransactionService);
262         assertFalse("link deletion should not be ok", result);
263     }
264
265     @Test
266     public void deleteLinkExceptionTest() throws InterruptedException, ExecutionException {
267         String srcNode = "ROADM-A1-DEG1";
268         String dstNode = "ROADM-A1-SRG1";
269         String srcTp = "DEG1-CTP-TXRX";
270         String destTp = "SRG1-CP-TXRX";
271         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
272
273         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
274                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
275                 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId)).build();
276         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
277                 .thenReturn(new InterruptedLinkFuture());
278         boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
279                 networkTransactionService);
280         verify(networkTransactionService, never()).merge(any(), any(), any());
281         assertFalse("Result should be false du to InterruptedException", result);
282     }
283
284     private void checkDegreeNode(String nodeNb, Node node) {
285         assertEquals("ROADMA01-DEG" + nodeNb, node.getNodeId().getValue());
286         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
287             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
288             .collect(Collectors.toList());
289         assertEquals(2, supportingNodes.size());
290         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
291         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
292         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
293         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
294         assertEquals(OpenroadmNodeType.DEGREE, node.augmentation(Node1.class).getNodeType());
295         assertEquals(Uint16.valueOf(nodeNb), node.augmentation(
296             org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
297             .getDegreeAttributes().getDegreeNumber());
298         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
299             org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
300             .getDegreeAttributes().getAvailFreqMaps().values());
301         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
302         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
303         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
304         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
305         List<TerminationPoint> tps = node.augmentation(
306             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
307             .nonnullTerminationPoint().values().stream()
308             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
309             .collect(Collectors.toList());
310         assertEquals(2, tps.size());
311         assertEquals("DEG" + nodeNb + "-CTP-TXRX", tps.get(0).getTpId().getValue());
312         assertEquals(OpenroadmTpType.DEGREETXRXCTP, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
313         assertEquals("DEG" + nodeNb + "-TTP-TXRX", tps.get(1).getTpId().getValue());
314         assertEquals(OpenroadmTpType.DEGREETXRXTTP, tps.get(1).augmentation(TerminationPoint1.class).getTpType());
315     }
316
317     private void checkSrgNode(String nodeNb, Node node) {
318         assertEquals("ROADMA01-SRG" + nodeNb, node.getNodeId().getValue());
319         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
320             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
321             .collect(Collectors.toList());
322         assertEquals(2, supportingNodes.size());
323         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
324         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
325         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
326         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
327         assertEquals(OpenroadmNodeType.SRG, node.augmentation(Node1.class).getNodeType());
328         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
329                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
330                 .getSrgAttributes().getAvailFreqMaps().values());
331         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
332         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
333         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
334         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
335         List<TerminationPoint> tps = node.augmentation(
336             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
337             .nonnullTerminationPoint().values().stream()
338             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
339             .collect(Collectors.toList());
340         assertEquals(5, tps.size());
341         assertEquals("SRG" + nodeNb + "-CP-TXRX", tps.get(0).getTpId().getValue());
342         assertEquals(OpenroadmTpType.SRGTXRXCP, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
343         assertEquals("SRG" + nodeNb + "-PP3-TXRX", tps.get(3).getTpId().getValue());
344         assertEquals(OpenroadmTpType.SRGTXRXPP, tps.get(3).augmentation(TerminationPoint1.class).getTpType());
345     }
346
347     private void checkTpdrNode(Node node) {
348         assertEquals("XPDRA01-XPDR1", node.getNodeId().getValue());
349         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
350             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
351             .collect(Collectors.toList());
352         assertEquals(2, supportingNodes.size());
353         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
354         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
355         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
356         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
357         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
358         List<TerminationPoint> tps = node.augmentation(
359             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
360             .nonnullTerminationPoint().values().stream()
361             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
362             .collect(Collectors.toList());
363         assertEquals(4, tps.size());
364         assertEquals("XPDR1-CLIENT1", tps.get(0).getTpId().getValue());
365         assertEquals(OpenroadmTpType.XPONDERCLIENT, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
366         assertEquals("XPDR1-NETWORK1", tps.get(0).augmentation(TerminationPoint1.class)
367                 .getAssociatedConnectionMapTp()
368                 .iterator()
369                 .next()
370                 .getValue());
371         assertEquals("XPDR1-NETWORK1", tps.get(2).getTpId().getValue());
372         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(2).augmentation(TerminationPoint1.class).getTpType());
373         assertEquals("XPDR1-CLIENT1", tps.get(2).augmentation(
374                 TerminationPoint1.class)
375                 .getAssociatedConnectionMapTp()
376                 .iterator()
377                 .next()
378                 .getValue());
379     }
380
381     private void checkOtnXpdrNode(Node node) {
382         assertEquals("XPDRA01-XPDR1", node.getNodeId().getValue());
383         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
384             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
385             .collect(Collectors.toList());
386         assertEquals(2, supportingNodes.size());
387         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
388         assertEquals("nodeA", supportingNodes.get(0).getNodeRef().getValue());
389         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
390         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
391         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
392         List<TerminationPoint> tps = node.augmentation(
393             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
394             .nonnullTerminationPoint().values().stream()
395             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
396             .collect(Collectors.toList());
397         assertEquals(2, tps.size());
398         assertEquals("XPDR1-NETWORK1", tps.get(0).getTpId().getValue());
399         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
400     }
401
402     private class LinkFuture implements  ListenableFuture<Optional<Link>> {
403
404         private Link link;
405
406         LinkFuture() {
407         }
408
409         LinkFuture(Link link) {
410             this.link = link;
411         }
412
413         @Override
414         public boolean cancel(boolean arg0) {
415             return false;
416         }
417
418         @Override
419         public Optional<Link> get() throws InterruptedException, ExecutionException {
420             if (link != null) {
421                 return Optional.of(link);
422             } else {
423                 return Optional.empty();
424             }
425         }
426
427         @Override
428         public Optional<Link> get(long arg0, TimeUnit arg1)
429             throws InterruptedException, ExecutionException, TimeoutException {
430             if (link != null) {
431                 return Optional.of(link);
432             } else {
433                 return Optional.empty();
434             }
435         }
436
437         @Override
438         public boolean isCancelled() {
439             return false;
440         }
441
442         @Override
443         public boolean isDone() {
444             return false;
445         }
446
447         @Override
448         public void addListener(Runnable listener, Executor executor) {
449         }
450     }
451
452     private class InterruptedLinkFuture implements  ListenableFuture<Optional<Link>> {
453
454         @Override
455         public boolean cancel(boolean arg0) {
456             return false;
457         }
458
459         @Override
460         public Optional<Link> get() throws InterruptedException, ExecutionException {
461             throw new InterruptedException("Interrupted");
462         }
463
464         @Override
465         public Optional<Link> get(long arg0, TimeUnit arg1)
466             throws InterruptedException, ExecutionException, TimeoutException {
467             throw new InterruptedException("Interrupted");
468         }
469
470         @Override
471         public boolean isCancelled() {
472             return false;
473         }
474
475         @Override
476         public boolean isDone() {
477             return false;
478         }
479
480         @Override
481         public void addListener(Runnable listener, Executor executor) {
482         }
483     }
484 }