Пример #1
0
    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()
Пример #2
0
    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()