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