Make the PCE more deterministic 41/85641/5
authorGilles Thouenon <gilles.thouenon@orange.com>
Wed, 6 Nov 2019 16:39:30 +0000 (17:39 +0100)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Tue, 19 Nov 2019 08:45:08 +0000 (08:45 +0000)
in the choice of SRG node in a RDM, or the choice of the PP port on a
SRG, or the choice of the NETWORK TP on a XPDR.

JIRA: TRNSPRTPCE-169
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Change-Id: I7aa2088282aea2a0bcfb6301c09b4aab1c9cb3c6

pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
tests/transportpce_tests/1.2.1/test_end2end.py
tests/transportpce_tests/2.2.1/test_end2end.py

index b0fe7c08ab9761240cedd5f63b759d949ee469c2..21e68ee7217ab28f19d95ce82009b2e69248463d 100644 (file)
@@ -17,6 +17,8 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.ResponseCodes;
@@ -99,7 +101,6 @@ public class PceCalculation {
             returnStructure.setRC(ResponseCodes.RESPONSE_FAILED);
             return;
         }
-
         printNodesInfo(allPceNodes);
 
         returnStructure.setRC(ResponseCodes.RESPONSE_OK);
@@ -139,10 +140,12 @@ public class PceCalculation {
             LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier);
             return false;
         }
-        allNodes = nw.getNode();
+        allNodes = nw.getNode().stream().sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId()
+            .getValue())).collect(Collectors.toList());
         Network1 nw1 = nw.augmentation(Network1.class);
 
-        allLinks = nw1.getLink();
+        allLinks = nw1.getLink().stream().sorted((l1, l2) -> l1.getSource().getSourceTp().toString().compareTo(l2
+            .getSource().getSourceTp().toString())).collect(Collectors.toList());
         if (allNodes == null || allNodes.isEmpty()) {
             LOG.error("readMdSal: no nodes ");
             return false;
@@ -368,11 +371,21 @@ public class PceCalculation {
                 break;
         }
 
-        if ((pceNode.getSupNodeIdPceNode().equals(anodeId)) && (endPceNode(nodeType,pceNode.getNodeId(), pceNode))) {
-            this.aendPceNode = pceNode;
+        if (pceNode.getSupNodeIdPceNode().equals(this.anodeId)) {
+            if (this.aendPceNode != null) {
+                LOG.debug("aendPceNode already gets: {}", this.aendPceNode);
+            } else if (endPceNode(nodeType,pceNode.getNodeId(), pceNode)) {
+                this.aendPceNode = pceNode;
+            }
+            // returning false otherwise would break E2E test
         }
-        if ((pceNode.getSupNodeIdPceNode().equals(znodeId)) && (endPceNode(nodeType,pceNode.getNodeId(), pceNode))) {
-            this.zendPceNode = pceNode;
+        if (pceNode.getSupNodeIdPceNode().equals(this.znodeId)) {
+            if (this.zendPceNode != null) {
+                LOG.debug("zendPceNode already gets: {}", this.zendPceNode);
+            } else if (endPceNode(nodeType,pceNode.getNodeId(), pceNode)) {
+                this.zendPceNode = pceNode;
+            }
+            // returning false otherwise would break E2E test
         }
 
         allPceNodes.put(pceNode.getNodeId(), pceNode);
@@ -430,7 +443,6 @@ public class PceCalculation {
     }
 
     private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceNode pceNode) {
-        Boolean add = true;
         switch (openroadmNodeType) {
             case SRG :
                 pceNode.initSrgTps();
@@ -440,11 +452,15 @@ public class PceCalculation {
                 pceNode.initXndrTps();
                 break;
             default:
-                add = false;
                 LOG.warn("endPceNode: Node {} is not SRG or XPONDER !", nodeId);
-                break;
+                return false;
         }
-        return add;
+
+        if (!pceNode.isValid()) {
+            LOG.error("validateNode : there are no availaible wavelengths in node {}", pceNode.getNodeId().getValue());
+            return false;
+        }
+        return true;
     }
 
     public PceNode getaendPceNode() {
index 759712ae7c583b29ae631741f34fe45cbd87a675..ad9580bea30381b4f9da288ea428e56199151afa 100644 (file)
@@ -555,7 +555,6 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
         time.sleep(2)
 
-
     def test_19_connect_roadmA_PP2_to_xpdrA_N2(self):
         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
         data = {
@@ -579,7 +578,6 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
         time.sleep(2)
 
-
     def test_20_connect_xprdC_N2_to_roadmC_PP2(self):
         url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links".format(self.restconf_baseurl)
         data = {
@@ -603,7 +601,6 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
         time.sleep(2)
 
-
     def test_21_connect_roadmC_PP2_to_xpdrC_N2(self):
         url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links".format(self.restconf_baseurl)
         data = {
@@ -815,7 +812,6 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
         time.sleep(10)
 
-
     def test_27_check_topo_ROADMA_DEG1(self):
         url1 = ("{}/config/ietf-network:networks/network/openroadm-topology/node/ROADMA01-DEG1"
                .format(self.restconf_baseurl))
@@ -1409,7 +1405,6 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_27_check_topo_ROADMA_DEG1()
         time.sleep(3)
 
-
     def test_44_delete_oc_service1(self):
         url = ("{}/operations/org-openroadm-service:service-delete"
               .format(self.restconf_baseurl))
@@ -1542,7 +1537,6 @@ class TransportPCEFulltesting(unittest.TestCase):
             print ("oc service deletion\n")
             self.test_44_delete_oc_service1()
 
-
     def test_51_disconnect_XPDRA(self):
         url = ("{}/config/network-topology:"
                 "network-topology/topology/topology-netconf/node/XPDRA01"
index 2bf5763f00623e727aecc664f3d8313d2ffad06b..5939a3257d65147fa700235bff694d56f90b68a3 100644 (file)
@@ -1497,7 +1497,7 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_34_check_topo_ROADMA_SRG1()
         self.test_35_check_topo_ROADMA_DEG2()
 
-    @unittest.expectedFailure
+#    @unittest.expectedFailure
     def test_49_loop_create_eth_service(self):
         for i in range(1,6):
             print ("trial number {}".format(i))
@@ -1510,7 +1510,7 @@ class TransportPCEFulltesting(unittest.TestCase):
             print ("eth service deletion\n")
             self.test_30_delete_eth_service1()
 
-    @unittest.expectedFailure
+#    @unittest.expectedFailure
     def test_50_loop_create_oc_service(self):
         url = ("{}/operational/org-openroadm-service:service-list/services/service1"
                .format(self.restconf_baseurl))