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.networkanalyzer;
11 import static org.junit.Assert.assertEquals;
13 import java.math.RoundingMode;
14 import java.util.HashMap;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.mockito.Mock;
20 import org.mockito.MockitoAnnotations;
21 import org.opendaylight.transportpce.common.NetworkUtils;
22 import org.opendaylight.transportpce.common.StringConstants;
23 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
24 import org.opendaylight.transportpce.common.mapping.PortMapping;
25 import org.opendaylight.transportpce.test.AbstractTest;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.FiberPmd;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1Builder;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
61 import org.opendaylight.yangtools.yang.common.Decimal64;
62 import org.opendaylight.yangtools.yang.common.Uint32;
64 public class PceLinkTest extends AbstractTest {
66 private static final String LINK_ID_FORMAT = "%1$s-%2$sto%3$s-%4$s";
67 private PceLink pceLink = null;
68 private String deviceNodeId = "device node";
69 private String deviceNodeId2 = "device node 2";
70 private String serviceType = "100GE";
72 private PortMapping portMapping;
76 MockitoAnnotations.openMocks(this);
80 public void testBuildPceLinkRoadmToRoadm() {
81 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
82 pceLink = new PceLink(
83 createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build(),
84 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
85 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
86 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
87 new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
88 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
89 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
93 public void testBuildPceLinkRoadmToRoadmWithoutPMD() {
94 Link link = createRoadmToRoadmWithoutPMD("srcNode", "destNode", "srcTp", "destTp").build();
95 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
96 pceLink = new PceLink(
98 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
99 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
100 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
101 new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
102 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
103 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
104 Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link));
105 Assert.assertEquals(1, pceLink.getsrlgList().size());
106 assertEquals("Checking length loss", 20.0, pceLink.getspanLoss(), 0.005);
107 assertEquals("Checking length loss", 825.0, pceLink.getcd(), 0.005);
108 assertEquals("Checking PMDvalue of link", 4.0, pceLink.getpmd2(), 0.005);
112 public void testBuildPceLinkRoadmToRoadmWithoutLinkLatency() {
113 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
114 pceLink = new PceLink(
115 createRoadmToRoadmWithoutLinkLatency("srcNode", "destNode", "srcTp", "destTp").build(),
116 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
117 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
118 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
119 new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
120 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
121 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
125 public void testBuildPceLinkOTN() {
126 // TODO: Modify with OTN node not PceOpticalNode
127 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
128 pceLink = new PceLink(
129 createOTNLink("srcNode", "destNode", "srcTp", "destTp").build(),
130 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
131 OpenroadmNodeType.SWITCH, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
132 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
133 new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
134 OpenroadmNodeType.SWITCH, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
135 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
139 public void testBuildPceLinkExponder() {
140 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
141 pceLink = new PceLink(
142 createXponderLink("srcNode", "destNode", "srcTp", "destTp").build(),
143 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
144 OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
145 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
146 new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
147 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
148 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
152 public void testCalcSpanOSNR() {
153 Link link = createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build();
154 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
155 pceLink = new PceLink(
157 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
158 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
159 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
160 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
161 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
162 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
163 Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link));
164 // Assert.assertNotNull(pceLink.getosnr());
165 Assert.assertEquals(1, pceLink.getsrlgList().size());
166 assertEquals("Checking PMDvalue of link", 0.25, pceLink.getpmd2(), 0.005);
167 assertEquals("Checking CDvalue of link", 825, pceLink.getcd(), 0.005);
168 // Assert.assertTrue(7.857119000000001 == pceLink.getosnr());
169 Assert.assertNull(pceLink.getOppositeLink());
170 Assert.assertNull(pceLink.getOppositeLink());
171 Assert.assertNotNull(pceLink.getDestTP());
172 Assert.assertNotNull(pceLink.getlinkType());
173 Assert.assertNotNull(pceLink.getLinkId());
174 Assert.assertNotNull(pceLink.getSourceId());
175 Assert.assertNotNull(pceLink.getDestId());
176 pceLink.setClient("specific_client");
177 Assert.assertTrue(pceLink.getClient().equals("specific_client"));
178 Assert.assertNotNull(pceLink.getClient());
179 Assert.assertNotNull(pceLink.getLatency());
180 Assert.assertNotNull(pceLink.getAvailableBandwidth());
181 Assert.assertNotNull(pceLink.getUsedBandwidth());
182 Assert.assertNotNull(pceLink.getsourceNetworkSupNodeId());
183 Assert.assertNotNull(pceLink.getdestNetworkSupNodeId());
184 Assert.assertNotNull(pceLink.getSourceTP());
185 Assert.assertNotNull(pceLink.getsourceCLLI());
186 Assert.assertNotNull(pceLink.getdestCLLI());
187 Assert.assertTrue(pceLink.toString().equals("PceLink type=" + pceLink.getlinkType()
188 + " ID=" + pceLink.getLinkId().getValue() + " latency=" + pceLink.getLatency().intValue()));
192 public void testWrongSpanLoss() {
193 Link link = createInvalidRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build();
194 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
195 pceLink = new PceLink(
197 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
198 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
199 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
200 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
201 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
202 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
203 Assert.assertNull(MapUtils.getOmsAttributesSpan(link));
204 Assert.assertNull(pceLink.getpmd2());
205 Assert.assertNull(pceLink.getpowerCorrection());
206 Assert.assertNull(pceLink.getcd());
210 public void testExtrapolatedPMD() {
211 Link link = createRoadmToRoadmWithoutPMD("srcNode", "destNode", "srcTp", "destTp").build();
212 Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
213 pceLink = new PceLink(
215 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
216 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
217 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
218 new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
219 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
220 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
221 Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link));
222 Assert.assertEquals(1, pceLink.getsrlgList().size());
223 assertEquals("Checking PMDvalue of link", 4.0, pceLink.getpmd2(), 0.005);
226 private static LinkBuilder createOTNLink(String srcNode, String destNode, String srcTp, String destTp) {
227 return createLinkBuilder(false, false, 10000.0, srcNode, destNode, srcTp, destTp,
229 .setLinkType(OpenroadmLinkType.OTNLINK)
230 .setOperationalState(State.InService)
231 .setAdministrativeState(AdminStates.InService));
234 private static LinkBuilder createXponderLink(String srcNode, String destNode, String srcTp, String destTp) {
235 // create source link
236 return createLinkBuilder(false, false, 10.0, srcNode, destNode, srcTp, destTp,
238 .setLinkType(OpenroadmLinkType.XPONDERINPUT)
239 .setAdministrativeState(AdminStates.InService)
240 .setOperationalState(State.InService));
243 private static LinkBuilder createLinkBuilder(boolean pmdpresent, boolean omspresent, double length,
244 String srcNode, String destNode, String srcTp, String destTp, Link1Builder link1Builder) {
245 LinkId linkId = new LinkId(String.format(LINK_ID_FORMAT, srcNode, srcTp, destNode, destTp));
246 LinkBuilder linkBuilder = new LinkBuilder()
248 new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp)).build())
250 new DestinationBuilder().setDestNode(new NodeId(destNode)).setDestTp(new TpId(destTp)).build())
252 .withKey(new LinkKey(linkId))
253 .addAugmentation(link1Builder.build());
255 LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
256 .withKey(new LinkConcatenationKey(Uint32.valueOf(1)))
257 .setSRLGLength(Decimal64.valueOf(length, RoundingMode.FLOOR))
260 ? new LinkConcatenation1Builder().setFiberType(FiberType.Smf)
261 .setPmd(FiberPmd.getDefaultInstance("0.500")).build()
262 : new LinkConcatenation1Builder().setFiberType(FiberType.Smf).build())
264 linkBuilder.addAugmentation(
265 new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder()
267 new OMSAttributesBuilder()
268 .setSpan(new SpanBuilder()
269 // .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("55")))
270 .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("20")))
271 .setLinkConcatenation(Map.of(linkConcatenation.key(), linkConcatenation))
279 private static LinkBuilder createRoadmToRoadm(String srcNode, String destNode, String srcTp, String destTp) {
280 return createLinkBuilder(true, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
281 .setLinkLatency(Uint32.valueOf(100))
282 .setAdministrativeState(AdminStates.InService)
283 .setOperationalState(State.InService)
284 .setLinkType(OpenroadmLinkType.ROADMTOROADM)
285 .setLinkLength(Decimal64.valueOf(50.0, RoundingMode.FLOOR)));
288 private static LinkBuilder createRoadmToRoadmWithoutPMD(String srcNode, String destNode, String srcTp,
290 return createLinkBuilder(false, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
291 .setLinkLatency(Uint32.valueOf(100))
292 .setAdministrativeState(AdminStates.InService)
293 .setOperationalState(State.InService)
294 .setLinkType(OpenroadmLinkType.ROADMTOROADM)
295 .setLinkLength(Decimal64.valueOf(50.0, RoundingMode.FLOOR)));
298 private static LinkBuilder createInvalidRoadmToRoadm(String srcNode, String destNode,
299 String srcTp, String destTp) {
300 return createLinkBuilder(false, false, 0.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
301 .setLinkLatency(Uint32.valueOf(100))
302 .setAdministrativeState(AdminStates.InService)
303 .setOperationalState(State.InService)
304 .setLinkType(OpenroadmLinkType.ROADMTOROADM));
307 private static LinkBuilder createRoadmToRoadmWithoutLinkLatency(
308 String srcNode, String destNode, String srcTp, String destTp) {
309 return createLinkBuilder(true, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
310 .setLinkType(OpenroadmLinkType.ROADMTOROADM));
313 private Map<SupportingNodeKey, SupportingNode> geSupportingNodes() {
314 SupportingNode supportingNode1 = new SupportingNodeBuilder()
315 .setNodeRef(new NodeId("node 1"))
316 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
318 SupportingNode supportingNode2 = new SupportingNodeBuilder()
319 .setNodeRef(new NodeId("node 2"))
320 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
322 return new HashMap<>(Map.of(
323 supportingNode1.key(), supportingNode1,
324 supportingNode2.key(), supportingNode2));
327 private NodeBuilder getNodeBuilder(Map<SupportingNodeKey, SupportingNode> supportingNodes1) {
328 // update tp of nodes
329 TerminationPoint xpdr = new TerminationPointBuilder()
330 .withKey(new TerminationPointKey(new TpId("xpdr")))
332 new TerminationPoint1Builder()
333 .setTpType(OpenroadmTpType.XPONDERNETWORK)
334 .setAdministrativeState(AdminStates.InService)
335 .setOperationalState(State.InService)
338 return new NodeBuilder()
339 .setNodeId(new NodeId("node 1"))
340 .withKey(new NodeKey(new NodeId("node 1")))
341 .addAugmentation(new Node1Builder().setTerminationPoint(Map.of(xpdr.key(), xpdr)).build())
343 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
344 .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build())
345 .setSupportingNode(supportingNodes1);