From a201f3d3a5fdb9ccb86d57664cfd1de4bf484d36 Mon Sep 17 00:00:00 2001 From: Peter Mikus Date: Thu, 5 May 2022 13:08:10 +0200 Subject: 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 Change-Id: Ib6f2d13e3b9401a9fb5759e42a8a310ee11b9d41 --- resources/libraries/python/Constants.py | 2 +- resources/libraries/python/Iperf3.py | 27 ++++++++++- resources/libraries/python/TrafficGenerator.py | 33 ++++++++++++- resources/libraries/python/model/ExportResult.py | 54 ++++++++++++++++++---- resources/libraries/python/model/export_json.py | 3 +- resources/libraries/robot/shared/default.robot | 10 ---- resources/libraries/robot/shared/suite_setup.robot | 40 +++++++++++++--- 7 files changed, 138 insertions(+), 31 deletions(-) (limited to 'resources/libraries') 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} -- cgit 1.2.3-korg