X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FNodePath.py;h=f41103046f3c04153b14d7800fff46fc365baa8f;hp=6700ddfe2a56aec5fc0e5b9bf2ee4416e2e538fd;hb=4c6fe5602edcbd9857a846e5b13a21d5c671a2c8;hpb=3936756adb84508ef7ada2cc9016eb449fba2024 diff --git a/resources/libraries/python/NodePath.py b/resources/libraries/python/NodePath.py index 6700ddfe2a..f41103046f 100644 --- a/resources/libraries/python/NodePath.py +++ b/resources/libraries/python/NodePath.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -13,7 +13,7 @@ """Path utilities library for nodes in the topology.""" -from topology import Topology +from resources.libraries.python.topology import Topology class NodePath(object): @@ -55,16 +55,20 @@ class NodePath(object): def __init__(self): self._nodes = [] + self._nodes_filter = [] self._links = [] self._path = [] self._path_iter = [] - def append_node(self, node): + def append_node(self, node, filter_list=None): """Append node to the path. :param node: Node to append to the path. + :param filter_list: Filter criteria list. :type node: dict + :type filter_list: list of strings """ + self._nodes_filter.append(filter_list) self._nodes.append(node) def append_nodes(self, *nodes): @@ -81,6 +85,7 @@ class NodePath(object): def clear_path(self): """Clear path.""" self._nodes = [] + self._nodes_filter = [] self._links = [] self._path = [] self._path_iter = [] @@ -88,12 +93,13 @@ class NodePath(object): 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. + in path. If False use different link (if available) + between two nodes if one link was used before. :type always_same_link: bool - - .. note:: First add at least two nodes to the topology. + :raises RuntimeError: If not enough nodes for path. """ nodes = self._nodes if len(nodes) < 2: @@ -103,21 +109,22 @@ class NodePath(object): topo = Topology() node1 = nodes[idx] node2 = nodes[idx + 1] - links = topo.get_active_connecting_links(node1, node2) + 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'])) - link = None - l_set = set() - 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 ' + + 'No free link between {0} and {1}, all links already ' 'used'.format(node1['host'], node2['host'])) if not l_set: @@ -137,20 +144,20 @@ class NodePath(object): def next_interface(self): """Path interface iterator. - :return: Interface and node or None if not next interface. + :returns: Interface and node or None if not next interface. :rtype: tuple (str, dict) .. note:: Call compute_path before. """ if not self._path_iter: - return (None, None) + return None, None else: return self._path_iter.pop() def first_interface(self): """Return first interface on the path. - :return: Interface and node. + :returns: Interface and node. :rtype: tuple (str, dict) .. note:: Call compute_path before. @@ -162,7 +169,7 @@ class NodePath(object): def last_interface(self): """Return last interface on the path. - :return: Interface and node. + :returns: Interface and node. :rtype: tuple (str, dict) .. note:: Call compute_path before. @@ -174,7 +181,7 @@ class NodePath(object): def first_ingress_interface(self): """Return first ingress interface on the path. - :return: Interface and node. + :returns: Interface and node. :rtype: tuple (str, dict) .. note:: Call compute_path before. @@ -186,7 +193,7 @@ class NodePath(object): def last_egress_interface(self): """Return last egress interface on the path. - :return: Interface and node. + :returns: Interface and node. :rtype: tuple (str, dict) .. note:: Call compute_path before.