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