Migrate pce module to JUnit5
[transportpce.git] / pce / src / test / java / org / opendaylight / transportpce / pce / graph / PceGraphTest.java
1 /*
2  * Copyright © 2020 Orange, 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.transportpce.pce.graph;
10
11
12 import static org.junit.jupiter.api.Assertions.assertEquals;
13 import static org.junit.jupiter.api.Assertions.assertThrows;
14 import static org.junit.jupiter.api.Assertions.fail;
15
16 import com.google.common.collect.ImmutableMap;
17 import com.google.gson.stream.JsonReader;
18 import java.io.FileReader;
19 import java.io.IOException;
20 import java.io.Reader;
21 import java.nio.charset.StandardCharsets;
22 import java.util.Map;
23 import java.util.Optional;
24 import java.util.Set;
25 import java.util.concurrent.ExecutionException;
26 import org.eclipse.jdt.annotation.NonNull;
27 import org.junit.jupiter.api.BeforeEach;
28 import org.junit.jupiter.api.Test;
29 import org.mockito.MockitoAnnotations;
30 import org.opendaylight.mdsal.binding.api.DataBroker;
31 import org.opendaylight.mdsal.binding.api.MountPoint;
32 import org.opendaylight.mdsal.binding.api.MountPointService;
33 import org.opendaylight.mdsal.binding.api.WriteTransaction;
34 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
35 import org.opendaylight.transportpce.common.NetworkUtils;
36 import org.opendaylight.transportpce.common.StringConstants;
37 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
38 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
39 import org.opendaylight.transportpce.common.mapping.PortMapping;
40 import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
41 import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
42 import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
43 import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
44 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
45 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
46 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
47 import org.opendaylight.transportpce.pce.networkanalyzer.PceCalculation;
48 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
49 import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
50 import org.opendaylight.transportpce.pce.networkanalyzer.PceOtnNode;
51 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
52 import org.opendaylight.transportpce.pce.utils.JsonUtil;
53 import org.opendaylight.transportpce.pce.utils.NodeUtils;
54 import org.opendaylight.transportpce.test.AbstractTest;
55 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
56 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
57 import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
58 import org.opendaylight.transportpce.test.stub.MountPointStub;
59 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
60 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
61 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder;
62 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder;
63 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
64 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
65 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev211210.OpenroadmVersionType;
66 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1Builder;
67 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder;
68 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
69 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
70 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
71 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
72 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListBuilder;
73 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
74 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
75 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
76 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OperationalModeCatalog;
77 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
78 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
79 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
80 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
85 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
86 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
87 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
88 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
89 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
90 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
91 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
92 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
93 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
94 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
95 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
96 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
97 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
98 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
99 import org.opendaylight.yangtools.yang.common.QName;
100 import org.opendaylight.yangtools.yang.common.Uint32;
101 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
102 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
103 import org.slf4j.Logger;
104 import org.slf4j.LoggerFactory;
105
106 public class PceGraphTest extends AbstractTest {
107     private static final Logger LOG = LoggerFactory.getLogger(PceGraphTest.class);
108     private Link link1 = null;
109     private Node node = null;
110     private PceLink pceLink1 = null;
111     private PceGraph pceGraph = null;
112     private PceConstraints pceHardConstraints = null;
113     private PceResult rc = null;
114     private Map<NodeId, PceNode> allPceNodes = null;
115     private Map<LinkId, PceLink> allPceLinks = null;
116     private static final String CATALOG_FILE = "src/test/resources/apidocCatalog10_1OptSpecV5_1.json";
117     private static final String MAPPING_FILE = "src/test/resources/topologyData/portMapping2.json";
118     private static OperationalModeCatalog omCatalog;
119     private static org.opendaylight.yang.gen.v1.http.org.opendaylight
120             .transportpce.portmapping.rev220316.Network networkNode;
121     private DataBroker dataBroker;
122     private MountPoint mountPoint;
123     private MountPointService mountPointService;
124     private DeviceTransactionManager deviceTransactionManager;
125     private PortMappingVersion710 portMappingVersion710;
126     private PortMappingVersion221 portMappingVersion22;
127     private PortMappingVersion121 portMappingVersion121;
128     private PortMapping portMapping;
129     private NetworkTransactionService netTransServ;
130
131     // Test of integration for PceGraph
132
133     @BeforeEach
134     void setUp() throws InterruptedException, ExecutionException {
135         // PortMapping is instantiated to create the mapping of the different nodes in the topology
136         this.dataBroker =  getNewDataBroker();
137         this.mountPoint = new MountPointStub(dataBroker);
138         this.mountPointService = new MountPointServiceStub(mountPoint);
139         this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
140         this.portMappingVersion22 = new PortMappingVersion221(dataBroker, deviceTransactionManager);
141         this.portMappingVersion121 = new PortMappingVersion121(dataBroker, deviceTransactionManager);
142         this.portMappingVersion710 = new PortMappingVersion710(dataBroker, deviceTransactionManager);
143         this.portMapping = new PortMappingImpl(dataBroker, this.portMappingVersion710,
144             this.portMappingVersion22, this.portMappingVersion121);
145         //  The catalog of operational mode needs to be loaded so that Ctalog primitives (CatlogUtils)
146         // can retrieve physical parameters of the nodes of the path
147         DataObjectConverter dataObjectConverter = JSONDataObjectConverter
148             .createWithDataStoreUtil(getDataStoreContextUtil());
149         try (Reader reader = new FileReader(CATALOG_FILE, StandardCharsets.UTF_8)) {
150             NormalizedNode normalizedNode = dataObjectConverter
151                 .transformIntoNormalizedNode(reader)
152                 .get();
153             omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
154                 .getBindingDOMCodecServices()
155                 .fromNormalizedNode(
156                     YangInstanceIdentifier.of(OperationalModeCatalog.QNAME), normalizedNode)
157                 .getValue();
158             @NonNull
159             WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
160             newWriteOnlyTransaction
161                 .put(LogicalDatastoreType.CONFIGURATION,
162                     InstanceIdentifier.create(OperationalModeCatalog.class),
163                     omCatalog);
164             newWriteOnlyTransaction.commit().get();
165         } catch (IOException e) {
166             LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
167             fail("Cannot load openROADM operational modes ");
168         }
169         // The mapping corresponding to the topology is directly populated from a file in the Dta Store
170         try (Reader reader = new FileReader(MAPPING_FILE, StandardCharsets.UTF_8)) {
171             NormalizedNode normalizedNode = dataObjectConverter.transformIntoNormalizedNode(reader).get();
172             networkNode = (org.opendaylight.yang.gen.v1.http.org.opendaylight
173                     .transportpce.portmapping.rev220316.Network) getDataStoreContextUtil()
174                 .getBindingDOMCodecServices()
175                 .fromNormalizedNode(
176                     YangInstanceIdentifier.of(org.opendaylight.yang.gen.v1.http.org.opendaylight
177                         .transportpce.portmapping.rev220316.Network.QNAME), normalizedNode)
178                 .getValue();
179             @NonNull
180             WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
181             newWriteOnlyTransaction
182                 .put(LogicalDatastoreType.CONFIGURATION,
183                     InstanceIdentifier.create(org.opendaylight.yang.gen.v1.http.org.opendaylight
184                         .transportpce.portmapping.rev220316.Network.class),
185                     networkNode);
186             newWriteOnlyTransaction.commit().get();
187         } catch (IOException e) {
188             LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
189             fail("Cannot load openROADM operational modes ");
190         }
191
192         MockitoAnnotations.openMocks(this);
193         // The topology (openROADM-Network and openROADM-topology layers) is loaded from a file
194         JsonReader networkReader = null;
195         JsonReader topoReader = null;
196         try {
197             // load openroadm-network
198             Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json", StandardCharsets.UTF_8);
199             networkReader = new JsonReader(gnpyNetwork);
200             Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
201                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
202             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID);
203             // load openroadm-topology
204             Reader gnpyTopo =
205                 new FileReader("src/test/resources/topologyData/or-base-topology.json", StandardCharsets.UTF_8);
206             topoReader = new JsonReader(gnpyTopo);
207             networks = (Networks) JsonUtil
208                 .getInstance()
209                 .getDataObjectFromJson(
210                     topoReader,
211                     QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
212             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID);
213         } catch (IOException | InterruptedException | ExecutionException e) {
214             LOG.error("Cannot init test ", e);
215             fail("Cannot init test ");
216         } finally {
217             try {
218                 if (networkReader != null) {
219                     networkReader.close();
220                 }
221                 if (topoReader != null) {
222                     topoReader.close();
223                 }
224             } catch (IOException e) {
225                 LOG.warn("Cannot close reader ", e);
226             }
227         }
228         // init PceHardContraints
229         pceHardConstraints = new PceConstraints();
230         this.rc = new PceResult();
231         this.netTransServ = new NetworkTransactionImpl(dataBroker);
232         LOG.info("The value of the mapping is {}", portMapping);
233     }
234
235 //                       TOPOLOGY ON WHICH TEST ARE BASED
236 //           _____                      _____                       _____
237 //          |     | 20dB, 100km,PMD 2  |     | 20dB,100km, PMD 2   |     |
238 //          |  1  |____________________|  2  |_____________________|  5  |
239 //          |     |                    |     |                     |     |
240 //          |_____|                    |_____|                     |_____|
241 //              |___________      10km    |   20dB,100km,PMD32    /   |  100 km
242 //                          |      5dB    |   _________|_________/    |  25 dB
243 //                          |     PMD32 __|__/                      __|__PMD 2.0
244 //        28dB, 100km,PMD 0 |          |     | 25dB,100km, PMD 2   |     |
245 //                          |__________|  3  |_____________________|  4  |
246 //                                     |     |                     |     |
247 //                                     |_____|                     |_____|
248 //
249     @Test
250     void clacPath100GE() {
251         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
252             "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
253             netTransServ, pceHardConstraints, null, rc, portMapping);
254         pceCalc.retrievePceNetwork();
255         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
256             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
257             null, rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ);
258         assertEquals(pceGraph.calcPath(), true);
259         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(3.0919881995992924));
260     }
261
262     @Test
263     void clacPathOTUC2() {
264         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(200), ServiceFormat.Ethernet,
265             "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-4", "Node4", "XPDR-NW1-RX"),
266             netTransServ, pceHardConstraints, null, rc, portMapping);
267         pceCalc.retrievePceNetwork();
268         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
269             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
270             null, rc, StringConstants.SERVICE_TYPE_OTUC2, netTransServ);
271         assertEquals(pceGraph.calcPath(), true);
272         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.1559963686478447));
273     }
274
275     @Test
276     void clacPathOTUC3() {
277         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(300), ServiceFormat.Ethernet,
278             "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-3", "Node3", "XPDR-NW1-RX"),
279             netTransServ, pceHardConstraints, null, rc, portMapping);
280         pceCalc.retrievePceNetwork();
281         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
282             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
283             null, rc, StringConstants.SERVICE_TYPE_OTUC3, netTransServ);
284         assertEquals(pceGraph.calcPath(), true);
285         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.3351048800367167));
286     }
287
288     @Test
289     void clacUnfeasiblePath400GE() {
290         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
291             "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
292             netTransServ, pceHardConstraints, null, rc, portMapping);
293         pceCalc.retrievePceNetwork();
294         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
295             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
296             null, rc, StringConstants.SERVICE_TYPE_400GE, netTransServ);
297         assertEquals(pceGraph.calcPath(), false);
298         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.0));
299     }
300
301     @Test
302     void clacPath400GE() {
303         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
304             "XPONDER-1", "Node1", "Client-1", "XPONDER-5", "Node5", "Client-1"),
305             netTransServ, pceHardConstraints, null, rc, portMapping);
306         pceCalc.retrievePceNetwork();
307         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
308             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
309             null, rc, StringConstants.SERVICE_TYPE_400GE, netTransServ);
310         assertEquals(pceGraph.calcPath(), true);
311         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.4432381874659086));
312     }
313
314     @Test
315     void clacPathOTUC4() {
316         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
317             "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-5", "Node5", "XPDR-NW1-RX"),
318             netTransServ, pceHardConstraints, null, rc, portMapping);
319         pceCalc.retrievePceNetwork();
320         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
321             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
322             null, rc, StringConstants.SERVICE_TYPE_OTUC4, netTransServ);
323         assertEquals(pceGraph.calcPath(), true);
324         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.4432381874659086));
325     }
326
327     @Test
328     void clacOpticalTunnelOTUC4() {
329         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.OC,
330             "OpenROADM-1", "Node1", "DEG1-PP-TX", "OpenROADM-5", "Node5", "DEG3-PP-TX"),
331             netTransServ, pceHardConstraints, null, rc, portMapping);
332         pceCalc.retrievePceNetwork();
333         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
334             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
335             null, rc, StringConstants.SERVICE_TYPE_OTUC4, netTransServ);
336         assertEquals(pceGraph.calcPath(), true);
337         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.0));
338     }
339
340     @Test
341     void clacPath100GEnoPort() {
342         PceCalculation pceCalc = new PceCalculation(getPCE2Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
343             "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
344             netTransServ, pceHardConstraints, null, rc, portMapping);
345         pceCalc.retrievePceNetwork();
346         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
347             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
348             null, rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ);
349         assertEquals(pceGraph.calcPath(), true);
350         assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(3.0919881995992924));
351     }
352
353     @Test
354     void clacPathPropagationDelay() {
355         PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
356             "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
357             netTransServ, pceHardConstraints, null, rc, portMapping);
358         pceCalc.retrievePceNetwork();
359         pceHardConstraints.setPceMetrics(PceMetric.PropagationDelay);
360         pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
361             pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
362             null, rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ);
363         pceGraph.setConstrains(pceHardConstraints, null);
364
365         assertEquals(pceGraph.calcPath(), true);
366         assertEquals(Optional.ofNullable(pceGraph.getPathAtoZ().get(2).getLatency()),
367             Optional.ofNullable(1.0));
368         assertEquals(pceGraph.getReturnStructure().getRate(), 100);
369     }
370
371     //FIXME: Review this test. Getting NPE is never normal!
372     @Test
373     void clacPath10GE2() {
374         assertThrows(NullPointerException.class, () -> {
375             getOtnPceGraph(StringConstants.SERVICE_TYPE_10GE);
376         });
377 //        assertEquals(pceGraph.calcPath(), false);
378     }
379
380     //FIXME: Review this test. Getting NPE is never normal!
381     @Test
382     void clacPath1GE() {
383         assertThrows(NullPointerException.class, () -> {
384             getOtnPceGraph(StringConstants.SERVICE_TYPE_1GE);
385         });
386 //        assertEquals(pceGraph.calcPath(), false);
387     }
388
389     private PceGraph getOtnPceGraph(String type) {
390         // Build Link
391         link1 = NodeUtils.createRoadmToRoadm("optical", "optical2", "DEG1-TTP-TX", "DEG1-TTP-RX").build();
392
393         node = NodeUtils.getOTNNodeBuilder(NodeUtils.geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK).build();
394
395         PceOtnNode pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
396             new NodeId("optical"), ServiceFormat.OTU.getName(), "serviceType", null);
397         pceOtnNode.validateXponder("optical", "sl");
398         pceOtnNode.validateXponder("not optical", "sl");
399         pceOtnNode.initXndrTps("AZ");
400         pceOtnNode.checkAvailableTribPort();
401         pceOtnNode.checkAvailableTribSlot();
402
403         PceOtnNode pceOtnNode2 = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
404             new NodeId("optical2"), ServiceFormat.OTU.getName(), "serviceType", null);
405         pceOtnNode2.validateXponder("optical", "sl");
406         pceOtnNode2.validateXponder("not optical", "sl");
407         pceOtnNode2.initXndrTps("AZ");
408         pceOtnNode2.initXndrTps("mode");
409         pceOtnNode2.checkAvailableTribPort();
410         pceOtnNode2.checkAvailableTribSlot();
411
412         pceLink1 = new PceLink(link1, pceOtnNode, pceOtnNode2);
413         pceLink1.setClient("XPONDER-CLIENT");
414
415         pceLink1.getDestId();
416         pceOtnNode.addOutgoingLink(pceLink1);
417
418         // init PceHardContraints
419         pceHardConstraints = new PceConstraints();
420         // pceHardConstraints.setp
421         allPceNodes = Map.of(
422             new NodeId("optical"), pceOtnNode,
423             new NodeId("optical2"), pceOtnNode2);
424         return new PceGraph(pceOtnNode, pceOtnNode2, allPceNodes, allPceLinks, pceHardConstraints, null,
425                 new PceResult(), type, null);
426     }
427
428     private void saveOpenRoadmNetwork(Network network, String networkId)
429             throws InterruptedException, ExecutionException {
430         InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
431             .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
432         WriteTransaction dataWriteTransaction = dataBroker.newWriteOnlyTransaction();
433         dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
434         dataWriteTransaction.commit().get();
435     }
436
437     public static Node createNetworkNode(String nodeId, OpenroadmNodeType nodeType) {
438         SupportingNode supportingNode = new SupportingNodeBuilder()
439             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
440             .setNodeRef(new NodeId("node1"))
441             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
442                 new NodeId("node1")))
443             .build();
444         return new NodeBuilder()
445             .setNodeId(new NodeId(nodeId))
446             .withKey(new NodeKey(new NodeId(nodeId)))
447             .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
448             .addAugmentation(
449                 new Node1Builder().setOpenroadmVersion(OpenroadmVersionType._221).build())
450             .addAugmentation(
451                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
452                     .setNodeType(nodeType).build())
453             .build();
454     }
455
456     public static TerminationPoint createNetworkTp(String nodeId, String tpId) {
457         var nwTpId = new TpId(tpId);
458         return new TerminationPointBuilder()
459             .setTpId(nwTpId)
460             .withKey(new TerminationPointKey(nwTpId))
461             .addAugmentation(new TerminationPoint1Builder()
462                 .setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder().setState(State.InService).build())
463                 .build())
464             .build();
465     }
466
467     public static Node createTopologyNode(String nodeId, OpenroadmNodeType nodeType) {
468         SupportingNode supportingNode = new SupportingNodeBuilder()
469             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
470             .setNodeRef(new NodeId("node1"))
471             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
472                 new NodeId("node1")))
473             .build();
474         return new NodeBuilder()
475             .setNodeId(new NodeId(nodeId))
476             .withKey(new NodeKey(new NodeId(nodeId)))
477             .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
478             .addAugmentation(
479                 new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
480                     .setXpdrAttributes(null).build())
481             .addAugmentation(
482                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
483                     .setNodeType(nodeType).build())
484             .build();
485     }
486
487     public static PathComputationRequestInput getPCE1Request(Uint32 rate, ServiceFormat serviceFormat, String aaNodeId,
488             String aaClliId, String aaPortName, String zzNodeId, String zzClliId, String zzPortName) {
489         return new PathComputationRequestInputBuilder()
490             .setServiceName("service1")
491             .setResourceReserve(true)
492             .setPceRoutingMetric(PceMetric.HopCount)
493             .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
494                 .setRequestId("request1")
495                 .build())
496             .setServiceAEnd(new ServiceAEndBuilder()
497                 .setServiceFormat(serviceFormat)
498                 .setServiceRate(Uint32.valueOf(100))
499                 .setClli(aaClliId)
500                 .setNodeId(aaNodeId)
501                 .setTxDirection(new TxDirectionBuilder()
502                     .setPort(new PortBuilder()
503                         .setPortDeviceName(aaNodeId)
504                         .setPortType("fixed")
505                         .setPortName(aaPortName)
506                         .setPortRack("Some port-rack")
507                         .setPortShelf("Some port-shelf")
508                         .setPortSlot("Some port-slot")
509                         .setPortSubSlot("Some port-sub-slot")
510                         .build())
511                     .build())
512                 .setRxDirection(new RxDirectionBuilder()
513                     .setPort(new PortBuilder()
514                         .setPortDeviceName(aaNodeId)
515                         .setPortType("fixed")
516                         .setPortName(aaPortName)
517                         .setPortRack("Some port-rack")
518                         .setPortShelf("Some port-shelf")
519                         .setPortSlot("Some port-slot")
520                         .setPortSubSlot("Some port-sub-slot")
521                         .build())
522                     .build())
523                 .build())
524             .setServiceZEnd(new ServiceZEndBuilder()
525                 .setServiceFormat(serviceFormat)
526                 .setServiceRate(Uint32.valueOf(0))
527                 .setClli(zzClliId)
528                 .setNodeId(zzNodeId)
529                 .setTxDirection(new TxDirectionBuilder()
530                     .setPort(new PortBuilder()
531                         .setPortDeviceName(zzNodeId)
532                         .setPortType("fixed")
533                         .setPortName(zzPortName)
534                         .setPortRack("Some port-rack")
535                         .setPortShelf("Some port-shelf")
536                         .setPortSlot("Some port-slot")
537                         .setPortSubSlot("Some port-sub-slot")
538                         .build())
539                     .build())
540                 .setRxDirection(new RxDirectionBuilder()
541                     .setPort(new PortBuilder()
542                         .setPortDeviceName(zzNodeId)
543                         .setPortType("fixed")
544                         .setPortName(zzPortName)
545                         .setPortRack("Some port-rack")
546                         .setPortShelf("Some port-shelf")
547                         .setPortSlot("Some port-slot")
548                         .setPortSubSlot("Some port-sub-slot")
549                         .build())
550                     .build())
551                 .build())
552             .setHardConstraints(new HardConstraintsBuilder()
553                 .setCustomerCode(Set.of("Some customer-code"))
554                 .setCoRouting(new CoRoutingBuilder()
555                     .setServiceIdentifierList(Map.of(
556                         new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
557                                 .routing.ServiceIdentifierListKey("Some existing-service"),
558                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
559                     .build())
560                 .build())
561             .setSoftConstraints(new SoftConstraintsBuilder()
562                 .setCustomerCode(Set.of("Some customer-code"))
563                 .setCoRouting(new CoRoutingBuilder()
564                     .setServiceIdentifierList(Map.of(
565                         new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
566                                 .routing.ServiceIdentifierListKey("Some existing-service"),
567                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
568                     .build())
569                 .build())
570             .build();
571     }
572
573     public static PathComputationRequestInput getPCE2Request(Uint32 rate, ServiceFormat serviceFormat, String aaNodeId,
574             String aaClliId, String aaPortName, String zzNodeId, String zzClliId, String zzPortName) {
575         return new PathComputationRequestInputBuilder()
576             .setServiceName("service1")
577             .setResourceReserve(true)
578             .setPceRoutingMetric(PceMetric.HopCount)
579             .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
580                 .setRequestId("request1")
581                 .build())
582             .setServiceAEnd(new ServiceAEndBuilder()
583                 .setServiceFormat(serviceFormat)
584                 .setServiceRate(Uint32.valueOf(100))
585                 .setClli(aaClliId)
586                 .setNodeId(aaNodeId)
587                 .setTxDirection(new TxDirectionBuilder()
588                   .build())
589                 .setRxDirection(new RxDirectionBuilder()
590                     .build())
591                 .build())
592             .setServiceZEnd(new ServiceZEndBuilder()
593                 .setServiceFormat(serviceFormat)
594                 .setServiceRate(Uint32.valueOf(0))
595                 .setClli(zzClliId)
596                 .setNodeId(zzNodeId)
597                 .setTxDirection(new TxDirectionBuilder()
598                     .build())
599                 .setRxDirection(new RxDirectionBuilder()
600                     .build())
601                 .build())
602             .setHardConstraints(new HardConstraintsBuilder()
603                 .setCustomerCode(Set.of("Some customer-code"))
604                 .setCoRouting(new CoRoutingBuilder()
605                     .setServiceIdentifierList(Map.of(
606                         new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
607                                 .routing.ServiceIdentifierListKey("Some existing-service"),
608                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
609                     .build())
610                 .build())
611             .setSoftConstraints(new SoftConstraintsBuilder()
612                 .setCustomerCode(Set.of("Some customer-code"))
613                 .setCoRouting(new CoRoutingBuilder()
614                     .setServiceIdentifierList(Map.of(
615                         new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
616                                 .routing.ServiceIdentifierListKey("Some existing-service"),
617                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
618                     .build())
619                 .build())
620                     .build();
621     }
622 }