NodePath: Make path computation deterministic 09/25309/19
authorVratko Polak <vrpolak@cisco.com>
Wed, 11 Mar 2020 11:46:44 +0000 (12:46 +0100)
committerVratko Polak <vrpolak@cisco.com>
Tue, 17 Mar 2020 15:59:28 +0000 (15:59 +0000)
In Python3, set operations seem to result in indeterministic order.

+ Remove verbose logging from topology.py

Change-Id: I47cc90637a0b2969e1686b4216b7d8fe4fe2aaab
Signed-off-by: Vratko Polak <vrpolak@cisco.com>
resources/libraries/python/NodePath.py
resources/libraries/python/topology.py

index e97bde8..6f08be4 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2020 Cisco and/or its affiliates.
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
@@ -120,10 +120,11 @@ class NodePath:
                     f"No link between {node1[u'host']} and {node2[u'host']}"
                 )
 
+            # Not using set operations, as we need deterministic order.
             if always_same_link:
-                l_set = set(links).intersection(self._links)
+                l_set = [link for link in links if link in self._links]
             else:
-                l_set = set(links).difference(self._links)
+                l_set = [link for link in links if link not in self._links]
                 if not l_set:
                     raise RuntimeError(
                         f"No free link between {node1[u'host']} and "
@@ -131,9 +132,9 @@ class NodePath:
                     )
 
             if not l_set:
-                link = links.pop()
+                link = links[0]
             else:
-                link = l_set.pop()
+                link = l_set[0]
 
             self._links.append(link)
             interface1 = topo.get_interface_by_link_name(node1, link)
index 7dec516..338ccb6 100644 (file)
@@ -879,8 +879,6 @@ class Topology:
         :rtype: list
         """
 
-        logger.trace(f"node1: {str(node1)}")
-        logger.trace(f"node2: {str(node2)}")
         node1_links = self._get_node_active_link_names(
             node1, filter_list=filter_list_node1
         )
@@ -894,7 +892,10 @@ class Topology:
         elif node2_links is None:
             logger.error(u"Unable to find active links for node2")
         else:
-            connecting_links = list(set(node1_links).intersection(node2_links))
+            # Not using set operations, as we need deterministic order.
+            connecting_links = [
+                link for link in node1_links if link in node2_links
+            ]
 
         return connecting_links