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