/* * Copyright © 2020 Orange, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.transportpce.pce.networkanalyzer; import com.google.common.collect.ImmutableList; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.test.AbstractTest; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev181130.RatioDB; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.span.attributes.LinkConcatenation; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.span.attributes.LinkConcatenationBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.link.OMSAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.link.oms.attributes.SpanBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmNodeType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType; import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder; public class PceLinkTest extends AbstractTest { private static final String LINK_ID_FORMAT = "%1$s-%2$sto%3$s-%4$s"; private static final Long WAVE_LENGTH = 20L; private PceLink pceLink = null; @Before public void setup() { } @Test public void testBuildPceLinkRoadmToRoadm() { Link link = createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build(); NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); PceOpticalNode pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.SRG, new NodeId("optical"), ServiceFormat.OMS, "test"); pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode); } @Test public void testBuildPceLinkOTN() { Link link = createOTNLink("srcNode", "destNode", "srcTp", "destTp").build(); NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); PceOpticalNode pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.SRG, new NodeId("optical"), ServiceFormat.OMS, "test"); pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode); } @Test public void testBuildPceLinkExponder() { Link link = createXponderLink("srcNode", "destNode", "srcTp", "destTp").build(); NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); PceOpticalNode pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.SRG, new NodeId("optical"), ServiceFormat.OMS, "test"); pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode); } @Test public void testCalcSpanOSNR() { Link link = createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build(); NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); PceOpticalNode pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.SRG, new NodeId("optical"), ServiceFormat.OMS, "test"); pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode); Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link)); Assert.assertNotNull(pceLink.calcSpanOSNR()); Assert.assertEquals(0, pceLink.getsrlgList().size()); Assert.assertTrue(7.857119000000001 == pceLink.calcSpanOSNR()); Assert.assertNull(pceLink.getOppositeLink()); Assert.assertNull(pceLink.getOppositeLink()); Assert.assertNotNull(pceLink.getDestTP()); Assert.assertNotNull(pceLink.getlinkType()); Assert.assertNotNull(pceLink.getLinkId()); Assert.assertNotNull(pceLink.getSourceId()); Assert.assertNotNull(pceLink.getDestId()); Assert.assertNotNull(pceLink.getClient()); Assert.assertNotNull(pceLink.getLatency()); Assert.assertNotNull(pceLink.getAvailableBandwidth()); Assert.assertNotNull(pceLink.getUsedBandwidth()); Assert.assertNotNull(pceLink.getsourceNetworkSupNodeId()); Assert.assertNotNull(pceLink.getdestNetworkSupNodeId()); Assert.assertNotNull(pceLink.getosnr()); Assert.assertNull(pceLink.getsourceCLLI()); Assert.assertNull(pceLink.getdestCLLI()); } @Test public void testPceOpticalNode() { NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); PceOpticalNode pceOpticalNode = new PceOpticalNode(node, OpenroadmNodeType.ROADM, new NodeId("optical"), ServiceFormat.OMS, "test"); pceOpticalNode.initSrgTps(); pceOpticalNode.initXndrTps(); pceOpticalNode.initWLlist(); Assert.assertFalse(pceOpticalNode.isValid()); Assert.assertFalse(pceOpticalNode.checkWL(12)); Assert.assertTrue(pceOpticalNode.checkTP("testTP")); } @Test(expected = NullPointerException.class) public void testPceOTNNode() { NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes()); Node node = node1Builder.build(); Assert.assertNotNull(node.augmentation(Node1.class)); // OpenroadmNodeType nodeType = node.augmentation(Node1.class).; PceOtnNode pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.SRG, node.getNodeId(), "otn", "serviceType"); //pceOtnNode.validateXponder(anodeId, znodeId); /* PceOtnNode pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.DEGREE, new NodeId("optical"), ServiceFormat.OTM.getName(), "test");*/ // pceOtnNode.initXndrTps("mode"); /* pceOtnNode.initSrgTps(); pceOtnNode.initXndrTps(); pceOtnNode.initWLlist(); Assert.assertFalse(pceOtnNode.isValid()); Assert.assertFalse(pceOtnNode.checkWL(12)); Assert.assertTrue(pceOtnNode.checkTP("testTP"));*/ } private static LinkBuilder createOTNLink(String srcNode, String destNode, String srcTp, String destTp) { Link1Builder link1Builder = new Link1Builder() .setLinkType(OpenroadmLinkType.OTNLINK); //create source link return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder); } private static LinkBuilder createXponderLink(String srcNode, String destNode, String srcTp, String destTp) { Link1Builder link1Builder = new Link1Builder() .setLinkType(OpenroadmLinkType.XPONDERINPUT); //create source link return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder); } private static LinkBuilder createLinkBuilder( String srcNode, String destNode, String srcTp, String destTp, Link1Builder link1Builder) { SourceBuilder ietfSrcLinkBldr = new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(srcTp); //create destination link DestinationBuilder ietfDestLinkBldr = new DestinationBuilder().setDestNode(new NodeId(destNode)) .setDestTp(destTp); LinkId linkId = new LinkId(String.format(LINK_ID_FORMAT, srcNode, srcTp, destNode, destTp)); LinkId oppositeLinkId = new LinkId("opposite"); //For setting up attributes for openRoadm augment OMSAttributesBuilder omsAttributesBuilder = new OMSAttributesBuilder() .setSpan(new SpanBuilder() .setSpanlossCurrent(new RatioDB(new BigDecimal("55"))) .setLinkConcatenation(Arrays.asList( new LinkConcatenationBuilder() .setFiberType(LinkConcatenation.FiberType.Dsf) .build() )).build()).setOppositeLink(oppositeLinkId); LinkBuilder linkBuilder = new LinkBuilder() .setSource(ietfSrcLinkBldr.build()) .setDestination(ietfDestLinkBldr.build()) .setLinkId(linkId) .withKey(new LinkKey(linkId)); linkBuilder.addAugmentation( org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1.class, link1Builder.build()); org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder linkBuilderNetworkLink = new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder() .setOMSAttributes(omsAttributesBuilder .build()); linkBuilder.addAugmentation( org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1.class, linkBuilderNetworkLink.build()); return linkBuilder; } private static LinkBuilder createRoadmToRoadm(String srcNode, String destNode, String srcTp, String destTp) { Link1Builder link1Builder = new Link1Builder() .setLinkLatency(100L) .setLinkType(OpenroadmLinkType.ROADMTOROADM); return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder); } private List geSupportingNodes() { List supportingNodes1 = new ArrayList<>(); /* supportingNodes1 .add(new SupportingNodeBuilder() .setNodeRef(new NodeId("node 1")) .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)) .build());*/ supportingNodes1 .add(new SupportingNodeBuilder() .setNodeRef(new NodeId("node 2")) .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)) .build()); return supportingNodes1; } private NodeBuilder getNodeBuilder(List supportingNodes1) { //update tp of nodes TerminationPointBuilder xpdrTpBldr = new TerminationPointBuilder(); TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(); tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); xpdrTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 = new Node1Builder().setTerminationPoint(ImmutableList.of(xpdrTpBldr.build())).build(); return new NodeBuilder() .setNodeId(new NodeId("node 1")) .withKey(new NodeKey(new NodeId("node 1"))) .addAugmentation( Node1.class, node1) .setSupportingNode(supportingNodes1); } }