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;
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;
private final Object destTP;
private final LinkId oppositeLink;
private final Long latency;
+ private final List<Long> srlg;
+ private final double osnr;
+ private final Span omsAttributesSpan;
public PceLink(Link link) {
LOG.debug("PceLink: : PceLink start ");
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);
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;
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;
}
+ @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;