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