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