import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.CpToDegree;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.CpToDegreeBuilder;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.Direction;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes;
import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.node.attributes.AvailableWavelengths;
import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.node.attributes.AvailableWavelengthsBuilder;
List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks> srgCpList = srg
.getCircuitPacks();
for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks
- circuitPacks : srgCpList) {
+ circuitPacks : srgCpList) {
String circuitPackName = circuitPacks.getCircuitPackName();
CircuitPack cp = this.deviceConfig.getDeviceCp(nodeId, circuitPackName);
if (cp.getPorts() == null) {
}
List<Ports> listPorts = cp.getPorts();
- Collections.sort(listPorts, new SortByName());
+ Collections.sort(listPorts, new SortPortsByName());
int portIndex = 0;
for (Ports port : listPorts) {
// This method returns the linkBuilder object for given source and
// destination.
- public LinkBuilder createLink(String srcNode, String dstNode, String srcTp, String destTp, boolean opposite) {
+ public LinkBuilder createLink(String srcNode, String dstNode, String srcTp, String destTp) {
+ boolean opposite = false;
LOG.info("creating link for {}-{}", srcNode, dstNode);
// Create Destination for link
DestinationBuilder dstNodeBldr = new DestinationBuilder();
lnkBldr.setSource(srcNodeBldr.build());
lnkBldr.setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp));
lnkBldr.withKey(new LinkKey(lnkBldr.getLinkId()));
+ if (srcTp.contains(LinkIdUtil.NETWORK) || destTp.contains(LinkIdUtil.NETWORK)) {
+ opposite = checkXpdrTpBidr(srcNode, dstNode, srcTp, destTp);
+ }
+ if (srcTp.contains("-PP")) {
+ if (srcTp.endsWith("TXRX")) {
+ opposite = opposite && true;
+ } else {
+ opposite = false;
+ }
+ } else if (destTp.contains("-PP")) {
+ if (destTp.endsWith("TXRX")) {
+ opposite = opposite && true;
+ } else {
+ opposite = false;
+ }
+ }
if (opposite) {
org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1Builder lnk1Bldr =
new org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1Builder();
return lnkBldr;
}
+ /**
+ * This method checks if the tp of an xpdr node is bidirectional or not,
+ * before assigning it an opposite link.
+ *
+ */
+ private boolean checkXpdrTpBidr(String srcNode, String dstNode, String srcTp, String destTp) {
+ Mapping mapping = null;
+ if (srcTp.contains(LinkIdUtil.NETWORK)) {
+ mapping = portMapping.getMapping(srcNode.split("-XPDR")[0], srcTp);
+ } else if (destTp.contains(LinkIdUtil.NETWORK)) {
+ mapping = portMapping.getMapping(dstNode.split("-XPDR")[0], destTp);
+ } else {
+ LOG.error("error with link termination point");
+ }
+ if (mapping != null && mapping.getPortDirection() != null) {
+ if (mapping.getPortDirection() == Direction.Bidirectional) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* This method creates links between openroadm-topology nodes.
*
Link1Builder oorAzlnkBldr = new Link1Builder();
oorAzlnkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
- LinkBuilder ietfAzlnkBldr = createLink(srcNode, destNode, srcTp, destTp, false);
+ LinkBuilder ietfAzlnkBldr = createLink(srcNode, destNode, srcTp, destTp);
ietfAzlnkBldr.addAugmentation(Link1.class, oorAzlnkBldr.build());
// ZtoA direction
- LinkBuilder ietfZalnkBldr = createLink(destNode, srcNode, destTp, srcTp, false);
+ LinkBuilder ietfZalnkBldr = createLink(destNode, srcNode, destTp, srcTp);
ietfZalnkBldr.addAugmentation(Link1.class, oorAzlnkBldr.build());
// add opposite link augmentations
destNode = listSrgNodes.get(j).getNodeId().getValue();
// drop links
- srcTp = listDegeeNodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.network.topology.rev150608.Node1.class)
+ srcTp = listDegeeNodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+ .network.topology.rev150608.Node1.class)
.getTerminationPoint().stream().filter(tp -> tp.getTpId().getValue().contains("CTP")).findFirst()
.get().getTpId().getValue();
- destTp = listSrgNodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.network.topology.rev150608.Node1.class)
+ destTp = listSrgNodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+ .network.topology.rev150608.Node1.class)
.getTerminationPoint().stream().filter(tp -> tp.getTpId().getValue().contains("CP")).findFirst()
.get().getTpId().getValue();
- LinkBuilder ietfDropLinkBldr = createLink(srcNode, destNode, srcTp, destTp, false);
+ LinkBuilder ietfDropLinkBldr = createLink(srcNode, destNode, srcTp, destTp);
Link1Builder oorlnk1Bldr = new Link1Builder();
oorlnk1Bldr.setLinkType(OpenroadmLinkType.DROPLINK);
ietfDropLinkBldr.addAugmentation(Link1.class, oorlnk1Bldr.build());
// add links direction
- LinkBuilder ietfaddLinkBldr = createLink(destNode, srcNode, destTp, srcTp, false);
+ LinkBuilder ietfaddLinkBldr = createLink(destNode, srcNode, destTp, srcTp);
oorlnk1Bldr = new Link1Builder();
oorlnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK);
ietfaddLinkBldr.addAugmentation(Link1.class, oorlnk1Bldr.build());
private List<org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes
.AvailableWavelengths> create96AvalWaveSrg() {
- List<org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes
- .AvailableWavelengths> waveList = new ArrayList<>();
+ List<org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes.AvailableWavelengths>
+ waveList = new ArrayList<>();
for (int i = 1; i < 97; i++) {
org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes
--- /dev/null
+/*
+ * Copyright © 2017 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.networkmodel.util;
+
+import java.util.Comparator;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
+
+/**
+ * Class to compare two String containing integer.
+ *
+ * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
+ *
+ */
+public class SortPortsByName implements Comparator<Ports> {
+
+ @Override
+ public int compare(Ports port1, Ports port2) {
+ int num = extractInt(port1.getPortName()) - extractInt(port2.getPortName());
+ int letter = extractString(port1.getPortName()).compareToIgnoreCase(extractString(port2.getPortName()));
+ int diff = port1.getPortName().length() - port2.getPortName().length();
+ if ((diff == 0) || (Math.abs(diff) == 1)) {
+ return num;
+ } else {
+ return letter;
+ }
+ }
+
+ int extractInt(String str) {
+ String num = str.replaceAll("\\D", "");
+ // return 0 if no digits found
+ return num.isEmpty() ? 0 : Integer.parseInt(num);
+ }
+
+ String extractString(String str) {
+ String letter = str.replaceAll("\\d", "");
+ return (letter != null) ? letter : "";
+ }
+}
package org.opendaylight.transportpce.pce;
import java.util.List;
+
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.link.oms.attributes.Span;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmLinkType;
LinkId tmpoppositeLink = null;
org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1 linkOpposite = link
.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1.class);
- tmpoppositeLink = linkOpposite.getOppositeLink();
- LOG.debug("PceLink: reading oppositeLink. {}", linkOpposite.toString());
- if (tmpoppositeLink == null) {
- this.isValid = false;
+ try {
+ tmpoppositeLink = linkOpposite.getOppositeLink();
+ LOG.debug("PceLink: reading oppositeLink. {}", linkOpposite.toString());
+ if (tmpoppositeLink == null) {
+ LOG.error("PceLink: Error reading oppositeLink. Link is ignored {}", this.linkId);
+ return null;
+ }
+ } catch (NullPointerException e) {
LOG.error("PceLink: Error reading oppositeLink. Link is ignored {}", this.linkId);
return null;
}
power = 0;
break;
}
- spanOsnrDb = constantA + constantB * power + constantC * loss + constactD * power * loss;
+ spanOsnrDb = constantA + (constantB * power) + (constantC * loss) + (constactD * power * loss);
if (spanOsnrDb > upperBoundOSNR) {
spanOsnrDb = upperBoundOSNR;
} else if (spanOsnrDb < lowerBoundOSNR) {
}
public boolean isValid() {
- if ((this.linkId == null) || (this.linkType == null) || (this.oppositeLink == null)) {
+ if ((this.linkId == null) || (this.linkType == null)) { // || (this.oppositeLink == null)) {
this.isValid = false;
- LOG.error("PceLink: No Link type or opposite link is available. Link is ignored {}", this.linkId);
+ LOG.error("PceLink: No Link type is available. Link is ignored {}", this.linkId);
}
if ((this.sourceId == null) || (this.destId == null) || (this.sourceTP == null) || (this.destTP == null)) {
this.isValid = false;