Bug corrections in PCE 78/78378/10
authorMartial COULIBALY <martial.coulibaly@gfi.fr>
Mon, 3 Dec 2018 13:19:36 +0000 (14:19 +0100)
committerMartial COULIBALY <martial.coulibaly@gfi.fr>
Thu, 6 Dec 2018 17:42:19 +0000 (18:42 +0100)
Solve Bugs conerning PCE random selection on :
- ROADM-SRG node
- SRG-PP port

JIRA: TRNSPRTPCE-52
Change-Id: Ia04a62f419315239dab5170ffb874b58ab6224e5
Signed-off-by: Martial COULIBALY <martial.coulibaly@gfi.fr>
pce/src/main/java/org/opendaylight/transportpce/pce/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/PceNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/SortPortsByName.java [new file with mode: 0644]

index d9b5f029d42431d205972bc39dd412a265cf1d1a..67e9b02cf21efa9a571fdea79a4899c7ae0300fd 100644 (file)
@@ -15,6 +15,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
@@ -128,7 +129,9 @@ public class PceCalculation {
             LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier);
             return false;
         }
-        this.allNodes = nw.getNode();
+        this.allNodes = nw.getNode().stream()
+                .sorted((node1, node2) -> node1.getNodeId().getValue().compareTo(node2.getNodeId().getValue()))
+                .collect(Collectors.toList());
         Network1 nw1 = nw.augmentation(Network1.class);
         this.allLinks = nw1.getLink();
         if ((this.allNodes == null) || this.allNodes.isEmpty()) {
@@ -237,12 +240,12 @@ public class PceCalculation {
                 LOG.info("validateLink: EXPRESS-LINK added to allPceLinks {}", pcelink.toString());
                 break;
             case ADDLINK :
-                pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString()));
+                pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString(), true));
                 this.addLinks.add(pcelink);
-                LOG.debug("validateLink: ADD-LINK saved  {}", pcelink.toString());
+                LOG.info("validateLink: ADD-LINK saved  {}", pcelink.toString());
                 break;
             case DROPLINK :
-                pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString()));
+                pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString(), false));
                 this.dropLinks.add(pcelink);
                 LOG.info("validateLink: DROP-LINK saved  {}", pcelink.toString());
                 break;
@@ -328,21 +331,29 @@ public class PceCalculation {
             return false;
         }
         if (supNodeId.equals(this.anodeId)) {
-            if (endPceNode(nodeType, nodeId, pceNode, true)) {
-                if (!pceNode.isValid()) {
-                    LOG.error("validateNode: There are no available wavelengths in node {}", nodeId.getValue());
-                    return false;
+            if (this.aendPceNode == null) {
+                if (endPceNode(nodeType, nodeId, pceNode, true)) {
+                    if (!pceNode.isValid()) {
+                        LOG.error("validateNode: There are no available wavelengths in node {}", nodeId.getValue());
+                        return false;
+                    }
+                    this.aendPceNode = pceNode;
                 }
-                this.aendPceNode = pceNode;
+            } else {
+                LOG.warn("aendPceNode already gets: {}", this.aendPceNode);
             }
         }
         if (supNodeId.equals(this.znodeId)) {
-            if (endPceNode(nodeType, nodeId, pceNode, false)) {
-                if (!pceNode.isValid()) {
-                    LOG.error("validateNode: There are no available wavelengths in node {}", nodeId.getValue());
-                    return false;
+            if (this.zendPceNode == null) {
+                if (endPceNode(nodeType, nodeId, pceNode, false)) {
+                    if (!pceNode.isValid()) {
+                        LOG.error("validateNode: There are no available wavelengths in node {}", nodeId.getValue());
+                        return false;
+                    }
+                    this.zendPceNode = pceNode;
                 }
-                this.zendPceNode = pceNode;
+            } else {
+                LOG.warn("zendPceNode already gets: {}", this.zendPceNode);
             }
         }
         pceNode.initWLlist();
@@ -359,7 +370,7 @@ public class PceCalculation {
         Boolean add = true;
         switch (openroadmNodeType) {
             case SRG :
-                pceNode.initRdmSrgTps(aend);
+                pceNode.initSrgTps();
                 this.azSrgs.add(nodeId);
                 break;
             case XPONDER :
index 27d8d1c30eed24a4a3cb96502968f7d56cf19cd4..28372ffb5b6bd94a91c7fef2d3e22dd812db2446 100644 (file)
@@ -16,7 +16,7 @@ import java.util.TreeMap;
 
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.termination.point.cp.attributes.UsedWavelengths;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.termination.point.pp.attributes.UsedWavelength;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId;
@@ -36,14 +36,11 @@ public class PceNode {
     private final OpenroadmNodeType nodeType;
     // wavelength calculation per node type
     private List<Long> availableWLindex = new ArrayList<Long>();
-    // private Set<String> availableSrgPp = new TreeSet<String>();
     private Map<String, OpenroadmTpType> availableSrgPp = new TreeMap<String, OpenroadmTpType>();
     private Map<String, OpenroadmTpType> availableSrgCp = new TreeMap<String, OpenroadmTpType>();
     private List<String> usedXpndrNWTps = new ArrayList<String>();
-    private List<String> usedSrgPP = new ArrayList<String>();
     private List<PceLink> outgoingLinks = new ArrayList<PceLink>();
     private Map<String, String> clientPerNwTp = new HashMap<String, String>();
-    private Map<String, String> clientPerPpTp = new HashMap<String, String>();
 
     public PceNode(Node node, OpenroadmNodeType nodeType, NodeId nodeId) {
         this.node = node;
@@ -55,7 +52,7 @@ public class PceNode {
         }
     }
 
-    public void initSrgTpList() {
+    public void initSrgTps() {
         this.availableSrgPp.clear();
         this.availableSrgCp.clear();
         if (!isValid()) {
@@ -73,28 +70,40 @@ public class PceNode {
             this.valid = false;
             return;
         }
-        boolean used;
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.node
                 .TerminationPoint tp : allTps) {
-            used = true;
             TerminationPoint1 tp1 = tp.augmentation(TerminationPoint1.class);
-            try {
-                List<UsedWavelengths> usedWavelengths = tp1.getCpAttributes().getUsedWavelengths();
-                if (usedWavelengths.isEmpty()) {
-                    LOG.info("initSrgTpList: SRG-CP tp = {} found", tp.getTpId().getValue());
-                    used = false;
-                }
-            } catch (NullPointerException e) {
-                LOG.warn("initSrgTpList: 'usedWavelengths' for tp={} is null !", tp.getTpId().getValue());
-                used = false;
-            }
-            if (!used) {
-                if (tp1.getTpType().getName().contains("-PP")) {
-                    LOG.info("initSrgTpList: adding tp '{}'", tp1.getTpType());
-                    this.availableSrgPp.put(tp.getTpId().getValue(), tp1.getTpType());
-                } else if (tp1.getTpType().getName().contains("-CP")) {
+            OpenroadmTpType type = tp1.getTpType();
+            switch (type) {
+                case SRGTXRXCP:
+                case SRGRXCP:
+                case SRGTXCP:
+                    LOG.info("initSrgTpList: adding SRG-CP tp = {} ", tp.getTpId().getValue());
                     this.availableSrgCp.put(tp.getTpId().getValue(), tp1.getTpType());
-                }
+                    break;
+                case SRGRXPP:
+                case SRGTXPP:
+                case SRGTXRXPP:
+                    boolean used = true;
+                    LOG.info("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
+                    try {
+                        List<UsedWavelength> usedWavelengths = tp1.getPpAttributes().getUsedWavelength();
+                        if (usedWavelengths.isEmpty()) {
+                            used = false;
+                        }
+                    } catch (NullPointerException e) {
+                        LOG.warn("initSrgTpList: 'usedWavelengths' for tp={} is null !", tp.getTpId().getValue());
+                        used = false;
+                    }
+                    if (!used) {
+                        LOG.info("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
+                        this.availableSrgPp.put(tp.getTpId().getValue(), tp1.getTpType());
+                    } else {
+                        LOG.warn("initSrgTpList: SRG-PP tp = {} found is busy !!");
+                    }
+                    break;
+                default:
+                    break;
             }
         }
         if (this.availableSrgPp.isEmpty() && this.availableSrgCp.isEmpty()) {
@@ -203,81 +212,47 @@ public class PceNode {
         }
     }
 
-    public void initRdmSrgTps(Boolean aend) {
-        LOG.info("initRdmSrgTps for node : {}", this.nodeId);
-        initSrgTpList();
-        if (!isValid()) {
-            return;
+    public String getRdmSrgClient(String tp, Boolean aend) {
+        LOG.info("getRdmSrgClient: Getting PP client for tp '{}' on node : {}", tp, this.nodeId);
+        OpenroadmTpType srgType = null;
+        OpenroadmTpType cpType = this.availableSrgCp.get(tp);
+        if (cpType == null) {
+            LOG.error("getRdmSrgClient: tp {} not existed in SRG CPterminationPoint list");
+            return null;
         }
-        this.valid = false;
-        Optional<String> optTp = null;
-        OpenroadmTpType srgType = OpenroadmTpType.SRGTXRXPP;
-        OpenroadmTpType oppositeSrgType = null;
-        Optional<String> oppositeTp = null;
-        boolean unidir = false;
-        optTp = this.availableSrgCp.entrySet().stream().filter(cp -> cp.getValue() == OpenroadmTpType.SRGTXRXCP)
-                .map(Map.Entry::getKey).findFirst();
-        if (!optTp.isPresent()) {
-            srgType = null;
-            unidir = true;
-            LOG.info("UNI Directional ports ...");
-            if (aend) {
-                LOG.info("Tx port ...");
-                optTp = this.availableSrgCp.entrySet().stream().filter(cp -> cp.getValue() == OpenroadmTpType.SRGTXCP)
-                        .map(Map.Entry::getKey).findFirst();
+        switch (cpType) {
+            case SRGTXRXCP:
+                LOG.info("getRdmSrgClient: Getting BI Directional PP port ...");
+                srgType = OpenroadmTpType.SRGTXRXPP;
+                break;
+            case SRGTXCP:
+                LOG.info("getRdmSrgClient: Getting UNI Rx PP port ...");
                 srgType = OpenroadmTpType.SRGRXPP;
-                oppositeSrgType = OpenroadmTpType.SRGTXPP;
-                oppositeTp = this.availableSrgCp.entrySet().stream()
-                        .filter(cp -> cp.getValue() == OpenroadmTpType.SRGRXCP).map(Map.Entry::getKey).findFirst();
-            } else {
-                LOG.info("Rx port ...");
-                optTp = this.availableSrgCp.entrySet().stream().filter(cp -> cp.getValue() == OpenroadmTpType.SRGRXCP)
-                        .map(Map.Entry::getKey).findFirst();
+                break;
+            case SRGRXCP:
+                LOG.info("getRdmSrgClient: Getting UNI Tx PP port ...");
                 srgType = OpenroadmTpType.SRGTXPP;
-                oppositeSrgType = OpenroadmTpType.SRGRXPP;
-                oppositeTp = this.availableSrgCp.entrySet().stream()
-                        .filter(cp -> cp.getValue() == OpenroadmTpType.SRGTXCP).map(Map.Entry::getKey).findFirst();
-            }
-        } else {
-            LOG.info("BI Directional ports ...");
+                break;
+            default:
+                break;
         }
-        if (optTp.isPresent() && (srgType != null)) {
-            String tp = optTp.get();
-            if (!this.availableSrgPp.isEmpty()) {
-                LOG.info("finding PP for CP {}", optTp.get());
-                Optional<String> client = null;
-                final OpenroadmTpType openType = srgType;
-                client = this.availableSrgPp.entrySet().stream().filter(pp -> pp.getValue() == openType)
-                        .map(Map.Entry::getKey).findFirst();
-                if (!client.isPresent()) {
-                    LOG.error("initRdmSrgTps: ROADM {} doesn't have defined Client {}", this.toString(), tp);
-                    this.valid = false;
-                    return;
-                }
-                if (unidir) {
-                    final OpenroadmTpType oppositeOpType = oppositeSrgType;
-                    String opTp = oppositeTp.get();
-                    Optional<String> oppositeClient = this.availableSrgPp.entrySet().stream()
-                            .filter(pp -> pp.getValue() == oppositeOpType)
-                            .map(Map.Entry::getKey).findFirst();
-                    if (!oppositeClient.isPresent()) {
-                        LOG.error("initRdmSrgTps: ROADM {} doesn't have defined opposite Client {}",
-                                this.toString(), tp);
-                        this.valid = false;
-                        return;
-                    }
-                    this.clientPerPpTp.put(opTp, oppositeClient.get());
-                    LOG.info("initRdmSrgTps: client PP {} for oposite CP {} found !", client, tp);
-                }
-                this.valid = true;
-                this.clientPerPpTp.put(tp, client.get());
-                LOG.info("initRdmSrgTps: client PP {} for CP {} found !", client, tp);
+        LOG.info("getRdmSrgClient:  Getting client PP for CP '{}'", tp);
+        if (!this.availableSrgPp.isEmpty()) {
+            Optional<String> client = null;
+            final OpenroadmTpType openType = srgType;
+            client = this.availableSrgPp.entrySet().stream().filter(pp -> pp.getValue() == openType)
+                    .map(Map.Entry::getKey)
+                    .sorted(new SortPortsByName())
+                    .findFirst();
+            if (!client.isPresent()) {
+                LOG.error("getRdmSrgClient: ROADM {} doesn't have PP Client for CP {}", this.toString(), tp);
+                return null;
             }
-        }
-        if (!isValid()) {
-            this.valid = false;
-            LOG.error("initRdmSrgTps: SRG TerminationPoint list is empty for node {}", this.toString());
-            return;
+            LOG.info("getRdmSrgClient: client PP {} for CP {} found !", client, tp);
+            return client.get();
+        } else {
+            LOG.error("getRdmSrgClient: SRG TerminationPoint PP list is not available for node {}", this.toString());
+            return null;
         }
     }
 
@@ -315,13 +290,8 @@ public class PceNode {
         return this.clientPerNwTp.get(tp);
     }
 
-    public String getRdmSrgClient(String tp) {
-        LOG.info("Getting ROADM Client PP for CP {} : {}", tp, this.clientPerPpTp.get(tp));
-        return this.clientPerPpTp.get(tp);
-    }
-
     @Override
     public String toString() {
         return "PceNode type=" + this.nodeType + " ID=" + this.nodeId.getValue();
     }
-}
+}
\ No newline at end of file
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/SortPortsByName.java b/pce/src/main/java/org/opendaylight/transportpce/pce/SortPortsByName.java
new file mode 100644 (file)
index 0000000..51cc05a
--- /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.pce;
+
+import java.util.Comparator;
+
+/**
+ * Sort Ports by Name.
+ *
+ * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
+ *
+ */
+public class SortPortsByName implements Comparator<String> {
+
+    @Override
+    public int compare(String port1, String port2) {
+        int num = extractInt(port1) - extractInt(port2);
+        int letter = extractString(port1).compareToIgnoreCase(extractString(port2));
+        int diff = port1.length() - port2.length();
+        if ((diff == 0) || (Math.abs(diff) == 1)) {
+            return num;
+        } else {
+            return letter;
+        }
+    }
+
+    int extractInt(String name) {
+        String num = name.replaceAll("\\D", "");
+        // return 0 if no digits found
+        return num.isEmpty() ? 0 : Integer.parseInt(num);
+    }
+
+    String extractString(String name) {
+        String letter = name.replaceAll("\\d", "");
+        return (letter != null) ? letter : "";
+    }
+}
+