2 * Copyright © 2020 Orange, Inc. and others. All rights reserved.
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
9 package org.opendaylight.transportpce.pce.graph;
11 import static org.junit.Assert.fail;
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;
20 import java.util.Optional;
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;
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;
132 // Test of integration for PceGraph
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)
154 omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
155 .getBindingDOMCodecServices()
157 YangInstanceIdentifier.of(OperationalModeCatalog.QNAME), normalizedNode)
160 WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
161 newWriteOnlyTransaction
162 .put(LogicalDatastoreType.CONFIGURATION,
163 InstanceIdentifier.create(OperationalModeCatalog.class),
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 ");
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()
177 YangInstanceIdentifier.of(org.opendaylight.yang.gen.v1.http.org.opendaylight
178 .transportpce.portmapping.rev220316.Network.QNAME), normalizedNode)
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),
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 ");
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;
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
206 new FileReader("src/test/resources/topologyData/or-base-topology.json", StandardCharsets.UTF_8);
207 topoReader = new JsonReader(gnpyTopo);
208 networks = (Networks) JsonUtil
210 .getDataObjectFromJson(
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 ");
219 if (networkReader != null) {
220 networkReader.close();
222 if (topoReader != null) {
225 } catch (IOException e) {
226 LOG.warn("Cannot close reader ", e);
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);
238 // TOPOLOGY ON WHICH TEST ARE BASED
240 // | | 20dB, 100km,PMD 2 | | 20dB,100km, PMD 2 | |
241 // | 1 |____________________| 2 |_____________________| 5 |
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 |
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));
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));
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));
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));
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));
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));
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));
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));
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);
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);
382 @Test(expected = Exception.class)
383 public void clacPath10GE2() {
384 pceGraph = getOtnPceGraph(StringConstants.SERVICE_TYPE_10GE);
385 Assert.assertEquals(pceGraph.calcPath(), false);
388 @Test(expected = Exception.class)
389 public void clacPath1GE() {
390 pceGraph = getOtnPceGraph(StringConstants.SERVICE_TYPE_1GE);
391 Assert.assertEquals(pceGraph.calcPath(), false);
394 private PceGraph getOtnPceGraph(String type) {
396 link1 = NodeUtils.createRoadmToRoadm("optical",
398 "DEG1-TTP-TX", "DEG1-TTP-RX").build();
400 node = NodeUtils.getOTNNodeBuilder(NodeUtils.geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK).build();
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();
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();
419 pceLink1 = new PceLink(link1, pceOtnNode, pceOtnNode2);
420 pceLink1.setClient("XPONDER-CLIENT");
422 pceLink1.getDestId();
423 pceOtnNode.addOutgoingLink(pceLink1);
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(),
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();
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")))
453 return new NodeBuilder()
454 .setNodeId(new NodeId(nodeId))
455 .withKey(new NodeKey(new NodeId(nodeId)))
456 .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
458 new Node1Builder().setOpenroadmVersion(OpenroadmVersionType._221).build())
460 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
461 .setNodeType(nodeType).build())
465 public static TerminationPoint createNetworkTp(String nodeId, String tpId) {
466 var nwTpId = new TpId(tpId);
467 return new TerminationPointBuilder()
469 .withKey(new TerminationPointKey(nwTpId))
470 .addAugmentation(new TerminationPoint1Builder()
471 .setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder().setState(State.InService).build())
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")))
483 return new NodeBuilder()
484 .setNodeId(new NodeId(nodeId))
485 .withKey(new NodeKey(new NodeId(nodeId)))
486 .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
488 new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
489 .setXpdrAttributes(null).build())
491 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
492 .setNodeType(nodeType).build())
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")
505 .setServiceAEnd(new ServiceAEndBuilder()
506 .setServiceFormat(serviceFormat)
507 .setServiceRate(Uint32.valueOf(100))
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")
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")
533 .setServiceZEnd(new ServiceZEndBuilder()
534 .setServiceFormat(serviceFormat)
535 .setServiceRate(Uint32.valueOf(0))
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")
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")
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()))
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()))
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")
591 .setServiceAEnd(new ServiceAEndBuilder()
592 .setServiceFormat(serviceFormat)
593 .setServiceRate(Uint32.valueOf(100))
596 .setTxDirection(new TxDirectionBuilder()
598 .setRxDirection(new RxDirectionBuilder()
601 .setServiceZEnd(new ServiceZEndBuilder()
602 .setServiceFormat(serviceFormat)
603 .setServiceRate(Uint32.valueOf(0))
606 .setTxDirection(new TxDirectionBuilder()
608 .setRxDirection(new RxDirectionBuilder()
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()))
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()))