aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/NodePath.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/NodePath.py')
-rw-r--r--resources/libraries/python/NodePath.py62
1 files changed, 44 insertions, 18 deletions
diff --git a/resources/libraries/python/NodePath.py b/resources/libraries/python/NodePath.py
index 7f24b0e4fc..5b445bc593 100644
--- a/resources/libraries/python/NodePath.py
+++ b/resources/libraries/python/NodePath.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2022 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:
@@ -92,7 +92,7 @@ class NodePath:
self._path = []
self._path_iter = []
- def compute_path(self, always_same_link=True):
+ def compute_path(self, always_same_link=True, topo_has_dut=True):
"""Compute path for added nodes.
.. note:: First add at least two nodes to the topology.
@@ -100,19 +100,26 @@ class NodePath:
: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.
+ :param topo_has_dut: If False we want to test back to back test on TG.
:type always_same_link: bool
+ :type topo_has_dut: bool
:raises RuntimeError: If not enough nodes for path.
"""
nodes = self._nodes
- if len(nodes) < 2:
+ if len(nodes) < 2 and topo_has_dut:
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]
+ if topo_has_dut:
+ node2 = nodes[idx + 1]
+ n2_list = self._nodes_filter[idx + 1]
+ else:
+ node2 = node1
+ n2_list = n1_list
+
links = topo.get_active_connecting_links(
node1, node2, filter_list_node1=n1_list,
filter_list_node2=n2_list
@@ -139,8 +146,11 @@ class NodePath:
link = l_set[0]
self._links.append(link)
+
+ use_subsequent = not topo_has_dut
interface1 = topo.get_interface_by_link_name(node1, link)
- interface2 = topo.get_interface_by_link_name(node2, link)
+ interface2 = topo.get_interface_by_link_name(node2, link,
+ use_subsequent)
self._path.append((interface1, node1))
self._path.append((interface2, node2))
@@ -207,8 +217,9 @@ class NodePath:
raise RuntimeError(u"No path for topology")
return self._path[-2]
- def compute_circular_topology(self, nodes, filter_list=None, nic_pfs=1,
- always_same_link=False, topo_has_tg=True):
+ def compute_circular_topology(
+ self, nodes, filter_list=None, nic_pfs=1,
+ always_same_link=False, topo_has_tg=True, topo_has_dut=True):
"""Return computed circular path.
:param nodes: Nodes to append to the path.
@@ -219,29 +230,44 @@ class NodePath:
between two nodes if one link was used before.
:param topo_has_tg: If True, the topology has a TG node. If False,
the topology consists entirely of DUT nodes.
+ :param topo_has_dut: If True, the topology has a DUT node(s). If False,
+ the topology consists entirely of TG nodes.
:type nodes: dict
:type filter_list: list of strings
:type nic_pfs: int
:type always_same_link: bool
:type topo_has_tg: bool
+ :type topo_has_dut: bool
:returns: Topology information dictionary.
:rtype: dict
:raises RuntimeError: If unsupported combination of parameters.
"""
t_dict = dict()
- duts = [key for key in nodes if u"DUT" in key]
- t_dict[u"duts"] = duts
- t_dict[u"duts_count"] = len(duts)
- t_dict[u"int"] = u"pf"
+ t_dict[u"hosts"] = set()
+ if topo_has_dut:
+ duts = [key for key in nodes if u"DUT" in key]
+ for host in [nodes[dut][u"host"] for dut in duts]:
+ t_dict[u"hosts"].add(host)
+ t_dict[u"duts"] = duts
+ t_dict[u"duts_count"] = len(duts)
+ t_dict[u"int"] = u"pf"
for _ in range(0, nic_pfs // 2):
if topo_has_tg:
- self.append_node(nodes[u"TG"])
- for dut in duts:
- self.append_node(nodes[dut], filter_list=filter_list)
+ if topo_has_dut:
+ self.append_node(nodes[u"TG"])
+ else:
+ self.append_node(nodes[u"TG"], filter_list=filter_list)
+ if topo_has_dut:
+ for dut in duts:
+ self.append_node(nodes[dut], filter_list=filter_list)
if topo_has_tg:
- self.append_node(nodes[u"TG"])
- self.compute_path(always_same_link)
+ t_dict[u"hosts"].add(nodes[u"TG"][u"host"])
+ if topo_has_dut:
+ self.append_node(nodes[u"TG"])
+ else:
+ self.append_node(nodes[u"TG"], filter_list=filter_list)
+ self.compute_path(always_same_link, topo_has_dut)
n_idx = 0 # node index
t_idx = 1 # TG interface index
@@ -257,7 +283,7 @@ class NodePath:
i_pfx = f"if{t_idx}" # [backwards compatible] interface prefix
n_idx = 0
t_idx = t_idx + 1
- elif topo_has_tg:
+ elif topo_has_tg and topo_has_dut:
# Each node has 2 interfaces, starting with 1
# Calculate prefixes appropriately for current
# path topology nomenclature: