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