X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2FPceLink.java;h=44e3fad451f48100d7eb60239a4ac16a55b18338;hb=d6570206ef947fa3b667a5039311f8091a2d4570;hp=1ed5c122e0b859213874adecad4d84de6368b50b;hpb=f1333ba85fbbe086ab540d759a3b6a898c52a135;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/PceLink.java b/pce/src/main/java/org/opendaylight/transportpce/pce/PceLink.java index 1ed5c122e..44e3fad45 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/PceLink.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/PceLink.java @@ -8,11 +8,15 @@ package org.opendaylight.transportpce.pce; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmLinkType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link; +import java.util.List; + +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.link.oms.attributes.Span; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType; +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.topology.rev180226.LinkId; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +36,7 @@ public class PceLink { private boolean isValid = true; // this member is for XPONDER INPUT/OUTPUT links. - // it keeps name of client correcponding to NETWORK TP + // it keeps name of client corresponding to NETWORK TP private String client = ""; private final LinkId linkId; @@ -43,6 +47,9 @@ public class PceLink { private final Object destTP; private final LinkId oppositeLink; private final Long latency; + private final List srlg; + private final double osnr; + private final Span omsAttributesSpan; public PceLink(Link link) { LOG.debug("PceLink: : PceLink start "); @@ -60,15 +67,26 @@ public class PceLink { this.oppositeLink = calcOpposite(link); this.latency = calcLatency(link); + if (this.linkType == OpenroadmLinkType.ROADMTOROADM) { + this.omsAttributesSpan = MapUtils.getOmsAttributesSpan(link); + this.srlg = MapUtils.getSRLG(link); + this.osnr = retrieveOSNR(); + } else { + this.omsAttributesSpan = null; + this.srlg = null; + this.osnr = 0L; + } + LOG.debug("PceLink: created PceLink {}", toString()); } private OpenroadmLinkType calcType(Link link) { - Link1 link1 = null; + org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.@Nullable Link1 link1 = null; OpenroadmLinkType tmplType = null; // ID and type - link1 = link.getAugmentation(Link1.class); + link1 = link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130 + .Link1.class); if (link1 == null) { this.isValid = false; LOG.error("PceLink: No Link augmentation available. Link is ignored {}", this.linkId); @@ -87,9 +105,12 @@ public class PceLink { private LinkId calcOpposite(Link link) { // opposite link LinkId tmpoppositeLink = null; - org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1 linkOpposite = link - .getAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1.class); - tmpoppositeLink = linkOpposite.getOppositeLink(); + Link1 linkOpposite = link.augmentation(Link1.class); + if (linkOpposite.getOppositeLink() != null) { + tmpoppositeLink = linkOpposite.getOppositeLink(); + } else { + LOG.error("link {} has no opposite link", link.getLinkId().getValue()); + } LOG.debug("PceLink: reading oppositeLink. {}", linkOpposite.toString()); if (tmpoppositeLink == null) { this.isValid = false; @@ -103,7 +124,7 @@ public class PceLink { Long tmplatency = (long)0; Link1 link1 = null; // latency - link1 = link.getAugmentation(Link1.class); + link1 = link.augmentation(Link1.class); tmplatency = link1.getLinkLatency(); if (tmplatency == null) { tmplatency = (long) 0; @@ -112,6 +133,87 @@ public class PceLink { } + @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance") + public double retrieveOSNR() { + // sum of 1 over the span OSNRs (linear units) + double sum = 0; + // link OSNR, in dB + double linkOsnrDb; + // link OSNR, in dB + double linkOsnrLu; + // span OSNR, in dB + double spanOsnrDb; + // span OSNR, in linear units + double spanOsnrLu; + // default amplifier noise value, in dB + double ampNoise = 5.5; + // fiber span measured loss, in dB + double loss; + // launch power, in dB + double power; + double constantA = 38.97293; + double constantB = 0.72782; + double constantC = -0.532331; + double constactD = -0.019549; + double upperBoundOSNR = 33; + double lowerBoundOSNR = 0.1; + + if (omsAttributesSpan == null) { + // indicates no data or N/A + return 0L; + } + loss = omsAttributesSpan.getSpanlossCurrent().getValue().doubleValue(); + switch (omsAttributesSpan.getLinkConcatenation().get(0).getFiberType()) { + case Smf: + power = 2; + break; + + case Eleaf: + power = 1; + break; + + case Oleaf: + power = 0; + break; + + case Dsf: + power = 0; + break; + + case Truewave: + power = 0; + break; + + case Truewavec: + power = -1; + break; + + case NzDsf: + power = 0; + break; + + case Ull: + power = 0; + break; + + default: + power = 0; + break; + } + spanOsnrDb = constantA + constantB * power + constantC * loss + constactD * power * loss; + if (spanOsnrDb > upperBoundOSNR) { + spanOsnrDb = upperBoundOSNR; + } else if (spanOsnrDb < lowerBoundOSNR) { + spanOsnrDb = lowerBoundOSNR; + } + spanOsnrLu = Math.pow(10, (spanOsnrDb / 10.0)); + sum = PceConstraints.CONST_OSNR / spanOsnrLu; + linkOsnrLu = sum; + //link_OSNR_dB = 10 * Math.log10(1 / sum); + LOG.debug("In retrieveOSNR: link OSNR is {} dB", linkOsnrLu); + return linkOsnrLu; + } + public LinkId getOppositeLink() { return this.oppositeLink;