Manage opposite link in topology in unidir context 04/79304/6 sendate
authorGilles Thouenon <gilles.thouenon@orange.com>
Tue, 8 Jan 2019 11:14:57 +0000 (12:14 +0100)
committerMartial COULIBALY <martial.coulibaly@gfi.fr>
Tue, 8 Jan 2019 15:51:17 +0000 (16:51 +0100)
- add opposite link augmentation at the link creation in openroadm
topology only when the link is terminated on bidirectional tp. This
forces pce to calculate ZtoA path in a unidirectional topology context
(instead of 'reversing' AtoZ path)
- change the port sorting in portmapping/topo.

Change-Id: I998d4cb57391ac001d13024f7ece2ffa5cb47eb7
JIRA: TRNSPRTPCE-70
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Co-authored-by: Christophe Betoule <christophe.betoule@orange.com>
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/OrdLink.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/LinkIdUtil.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/SortPortsByName.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/PceLink.java

index 829be75e0f94b72a5df81f6b0e15ceb827d9614b..1f83df4f593a6a98e7f5fc27a55da6fc0cb21f50 100644 (file)
@@ -61,7 +61,7 @@ final class OrdLink {
         String destTp = input.getTerminationPointZ();
 
         //IETF link builder
-        LinkBuilder linkBuilder = openRoadmTopology.createLink(srcNode, destNode, srcTp, destTp, true);
+        LinkBuilder linkBuilder = openRoadmTopology.createLink(srcNode, destNode, srcTp, destTp);
 
         linkBuilder.addAugmentation(Link1.class,link1Builder.build());
         linkBuilder.addAugmentation(org.opendaylight.yang.gen.v1.http
index e45bd7193bf1377f776718c395deb0fecee0f246..9b748824f87acad21b9a6fece5e7e30fe957b501 100644 (file)
@@ -101,7 +101,7 @@ final class Rdm2XpdrLink {
         nwBuilder.setNetworkId(nwId);
         nwBuilder.withKey(new NetworkKey(nwId));
         Link1Builder lnk1bldr = new Link1Builder();
-        LinkBuilder linkBuilder = openRoadmTopology.createLink(srcNode, destNode, srcTp, destTp, true);
+        LinkBuilder linkBuilder = openRoadmTopology.createLink(srcNode, destNode, srcTp, destTp);
         lnk1bldr.setLinkType(isXponderInput ? OpenroadmLinkType.XPONDERINPUT : OpenroadmLinkType.XPONDEROUTPUT);
         linkBuilder.addAugmentation(Link1.class, lnk1bldr.build());
         LOG.info("Link id in the linkbldr {}", linkBuilder.getLinkId());
index 371bdf5bf928384b194d3c30b56ece8b8082d765..cf8bd13382667c9d26f8860ad82abdcca91d7e1d 100644 (file)
@@ -14,7 +14,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 
 public final class LinkIdUtil {
 
-    private static final String NETWORK = "-NETWORK";
+    public static final String NETWORK = "-NETWORK";
     private static final String TRANSMIT = "-TX";
     private static final String RECEIVE = "-RX";
     private static final String BIDIRECTIONAL = "-TXRX";
index 7caed6fbfa48f19e050595bcaa90a431f2d918bb..28461de366278c8042bad9c0ee74a872bb945957 100644 (file)
@@ -33,6 +33,7 @@ import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
 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;
@@ -623,7 +624,7 @@ public class OpenRoadmTopology {
         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) {
@@ -631,7 +632,7 @@ public class OpenRoadmTopology {
             }
 
             List<Ports> listPorts = cp.getPorts();
-            Collections.sort(listPorts, new SortByName());
+            Collections.sort(listPorts, new SortPortsByName());
 
             int portIndex = 0;
             for (Ports port : listPorts) {
@@ -753,7 +754,8 @@ public class OpenRoadmTopology {
 
     // 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();
@@ -769,6 +771,22 @@ public class OpenRoadmTopology {
         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();
@@ -781,6 +799,28 @@ public class OpenRoadmTopology {
         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.
      *
@@ -817,11 +857,11 @@ public class OpenRoadmTopology {
 
                 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
@@ -853,22 +893,22 @@ public class OpenRoadmTopology {
                 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());
@@ -934,8 +974,8 @@ public class OpenRoadmTopology {
     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
diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/SortPortsByName.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/SortPortsByName.java
new file mode 100644 (file)
index 0000000..d057f2a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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 : "";
+    }
+}
index 1108780f0fa2448219c8f0276614ba7e5f55b14d..bdd6fb6ebcebc0b53424ff53fbc06ce435281630 100644 (file)
@@ -9,6 +9,7 @@
 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;
@@ -104,10 +105,14 @@ public class PceLink {
         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;
         }
@@ -185,7 +190,7 @@ public class PceLink {
                 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) {
@@ -242,9 +247,9 @@ public class PceLink {
     }
 
     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;