aboutsummaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
authorPeter Mikus <pmikus@cisco.com>2022-05-05 13:08:10 +0200
committerPeter Mikus <pmikus@cisco.com>2022-05-24 08:25:08 +0000
commita201f3d3a5fdb9ccb86d57664cfd1de4bf484d36 (patch)
tree6233cbe5bf30a768505e8677f8b2143ad15e3752 /resources
parent93e808cb3e8b5270bec46e2a19d78736e08aa46c (diff)
fix(uti): Add TG type export
- This is actually bug not a feature. - AB to be added later - Tested on TREX and iPerf3 Signed-off-by: Peter Mikus <pmikus@cisco.com> Change-Id: Ib6f2d13e3b9401a9fb5759e42a8a310ee11b9d41
Diffstat (limited to 'resources')
-rw-r--r--resources/libraries/python/Constants.py2
-rw-r--r--resources/libraries/python/Iperf3.py27
-rw-r--r--resources/libraries/python/TrafficGenerator.py33
-rw-r--r--resources/libraries/python/model/ExportResult.py54
-rw-r--r--resources/libraries/python/model/export_json.py3
-rw-r--r--resources/libraries/robot/shared/default.robot10
-rw-r--r--resources/libraries/robot/shared/suite_setup.robot40
-rw-r--r--resources/tools/ab/ABTools.py27
8 files changed, 164 insertions, 32 deletions
diff --git a/resources/libraries/python/Constants.py b/resources/libraries/python/Constants.py
index 2ecf50b770..a7bda2124b 100644
--- a/resources/libraries/python/Constants.py
+++ b/resources/libraries/python/Constants.py
@@ -120,7 +120,7 @@ class Constants:
"""Constants used in CSIT."""
# Version for CSIT data model. See docs/model/.
- MODEL_VERSION = u"1.0.0"
+ MODEL_VERSION = u"1.0.1"
# Global off-switch in case JSON export is large or slow.
EXPORT_JSON = get_optimistic_bool_from_env(u"EXPORT_JSON")
diff --git a/resources/libraries/python/Iperf3.py b/resources/libraries/python/Iperf3.py
index ed186f0757..12d0633abc 100644
--- a/resources/libraries/python/Iperf3.py
+++ b/resources/libraries/python/Iperf3.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 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:
@@ -33,6 +33,31 @@ class Iperf3:
# Computed affinity for iPerf client.
self._c_affinity = None
+ @staticmethod
+ def get_iperf_type(node):
+ """Log and return the installed traffic generator type.
+
+ :param node: Node from topology file.
+ :type node: dict
+ :returns: Traffic generator type string.
+ :rtype: str
+ """
+ return "IPERF"
+
+ @staticmethod
+ def get_iperf_version(node):
+ """Log and return the installed traffic generator version.
+
+ :param node: Node from topology file.
+ :type node: dict
+ :returns: Traffic generator version string.
+ :rtype: str
+ """
+ command = f"iperf3 --version | head -1"
+ message = u"Get iPerf version failed!"
+ stdout, _ = exec_cmd_no_error(node, command, message=message)
+ return stdout.strip()
+
def initialize_iperf_server(
self, node, pf_key, interface, bind, bind_gw, bind_mask,
namespace=None, cpu_skip_cnt=0, cpu_cnt=1, instances=1):
diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py
index 03e3890959..5d9a0568f1 100644
--- a/resources/libraries/python/TrafficGenerator.py
+++ b/resources/libraries/python/TrafficGenerator.py
@@ -252,7 +252,38 @@ class TrafficGenerator(AbstractMeasurer):
f"{self._node[u'subtype']} not running in {expected_mode} mode!"
)
- # TODO: pylint says disable=too-many-locals.
+ @staticmethod
+ def get_tg_type(tg_node):
+ """Log and return the installed traffic generator type.
+
+ :param tg_node: Node from topology file.
+ :type tg_node: dict
+ :returns: Traffic generator type string.
+ :rtype: str
+ :raises RuntimeError: If command returns nonzero return code.
+ """
+ return str(check_subtype(tg_node))
+
+ @staticmethod
+ def get_tg_version(tg_node):
+ """Log and return the installed traffic generator version.
+
+ :param tg_node: Node from topology file.
+ :type tg_node: dict
+ :returns: Traffic generator version string.
+ :rtype: str
+ :raises RuntimeError: If command returns nonzero return code.
+ """
+ subtype = check_subtype(tg_node)
+ if subtype == NodeSubTypeTG.TREX:
+ command = f"cat {Constants.TREX_INSTALL_DIR}/VERSION"
+ message = u"Get T-Rex version failed!"
+ stdout, _ = exec_cmd_no_error(tg_node, command, message=message)
+ return stdout.strip()
+ else:
+ return "none"
+
+ # TODO: pylint disable=too-many-locals.
def initialize_traffic_generator(
self, tg_node, tg_if1, tg_if2, tg_if1_adj_node, tg_if1_adj_if,
tg_if2_adj_node, tg_if2_adj_if, osi_layer, tg_if1_dst_mac=None,
diff --git a/resources/libraries/python/model/ExportResult.py b/resources/libraries/python/model/ExportResult.py
index d74a6ab5df..16c6b89fb3 100644
--- a/resources/libraries/python/model/ExportResult.py
+++ b/resources/libraries/python/model/ExportResult.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 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:
@@ -39,18 +39,13 @@ def export_dut_type_and_version(dut_type=u"unknown", dut_version=u"unknown"):
else:
# We want to set a variable in higher level suite setup
# to be available to test setup several levels lower.
- # Documentation [0] looks like "children" is a keyword argument,
- # but code [1] lines 1458 and 1511-1512 show
- # it is just last stringy argument.
- # [0] http://robotframework.org/robotframework/
- # 3.1.2/libraries/BuiltIn.html#Set%20Suite%20Variable
- # [1] https://github.com/robotframework/robotframework/blob/
- # v3.1.2/src/robot/libraries/BuiltIn.py
BuiltIn().set_suite_variable(
u"\\${DUT_TYPE}", dut_type, u"children=True"
)
if dut_version == u"unknown":
- dut_version = BuiltIn().get_variable_value(u"\\${DUT_VERSION}", u"unknown")
+ dut_version = BuiltIn().get_variable_value(
+ u"\\${DUT_VERSION}", u"unknown"
+ )
if dut_type == u"unknown":
raise RuntimeError(u"Dut version not provided.")
else:
@@ -58,10 +53,49 @@ def export_dut_type_and_version(dut_type=u"unknown", dut_version=u"unknown"):
u"\\${DUT_VERSION}", dut_version, u"children=True"
)
data = get_export_data()
- data[u"dut_type"] = dut_type
+ data[u"dut_type"] = dut_type.lower()
data[u"dut_version"] = dut_version
+def export_tg_type_and_version(tg_type=u"unknown", tg_version=u"unknown"):
+ """Export the arguments as tg type and version.
+
+ Robot tends to convert "none" into None, hence the unusual default values.
+
+ If either argument is missing, the value from robot variable is used.
+ If argument is present, the value is also stored to robot suite variable.
+
+ :param tg_type: TG type, e.g. TREX.
+ :param tg_version: TG version as determined by the caller.
+ :type tg_type: Optional[str]
+ :type tg_version: Optiona[str]
+ :raises RuntimeError: If value is neither in argument not robot variable.
+ """
+ if tg_type == u"unknown":
+ tg_type = BuiltIn().get_variable_value(u"\\${TG_TYPE}", u"unknown")
+ if tg_type == u"unknown":
+ raise RuntimeError(u"TG type not provided.")
+ else:
+ # We want to set a variable in higher level suite setup
+ # to be available to test setup several levels lower.
+ BuiltIn().set_suite_variable(
+ u"\\${TG_TYPE}", tg_type, u"children=True"
+ )
+ if tg_version == u"unknown":
+ tg_version = BuiltIn().get_variable_value(
+ u"\\${TG_VERSION}", u"unknown"
+ )
+ if tg_type == u"unknown":
+ raise RuntimeError(u"TG version not provided.")
+ else:
+ BuiltIn().set_suite_variable(
+ u"\\${TG_VERSION}", tg_version, u"children=True"
+ )
+ data = get_export_data()
+ data[u"tg_type"] = tg_type.lower()
+ data[u"tg_version"] = tg_version
+
+
def append_mrr_value(mrr_value, unit):
"""Store mrr value to proper place so it is dumped into json.
diff --git a/resources/libraries/python/model/export_json.py b/resources/libraries/python/model/export_json.py
index b5d4328084..840c49fa70 100644
--- a/resources/libraries/python/model/export_json.py
+++ b/resources/libraries/python/model/export_json.py
@@ -34,7 +34,7 @@ from robot.libraries.BuiltIn import BuiltIn
from resources.libraries.python.Constants import Constants
from resources.libraries.python.model.ExportResult import (
- export_dut_type_and_version
+ export_dut_type_and_version, export_tg_type_and_version
)
from resources.libraries.python.model.mem2raw import write_raw_output
from resources.libraries.python.model.raw2info import convert_content_to_info
@@ -167,6 +167,7 @@ class export_json():
self.raw_data[u"hosts"] = set()
self.raw_data[u"log"] = list()
export_dut_type_and_version()
+ export_tg_type_and_version()
def start_suite_teardown_export(self):
"""Set new file path, initialize data for the suite teardown.
diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot
index 4f045dad50..b7eadbe2fa 100644
--- a/resources/libraries/robot/shared/default.robot
+++ b/resources/libraries/robot/shared/default.robot
@@ -336,16 +336,6 @@
| | Run Keyword If | ${with_trace} | VPP Enable Traces On Dut
| | ... | ${nodes['${dut}']}
-| Get And Export DPDK Version
-| | [Documentation] | Add version to test export as detected on DUT1.
-| |
-| | ... | *Example:*
-| |
-| | ... | \| Get And Export DPDK Version \|
-| |
-| | ${version} = | Get Dpdk Version | ${nodes}[DUT1]
-| | Export Dut Type And Version | DPDK | ${version}
-
| Save VPP PIDs
| | [Documentation] | Get PIDs of VPP processes from all DUTs in topology and\
| | ... | set it as a test variable. The PIDs are stored as dictionary items\
diff --git a/resources/libraries/robot/shared/suite_setup.robot b/resources/libraries/robot/shared/suite_setup.robot
index 232158a6e0..e2272242c6 100644
--- a/resources/libraries/robot/shared/suite_setup.robot
+++ b/resources/libraries/robot/shared/suite_setup.robot
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 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:
@@ -18,6 +18,7 @@
| Library | resources.libraries.python.InterfaceUtil
| Library | resources.libraries.python.NGINX.NGINXTools
| Library | resources.tools.ab.ABTools
+| Library | resources.libraries.python.Iperf3
| Library | resources.libraries.python.NodePath
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.TrafficGenerator
@@ -143,6 +144,7 @@
| | [Documentation]
| | ... | Additional Setup for suites which uses scapy as Traffic generator.
| |
+| | Export TG Type And Version | scapy | 2.4.3
| | FOR | ${dut} | IN | @{duts}
| | | Set Suite Variable | ${${dut}_vf1} | ${${dut}_${int}1}
| | | Set Suite Variable | ${${dut}_vf2} | ${${dut}_${int}2}
@@ -154,11 +156,12 @@
| | [Documentation]
| | ... | Additional Setup for suites which uses dpdk.
| |
+| | ${version} = | Get Dpdk Version | ${nodes}[DUT1]
+| | Export Dut Type And Version | dpdk | ${version}
| | FOR | ${dut} | IN | @{duts}
| | | Initialize DPDK Framework | ${nodes['${dut}']}
| | | ... | ${${dut}_${int}1}[0] | ${${dut}_${int}2}[0] | ${nic_driver}
| | END
-| | Get And Export DPDK Version
| Additional Suite Setup Action For performance vf
| | [Documentation]
@@ -235,6 +238,9 @@
| | | ... | ELSE
| | | ... | Additional Suite Setup Action For performance pf | ${dut}
| | END
+| | ${type} = | Get TG Type | ${nodes}[TG]
+| | ${version} = | Get TG Version | ${nodes}[TG]
+| | Export TG Type And Version | ${type} | ${version}
| | Initialize traffic generator
| | ... | ${tg} | ${TG_pf1}[0] | ${TG_pf2}[0]
| | ... | ${dut1} | ${DUT1_${int}1}[0]
@@ -246,14 +252,25 @@
| | ... | Additional Setup for suites which uses performance measurement
| | ... | for L1 cross connect tests
| |
-| | # TRex suites have only TG (and a loopback cable), no SUT nor DUT.
-| | Export Dut Type And Version | none | ${EMPTY}
+| | ${type} = | Get TG Type | ${nodes}[TG]
+| | ${version} = | Get TG Version | ${nodes}[TG]
+| | Export Dut Type And Version | ${type} | ${version}
+| | Export TG Type And Version | ${type} | ${version}
| | Initialize traffic generator
| | ... | ${tg} | ${TG_pf1}[0] | ${TG_pf2}[0]
| | ... | ${tg} | ${TG_pf2}[0]
| | ... | ${tg} | ${TG_pf1}[0]
| | ... | ${osi_layer}
+| Additional Suite Setup Action For iPerf3
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement over
+| | ... | iPerf3.
+| |
+| | ${type} = | Get iPerf Type | ${nodes}[TG]
+| | ${version} = | Get iPerf Version | ${nodes}[TG]
+| | Export DUT Type And Version | ${type} | ${version}
+
| Additional Suite Setup Action For ipsechw
| | [Documentation]
| | ... | Additional Setup for suites which uses QAT HW.
@@ -272,11 +289,17 @@
| | Install NGINX framework on all DUTs | ${nodes} | ${packages_dir}
| | ... | ${nginx_version}
+| Additional Suite Setup Action For vppecho
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement over
+| | ... | VPP Echo.
+| |
+| | Export DUT Type And Version | ${DUT_TYPE} | ${DUT_VERSION}
+
| Additional Suite Setup Action For ab
| | [Documentation]
| | ... | Additional Setup for suites which uses ab TG.
| |
-| | Verify Program Installed | ${tg} | ab
| | Iface update numa node | ${tg}
| | ${running}= | Is TRex running | ${tg}
| | Run keyword if | ${running}==${True} | Teardown traffic generator | ${tg}
@@ -296,5 +319,8 @@
| | | Run Keyword If | ${ip_addr_on_intf}==${False} | Set Linux interface IP
| | | ... | ${tg} | ${intf_name} | ${ip_addr} | ${ab_ip_prefix}
| | END
-| | Set Linux interface up | ${tg} | ${intf_name}
-| | Check ab | ${tg}
+| | Set Linux interface up | ${nodes}[TG] | ${intf_name}
+| | Check AB | ${tg}
+| | ${type} = | Get AB Type | ${nodes}[TG]
+| | ${version} = | Get AB Version | ${nodes}[TG]
+| | Export TG Type And Version | ${type} | ${version}
diff --git a/resources/tools/ab/ABTools.py b/resources/tools/ab/ABTools.py
index cbd1adf21f..54aff19e92 100644
--- a/resources/tools/ab/ABTools.py
+++ b/resources/tools/ab/ABTools.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 Intel and/or its affiliates.
+# Copyright (c) 2022 Intel 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:
@@ -79,6 +79,31 @@ class ABTools:
exec_cmd_no_error(tg_node, cmd, message=message)
@staticmethod
+ def get_ab_type(node):
+ """Log and return the installed traffic generator type.
+
+ :param node: Node from topology file.
+ :type node: dict
+ :returns: Traffic generator type string.
+ :rtype: str
+ """
+ return "AB"
+
+ @staticmethod
+ def get_ab_version(node):
+ """Log and return the installed traffic generator version.
+
+ :param node: Node from topology file.
+ :type node: dict
+ :returns: Traffic generator version string.
+ :rtype: str
+ """
+ command = f"ab -V | head -1 | cut -d',' -f2"
+ message = u"Get AB version failed!"
+ stdout, _ = exec_cmd_no_error(node, command, message=message)
+ return stdout.strip()
+
+ @staticmethod
def run_ab(tg_node, ip_addr, tg_addr, tls_tcp, cipher, files_num, rps_cps,
r_total, c_total, port, protocol=u"TLS1.3"):
""" Run ab test.