def compute_path(self, always_same_link=True): """Compute path for added nodes. .. note:: First add at least two nodes to the topology. :param always_same_link: If True use always same link between two nodes in path. If False use different link (if available) between two nodes if one link was used before. :type always_same_link: bool :raises RuntimeError: If not enough nodes for path. """ nodes = self._nodes if len(nodes) < 2: raise RuntimeError(u"Not enough nodes to compute path") for idx in range(0, len(nodes) - 1): topo = Topology() node1 = nodes[idx] node2 = nodes[idx + 1] n1_list = self._nodes_filter[idx] n2_list = self._nodes_filter[idx + 1] links = topo.get_active_connecting_links(node1, node2, filter_list_node1=n1_list, filter_list_node2=n2_list) if not links: raise RuntimeError( 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 = [link for link in links if link in self._links] else: 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 " f"{node2[u'host']}, all links already used") if not l_set: link = links[0] else: link = l_set[0] self._links.append(link) interface1 = topo.get_interface_by_link_name(node1, link) interface2 = topo.get_interface_by_link_name(node2, link) self._path.append((interface1, node1)) self._path.append((interface2, node2)) self._path_iter.extend(self._path) self._path_iter.reverse()
def compute_path(self, always_same_link=True): """Compute path for added nodes. .. note:: First add at least two nodes to the topology. :param always_same_link: If True use always same link between two nodes in path. If False use different link (if available) between two nodes if one link was used before. :type always_same_link: bool :raises RuntimeError: If not enough nodes for path. """ nodes = self._nodes if len(nodes) < 2: raise RuntimeError('Not enough nodes to compute path') for idx in range(0, len(nodes) - 1): topo = Topology() node1 = nodes[idx] node2 = nodes[idx + 1] n1_list = self._nodes_filter[idx] n2_list = self._nodes_filter[idx + 1] links = topo.get_active_connecting_links(node1, node2, filter_list_node1=n1_list, filter_list_node2=n2_list) if not links: raise RuntimeError('No link between {0} and {1}'.format( node1['host'], node2['host'])) if always_same_link: l_set = set(links).intersection(self._links) else: l_set = set(links).difference(self._links) if not l_set: raise RuntimeError( 'No free link between {0} and {1}, all links already ' 'used'.format(node1['host'], node2['host'])) if not l_set: link = links.pop() else: link = l_set.pop() self._links.append(link) interface1 = topo.get_interface_by_link_name(node1, link) interface2 = topo.get_interface_by_link_name(node2, link) self._path.append((interface1, node1)) self._path.append((interface2, node2)) self._path_iter.extend(self._path) self._path_iter.reverse()