From b058ec7eeb7dfba57482cd01c0d53104d768052c Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 13 Aug 2020 18:26:22 +0800 Subject: [PATCH 1/4] [Mellanox] Add an option power_off_delay for reboot test --- tests/platform_tests/args/normal_reboot_args.py | 14 ++++++++++++++ tests/platform_tests/conftest.py | 16 +++++++++++++--- tests/platform_tests/test_reboot.py | 12 +----------- 3 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 tests/platform_tests/args/normal_reboot_args.py diff --git a/tests/platform_tests/args/normal_reboot_args.py b/tests/platform_tests/args/normal_reboot_args.py new file mode 100644 index 00000000000..64fc800da9f --- /dev/null +++ b/tests/platform_tests/args/normal_reboot_args.py @@ -0,0 +1,14 @@ +import pytest + + +def add_normal_reboot_args(parser): + """ + Adding arguments required for normal reboot test cases + """ + parser.addoption( + "--power_off_delay", + action="append", + type=int, + default=[], + help="Power off delay seconds for test_power_off_reboot", + ) \ No newline at end of file diff --git a/tests/platform_tests/conftest.py b/tests/platform_tests/conftest.py index c8911f38bbb..b81f84ab210 100644 --- a/tests/platform_tests/conftest.py +++ b/tests/platform_tests/conftest.py @@ -1,6 +1,6 @@ import pytest -from tests.common.fixtures.advanced_reboot import get_advanced_reboot +from .args.normal_reboot_args import add_normal_reboot_args from .args.advanced_reboot_args import add_advanced_reboot_args from .args.cont_warm_reboot_args import add_cont_warm_reboot_args @@ -11,8 +11,18 @@ def skip_on_simx(duthost): if "simx" in platform: pytest.skip('skipped on this platform: {}'.format(platform)) + # Platform pytest arguments def pytest_addoption(parser): - + add_normal_reboot_args(parser) add_advanced_reboot_args(parser) - add_cont_warm_reboot_args(parser) \ No newline at end of file + add_cont_warm_reboot_args(parser) + + +def pytest_generate_tests(metafunc): + if 'power_off_delay' in metafunc.fixturenames: + delays = metafunc.config.getoption('power_off_delay') + if not delays: + metafunc.parametrize('power_off_delay', [5, 15]) + else: + metafunc.parametrize('power_off_delay', delays) diff --git a/tests/platform_tests/test_reboot.py b/tests/platform_tests/test_reboot.py index f4be3fce930..138e23e072e 100644 --- a/tests/platform_tests/test_reboot.py +++ b/tests/platform_tests/test_reboot.py @@ -129,16 +129,6 @@ def test_warm_reboot(duthost, localhost, conn_graph_facts): reboot_and_check(localhost, duthost, conn_graph_facts["device_conn"], reboot_type=REBOOT_TYPE_WARM) -@pytest.fixture(params=[15, 5]) -def power_off_delay(request): - """ - @summary: used to parametrized test cases on power_off_delay - @param request: pytest request object - @return: power_off_delay - """ - return request.param - - def _power_off_reboot_helper(kwargs): """ @summary: used to parametrized test cases on power_off_delay @@ -166,7 +156,7 @@ def test_power_off_reboot(duthost, localhost, conn_graph_facts, psu_controller, @param localhost: Fixture for interacting with localhost through ansible @param conn_graph_facts: Fixture parse and return lab connection graph @param psu_controller: The python object of psu controller - @param power_off_delay: Pytest fixture. The delay between turning off and on the PSU + @param power_off_delay: Pytest parameter. The delay between turning off and on the PSU """ psu_ctrl = psu_controller if psu_ctrl is None: From 143eb4d8a12a4d4c6ea37abbc5a68fe738c51fb5 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 14 Sep 2020 17:22:45 +0800 Subject: [PATCH 2/4] 1. Add dynamic minimum data for 4700, 3420, 4600C; 2. change SWITCH_MODELS and MINIMUM_TABLE from sku based to platform based --- tests/common/mellanox_data.py | 185 ++---------------- tests/platform_tests/mellanox/check_sysfs.py | 56 +++--- .../mellanox_thermal_control_test_helper.py | 26 ++- .../platform_tests/mellanox/minimum_table.py | 88 +++------ .../mellanox/test_thermal_control.py | 10 +- .../mellanox/mellanox_device_mocker.py | 6 +- 6 files changed, 86 insertions(+), 285 deletions(-) diff --git a/tests/common/mellanox_data.py b/tests/common/mellanox_data.py index be66cedaaf2..7bf84730997 100644 --- a/tests/common/mellanox_data.py +++ b/tests/common/mellanox_data.py @@ -5,7 +5,7 @@ SWITCH_HWSKUS = SPC1_HWSKUS + SPC2_HWSKUS + SPC3_HWSKUS SWITCH_MODELS = { - "ACS-MSN2700": { + "x86_64-mlnx_msn2700-r0": { "reboot": { "cold_reboot": True, "fast_reboot": True, @@ -55,107 +55,7 @@ } } }, - "Mellanox-SN2700": { - "reboot": { - "cold_reboot": True, - "fast_reboot": True, - "warm_reboot": True - }, - "fans": { - "number": 4, - "hot_swappable": True - }, - "psus": { - "number": 2, - "hot_swappable": True - }, - "cpu_pack": { - "number": 1 - }, - "cpu_cores": { - "number": 2 - }, - "ports": { - "number": 32 - }, - "thermals": { - "cpu_core": { - "start": 0, - "number": 2 - }, - "module": { - "start": 1, - "number": 32 - }, - "psu": { - "start": 1, - "number": 2 - }, - "cpu_pack": { - "number": 1 - }, - "asic_ambient": { - "number": 1 - }, - "port_ambient": { - "number": 1 - }, - "fan_ambient": { - "number": 1 - } - } - }, - "Mellanox-SN2700-D48C8": { - "reboot": { - "cold_reboot": True, - "fast_reboot": True, - "warm_reboot": True - }, - "fans": { - "number": 4, - "hot_swappable": True - }, - "psus": { - "number": 2, - "hot_swappable": True - }, - "cpu_pack": { - "number": 1 - }, - "cpu_cores": { - "number": 2 - }, - "ports": { - "number": 32 - }, - "thermals": { - "cpu_core": { - "start": 0, - "number": 2 - }, - "module": { - "start": 1, - "number": 32 - }, - "psu": { - "start": 1, - "number": 2 - }, - "cpu_pack": { - "number": 1 - }, - "asic_ambient": { - "number": 1 - }, - "port_ambient": { - "number": 1 - }, - "fan_ambient": { - "number": 1 - } - } - }, - "ACS-MSN2740": { + "x86_64-mlnx_msn2740-r0": { "reboot": { "cold_reboot": True, "fast_reboot": True, @@ -202,7 +102,7 @@ } } }, - "ACS-MSN2410": { + "x86_64-mlnx_msn2410-r0": { "reboot": { "cold_reboot": True, "fast_reboot": True, @@ -252,7 +152,7 @@ } } }, - "ACS-MSN2010": { + "x86_64-mlnx_msn2010-r0": { "reboot": { "cold_reboot": True, "fast_reboot": True, @@ -295,7 +195,7 @@ } } }, - "ACS-MSN2100": { + "x86_64-mlnx_msn2100-r0": { "reboot": { "cold_reboot": True, "fast_reboot": True, @@ -338,64 +238,7 @@ } } }, - "ACS-MSN3800": { - "reboot": { - "cold_reboot": True, - "fast_reboot": False, - "warm_reboot": True - }, - "fans": { - "number": 3, - "hot_swappable": True - }, - "psus": { - "number": 2, - "hot_swappable": True - }, - "cpu_pack": { - "number": 1 - }, - "cpu_cores": { - "number": 4 - }, - "ports": { - "number": 64 - }, - "thermals": { - "cpu_core": { - "start": 0, - "number": 4 - }, - "module": { - "start": 1, - "number": 64 - }, - "psu": { - "start": 1, - "number": 2 - }, - "cpu_pack": { - "number": 1 - }, - "gearbox": { - "start": 1, - "number": 32 - }, - "asic_ambient": { - "number": 1 - }, - "port_ambient": { - "number": 1 - }, - "fan_ambient": { - "number": 1 - }, - "comex_ambient": { - "number": 1 - } - } - }, - "Mellanox-SN3800-D112C8": { + "x86_64-mlnx_msn3800-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -452,7 +295,7 @@ } } }, - "ACS-MSN3700": { + "x86_64-mlnx_msn3700-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -505,7 +348,7 @@ } } }, - "ACS-MSN3700C": { + "x86_64-mlnx_msn3700c-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -558,7 +401,7 @@ } } }, - "ACS-MSN4700": { + "x86_64-mlnx_msn4700-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -611,7 +454,7 @@ } } }, - "ACS-MSN4600C": { + "x86_64-mlnx_msn4600c-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -664,7 +507,7 @@ } } }, - "ACS-MSN3420": { + "x86_64-mlnx_msn3420-r0": { "reboot": { "cold_reboot": True, "fast_reboot": False, @@ -719,5 +562,11 @@ } } + def is_mellanox_device(dut): return dut.facts["asic_type"] == "mellanox" + + +def get_platform_data(dut): + dut_platform = dut.facts["platform"] + return SWITCH_MODELS[dut_platform] diff --git a/tests/platform_tests/mellanox/check_sysfs.py b/tests/platform_tests/mellanox/check_sysfs.py index 3794bc712d9..e1427e8bac7 100644 --- a/tests/platform_tests/mellanox/check_sysfs.py +++ b/tests/platform_tests/mellanox/check_sysfs.py @@ -4,6 +4,7 @@ This script contains re-usable functions for checking status of hw-management related sysfs. """ import logging +from tests.common.mellanox_data import get_platform_data from tests.common.utilities import wait_until @@ -11,10 +12,8 @@ def check_sysfs(dut): """ @summary: Check various hw-management related sysfs under /var/run/hw-management """ - dut_hwsku = dut.facts["hwsku"] - from tests.common.mellanox_data import SWITCH_MODELS - sku_info = SWITCH_MODELS[dut_hwsku] - sysfs_config = generate_sysfs_config(sku_info) + platform_data = get_platform_data(dut) + sysfs_config = generate_sysfs_config(platform_data) logging.info("Collect mellanox sysfs facts") sysfs_facts = dut.sysfs_facts(config=sysfs_config)['ansible_facts'] @@ -32,20 +31,20 @@ def check_sysfs(dut): logging.info("Check fan related sysfs") for fan_id, fan_info in sysfs_facts['fan_info'].items(): - if SWITCH_MODELS[dut_hwsku]["fans"]["hot_swappable"]: + if platform_data["fans"]["hot_swappable"]: assert fan_info['status'] == '1', "Fan {} status {} is not 1".format(fan_id, fan_info['status']) assert fan_info['fault'] == '0', "Fan {} fault status {} is not 1".format(fan_id, fan_info['fault']) if not _is_fan_speed_in_range(sysfs_facts): - sysfs_fan_config = [generate_sysfs_fan_config(sku_info)] + sysfs_fan_config = [generate_sysfs_fan_config(platform_data)] assert wait_until(30, 5, _check_fan_speed_in_range, dut, sysfs_fan_config), "Fan speed not in range" logging.info("Check CPU related sysfs") cpu_temp_high_counter = 0 cpu_temp_list = [] cpu_crit_temp_list = [] - cpu_pack_count = sku_info["cpu_pack"]["number"] + cpu_pack_count = platform_data["cpu_pack"]["number"] if cpu_pack_count > 0: cpu_pack_temp = float(sysfs_facts['cpu_pack_info']['temp']) / 1000 cpu_pack_max_temp = float(sysfs_facts['cpu_pack_info']['max_temp']) / 1000 @@ -74,7 +73,7 @@ def check_sysfs(dut): assert False, "At least {} of the CPU cores or pack is overheated".format(cpu_temp_high_counter) logging.info("Check PSU related sysfs") - if SWITCH_MODELS[dut_hwsku]["psus"]["hot_swappable"]: + if platform_data["psus"]["hot_swappable"]: for psu_id, psu_info in sysfs_facts['psu_info'].items(): psu_status = int(psu_info["status"]) if not psu_status: @@ -122,9 +121,8 @@ def check_psu_sysfs(dut, psu_id, psu_state): assert psu_exist_content["stdout"] == "0", "CLI returns NOT PRESENT while %s contains %s" % \ (psu_exist, psu_exist_content["stdout"]) else: - from tests.common.mellanox_data import SWITCH_MODELS - dut_hwsku = dut.facts["hwsku"] - hot_swappabe = SWITCH_MODELS[dut_hwsku]["psus"]["hot_swappable"] + platform_data = get_platform_data(dut) + hot_swappabe = platform_data["psus"]["hot_swappable"] if hot_swappabe: psu_exist_content = dut.command("cat %s" % psu_exist) logging.info("PSU state %s file %s read %s" % (psu_state, psu_exist, psu_exist_content["stdout"])) @@ -165,24 +163,24 @@ def _is_fan_speed_in_range(sysfs_facts): return low_threshold < fan_speed_get < high_threshold except Exception as e: assert False, 'Invalid fan speed: actual speed={}, set speed={}, min={}, max={}'.format( + fan_info["speed_get"], + fan_info["speed_set"], fan_info["min_speed"], fan_info["max_speed"], - fan_info["speed_set"], - fan_info["speed_get"] ) -def generate_sysfs_config(sku_info): +def generate_sysfs_config(platform_data): config = list() config.append(generate_sysfs_symbolink_config()) config.append(generate_sysfs_asic_config()) - if sku_info["cpu_pack"]["number"] > 0: + if platform_data["cpu_pack"]["number"] > 0: config.append(generate_sysfs_cpu_pack_config()) - config.append(generate_sysfs_cpu_core_config(sku_info)) - config.append(generate_sysfs_fan_config(sku_info)) - if sku_info['psus']['hot_swappable']: - config.append(generate_sysfs_psu_config(sku_info)) - config.append(generate_sysfs_sfp_config(sku_info)) + config.append(generate_sysfs_cpu_core_config(platform_data)) + config.append(generate_sysfs_fan_config(platform_data)) + if platform_data['psus']['hot_swappable']: + config.append(generate_sysfs_psu_config(platform_data)) + config.append(generate_sysfs_sfp_config(platform_data)) return config @@ -212,11 +210,11 @@ def generate_sysfs_asic_config(): } -def generate_sysfs_fan_config(sku_info): +def generate_sysfs_fan_config(platform_data): fan_config = { 'name': 'fan_info', 'start': 1, - 'count': sku_info['fans']['number'], + 'count': platform_data['fans']['number'], 'type': 'increment', 'properties': [ { @@ -245,7 +243,7 @@ def generate_sysfs_fan_config(sku_info): } ] } - if not sku_info['fans']['hot_swappable']: + if not platform_data['fans']['hot_swappable']: fan_config['properties'] = fan_config['properties'][1:] return fan_config @@ -271,11 +269,11 @@ def generate_sysfs_cpu_pack_config(): } -def generate_sysfs_cpu_core_config(sku_info): +def generate_sysfs_cpu_core_config(platform_data): return { 'name': 'cpu_core_info', 'start': 0, - 'count': sku_info['cpu_cores']['number'], + 'count': platform_data['cpu_cores']['number'], 'type': 'increment', 'properties': [ { @@ -294,11 +292,11 @@ def generate_sysfs_cpu_core_config(sku_info): } -def generate_sysfs_psu_config(sku_info): +def generate_sysfs_psu_config(platform_data): return { 'name': 'psu_info', 'start': 1, - 'count': sku_info['psus']['number'], + 'count': platform_data['psus']['number'], 'type': 'increment', 'properties': [ { @@ -329,11 +327,11 @@ def generate_sysfs_psu_config(sku_info): } -def generate_sysfs_sfp_config(sku_info): +def generate_sysfs_sfp_config(platform_data): return { 'name': 'sfp_info', 'start': 1, - 'count': sku_info['ports']['number'], + 'count': platform_data['ports']['number'], 'type': 'increment', 'properties': [ { diff --git a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py index 3ab8a39af4c..2d72cb9779c 100644 --- a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py +++ b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py @@ -2,8 +2,8 @@ import random import logging from tests.platform_tests.thermal_control_test_helper import * -from tests.common.mellanox_data import SWITCH_MODELS -from minimum_table import MINIMUM_TABLE +from tests.common.mellanox_data import get_platform_data +from minimum_table import get_min_table NOT_AVAILABLE = 'N/A' @@ -256,8 +256,8 @@ def __init__(self, mock_helper, naming_rule, index): """ self.index = index self.helper = mock_helper - dut_hwsku = self.helper.dut.facts["hwsku"] - if SWITCH_MODELS[dut_hwsku]['fans']['hot_swappable']: + self.platform_data = get_platform_data(self.helper.dut) + if self.platform_data['fans']['hot_swappable']: self.name = 'drawer{}'.format(index) else: self.name = 'N/A' @@ -295,8 +295,7 @@ def mock_presence(self, presence): :param presence: Given presence value. 1 means present, 0 means not present. :return: """ - dut_hwsku = self.helper.dut.facts["hwsku"] - always_present = not SWITCH_MODELS[dut_hwsku]['fans']['hot_swappable'] + always_present = self.platform_data['fans']['hot_swappable'] if always_present: self.mocked_presence = 'Present' elif self.presence_file: @@ -636,8 +635,8 @@ def mock_data(self): expected_data = self.expected_data[fan_data.name] expected_data[1] = drawer_data.get_expect_led_color() - dut_hwsku = self.mock_helper.dut.facts["hwsku"] - psu_count = SWITCH_MODELS[dut_hwsku]["psus"]["number"] + platform_data = get_platform_data(self.mock_helper.dut) + psu_count = platform_data["psus"]["number"] naming_rule = FAN_NAMING_RULE['psu_fan'] for index in range(1, psu_count + 1): try: @@ -734,8 +733,8 @@ def mock_data(self): Mock random data for all Thermals in this DUT. :return: """ - dut_hwsku = self.mock_helper.dut.facts["hwsku"] - thermal_dict = SWITCH_MODELS[dut_hwsku]["thermals"] + platform_data = get_platform_data(self.mock_helper.dut) + thermal_dict = platform_data["thermals"] for category, content in thermal_dict.items(): number = int(content['number']) naming_rule = THERMAL_NAMING_RULE[category] @@ -882,8 +881,8 @@ def is_fan_removable(self): """ :return: True if FAN is removable else False """ - dut_hwsku = self.mock_helper.dut.facts["hwsku"] - return SWITCH_MODELS[dut_hwsku]['fans']['hot_swappable'] + platform_data = get_platform_data(self.mock_helper.dut) + return platform_data['fans']['hot_swappable'] def mock_all_normal(self): """ @@ -975,8 +974,7 @@ def __init__(self, dut): self.mock_helper = MockerHelper(dut) def get_expect_cooling_level(self, air_flow_dir, temperature, trust_state): - hwsku = self.mock_helper.dut.facts["hwsku"] - minimum_table = MINIMUM_TABLE[hwsku] + minimum_table = get_min_table(self.mock_helper.dut) row = minimum_table['{}_{}'.format(air_flow_dir, 'trust' if trust_state else 'untrust')] temperature = temperature / 1000 for range_str, cooling_level in row.items(): diff --git a/tests/platform_tests/mellanox/minimum_table.py b/tests/platform_tests/mellanox/minimum_table.py index 78bf900aaf7..729ff4d7a20 100644 --- a/tests/platform_tests/mellanox/minimum_table.py +++ b/tests/platform_tests/mellanox/minimum_table.py @@ -1,90 +1,46 @@ MINIMUM_TABLE= { - 'ACS-MSN2700': { - "p2c_trust": {"-127:40":13, "41:120":15}, - "p2c_untrust": {"-127:25":13, "26:30":14 , "31:35":15, "36:120":16}, - "c2p_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "c2p_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, + 'x86_64-mlnx_msn2700-r0': { "unk_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, "unk_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16} }, - 'LS-SN2700': { - "p2c_trust": {"-127:40":13, "41:120":15}, - "p2c_untrust": {"-127:25":13, "26:30":14 , "31:35":15, "36:120":16}, - "c2p_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "c2p_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16} - }, - 'ACS-MSN2740': { - "p2c_trust": {"-127:120":13}, - "p2c_untrust": {"-127:35":13, "36:40":14 , "41:120":15}, - "c2p_trust": {"-127:120":13}, - "c2p_untrust": {"-127:15":13, "16:30":14 , "31:35":15, "36:120":17}, + 'x86_64-mlnx_msn2740-r0': { "unk_trust": {"-127:120":13}, "unk_untrust": {"-127:15":13, "16:30":14 , "31:35":15, "36:120":17}, }, - 'ACS-MSN2410': { - "p2c_trust": {"-127:40":13, "41:120":15}, - "p2c_untrust": {"-127:25":13, "26:30":14 , "31:35":15, "36:120":16}, - "c2p_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "c2p_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16} - }, - 'Mellanox-SN2700': { - "p2c_trust": {"-127:40":13, "41:120":15}, - "p2c_untrust": {"-127:25":13, "26:30":14 , "31:35":15, "36:120":16}, - "c2p_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "c2p_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "unk_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16} - }, - 'Mellanox-SN2700-D48C8': { - "p2c_trust": {"-127:40":13, "41:120":15}, - "p2c_untrust": {"-127:25":13, "26:30":14 , "31:35":15, "36:120":16}, - "c2p_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, - "c2p_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, + 'x86_64-mlnx_msn2410-r0': { "unk_trust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16}, "unk_untrust": {"-127:20":13, "21:25":14 , "26:30":15, "31:120":16} }, - 'ACS-MSN2100': { - "p2c_trust": {"-127:120":12}, - "p2c_untrust": {"-127:15":12, "16:25":13, "26:30":14, "31:35":15, "36:120":16}, - "c2p_trust": {"-127:40":12, "41:120":13}, - "c2p_untrust": {"-127:40":12, "41:120":13}, + 'x86_64-mlnx_msn2100-r0': { "unk_trust": {"-127:40":12, "41:120":13}, "unk_untrust": {"-127:15":12, "16:25":13, "26:30":14, "31:35":15, "36:120":16} }, - 'ACS-MSN2010': { - "p2c_trust": {"-127:120":12}, - "p2c_untrust": {"-127:15":12, "16:20":13, "21:30":14, "31:35":15, "36:120":16}, - "c2p_trust": {"-127:120":12}, - "c2p_untrust": {"-127:20":12, "21:25":13 , "26:30":14, "31:35":15, "36:120":16}, + 'x86_64-mlnx_msn2010-r0': { "unk_trust": {"-127:120":12}, "unk_untrust": {"-127:15":12, "16:20":13 , "21:30":14, "31:35":15, "36:120":16} }, - 'ACS-MSN3700': { - "p2c_trust": {"-127:25":12, "26:40":13 , "41:120":14}, - "p2c_untrust": {"-127:15":12, "16:30":13 , "31:35":14, "36:40":15, "41:120":16}, - "c2p_trust": {"-127:25":12, "26:40":13 , "41:120":14}, - "c2p_untrust": {"-127:25":12, "26:40":13 , "41:120":14}, + 'x86_64-mlnx_msn3700-r0': { "unk_trust": {"-127:25":12, "26:40":13 , "41:120":14}, "unk_untrust": {"-127:15":12, "16:30":13 , "31:35":14, "36:40":15, "41:120":16}, }, - 'ACS-MSN3800': { - "p2c_trust": {"-127:35":12, "36:120":13}, - "p2c_untrust": {"-127:0":12, "1:10":13 , "11:15":14, "16:20":15, "21:35":16, "36:120":17}, - "c2p_trust": {"-127:30":12, "31:40":13 , "41:120":14}, - "c2p_untrust": {"-127:20":12, "21:30":13 , "31:35":14, "36:40":15, "41:120":16}, + 'x86_64-mlnx_msn3800-r0': { "unk_trust": {"-127:30":12, "31:40":13 , "41:120":14}, "unk_untrust": {"-127:0":12, "1:10":13 , "11:15":14, "16:20":15, "21:35":16, "36:120":17}, }, - 'Mellanox-SN3800-D112C8': { - "p2c_trust": {"-127:35":12, "36:120":13}, - "p2c_untrust": {"-127:0":12, "1:10":13 , "11:15":14, "16:20":15, "21:35":16, "36:120":17}, - "c2p_trust": {"-127:30":12, "31:40":13 , "41:120":14}, - "c2p_untrust": {"-127:20":12, "21:30":13 , "31:35":14, "36:40":15, "41:120":16}, - "unk_trust": {"-127:30":12, "31:40":13 , "41:120":14}, - "unk_untrust": {"-127:0":12, "1:10":13 , "11:15":14, "16:20":15, "21:35":16, "36:120":17}, + 'x86_64-mlnx_msn4700-r0': { + "unk_trust": {"-127:35":14, "36:120":15}, + "unk_untrust": {"-127:35":14, "36:120":15}, }, + 'x86_64-mlnx_msn3420-r0': { + "unk_trust": {"-127:120":12}, + "unk_untrust": {"-127:25":12, "26:35":13, "36:40":14, "41:120":16}, + }, + 'x86_64-mlnx_msn4600c-r0': { + "unk_trust": {"-127:40":12, "41:120":13}, + "unk_untrust": {"-127:5":12, "6:20":13, "21:30":14, "31:35":15, "36:40":16, "41:120":17}, + } } + +def get_min_table(dut): + dut_platform = dut.facts["platform"] + return MINIMUM_TABLE[dut_platform] diff --git a/tests/platform_tests/mellanox/test_thermal_control.py b/tests/platform_tests/mellanox/test_thermal_control.py index 1cd415ebbc6..5c1ca2a529e 100644 --- a/tests/platform_tests/mellanox/test_thermal_control.py +++ b/tests/platform_tests/mellanox/test_thermal_control.py @@ -3,7 +3,7 @@ import pytest import random import time -from tests.common.mellanox_data import SWITCH_MODELS +from tests.common.mellanox_data import get_platform_data from tests.common.plugins.loganalyzer.loganalyzer import LogAnalyzer from tests.common.utilities import wait_until from tests.platform_tests.thermal_control_test_helper import * @@ -62,11 +62,11 @@ def test_dynamic_minimum_table(duthost, mocker_factory): @pytest.mark.disable_loganalyzer def test_set_psu_fan_speed(duthost, mocker_factory): - hwsku = duthost.facts["hwsku"] - psu_num = SWITCH_MODELS[hwsku]['psus']['number'] - hot_swappable = SWITCH_MODELS[hwsku]['psus']['hot_swappable'] + platform_data = get_platform_data(duthost) + psu_num = platform_data['psus']['number'] + hot_swappable = platform_data['psus']['hot_swappable'] if not hot_swappable: - pytest.skip('The SKU {} does not support this test case.'.format(hwsku)) + pytest.skip('The platform {} does not support this test case.'.format(duthost.facts["platform"])) logging.info('Create mocker, it may take a few seconds...') single_fan_mocker = mocker_factory(duthost, 'SingleFanMocker') diff --git a/tests/system_health/mellanox/mellanox_device_mocker.py b/tests/system_health/mellanox/mellanox_device_mocker.py index 12aac4ca1ea..3cf716b4dd7 100644 --- a/tests/system_health/mellanox/mellanox_device_mocker.py +++ b/tests/system_health/mellanox/mellanox_device_mocker.py @@ -1,5 +1,5 @@ from ..device_mocker import DeviceMocker -from tests.common.mellanox_data import SWITCH_MODELS +from tests.common.mellanox_data import get_platform_data from tests.platform_tests.mellanox.mellanox_thermal_control_test_helper import MockerHelper, FanDrawerData, FanData, \ FAN_NAMING_RULE @@ -76,8 +76,8 @@ def deinit(self): self.mock_helper.deinit() def mock_fan_presence(self, status): - dut_hwsku = self.mock_helper.dut.facts["hwsku"] - always_present = not SWITCH_MODELS[dut_hwsku]['fans']['hot_swappable'] + platform_data = get_platform_data(self.mock_helper.dut) + always_present = not platform_data['fans']['hot_swappable'] if always_present: return False, None From 6b5ae0a6bd97baab93e875767e7699ba8dce453f Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 14 Sep 2020 17:32:56 +0800 Subject: [PATCH 3/4] Add some comments and fix some lint warnnings --- tests/common/mellanox_data.py | 5 +++++ tests/platform_tests/mellanox/check_sysfs.py | 7 ++++--- .../mellanox/mellanox_thermal_control_test_helper.py | 2 ++ tests/platform_tests/mellanox/minimum_table.py | 6 ++++++ tests/platform_tests/test_platform_info.py | 8 ++++---- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/tests/common/mellanox_data.py b/tests/common/mellanox_data.py index 7bf84730997..2d5928562c9 100644 --- a/tests/common/mellanox_data.py +++ b/tests/common/mellanox_data.py @@ -568,5 +568,10 @@ def is_mellanox_device(dut): def get_platform_data(dut): + """ + Get the platform physical data for the given dut object + :param dut: dut object + :return: A dictionary contains the platform physical data + """ dut_platform = dut.facts["platform"] return SWITCH_MODELS[dut_platform] diff --git a/tests/platform_tests/mellanox/check_sysfs.py b/tests/platform_tests/mellanox/check_sysfs.py index e1427e8bac7..cc410a6ec0b 100644 --- a/tests/platform_tests/mellanox/check_sysfs.py +++ b/tests/platform_tests/mellanox/check_sysfs.py @@ -122,8 +122,8 @@ def check_psu_sysfs(dut, psu_id, psu_state): (psu_exist, psu_exist_content["stdout"]) else: platform_data = get_platform_data(dut) - hot_swappabe = platform_data["psus"]["hot_swappable"] - if hot_swappabe: + hot_swappable = platform_data["psus"]["hot_swappable"] + if hot_swappable: psu_exist_content = dut.command("cat %s" % psu_exist) logging.info("PSU state %s file %s read %s" % (psu_state, psu_exist, psu_exist_content["stdout"])) assert psu_exist_content["stdout"] == "1", "CLI returns %s while %s contains %s" % \ @@ -162,11 +162,12 @@ def _is_fan_speed_in_range(sysfs_facts): high_threshold = ((float(fan_speed_set) / 255) * fan_max_speed) * (1 + 0.5) return low_threshold < fan_speed_get < high_threshold except Exception as e: - assert False, 'Invalid fan speed: actual speed={}, set speed={}, min={}, max={}'.format( + assert False, 'Invalid fan speed: actual speed={}, set speed={}, min={}, max={}, exception={}'.format( fan_info["speed_get"], fan_info["speed_set"], fan_info["min_speed"], fan_info["max_speed"], + e ) diff --git a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py index 2d72cb9779c..8e0d1a64815 100644 --- a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py +++ b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py @@ -342,6 +342,7 @@ def get_status_led(self): else: assert 0, 'Invalid FAN led color for FAN: {}, green={}, red={}'.format(self.name, green_led_value, red_led_value) + def get_expect_led_color(self): if self.mocked_presence == 'Not Present': return 'red' @@ -970,6 +971,7 @@ class MinTableMocker(object): FAN_AMB_PATH = 'fan_amb' PORT_AMB_PATH = 'port_amb' TRUST_PATH = 'module1_temp_fault' + def __init__(self, dut): self.mock_helper = MockerHelper(dut) diff --git a/tests/platform_tests/mellanox/minimum_table.py b/tests/platform_tests/mellanox/minimum_table.py index 729ff4d7a20..6270834f646 100644 --- a/tests/platform_tests/mellanox/minimum_table.py +++ b/tests/platform_tests/mellanox/minimum_table.py @@ -41,6 +41,12 @@ } } + def get_min_table(dut): + """ + Get the dynamic minimum fan speed table for the given switch dut object + :param dut: switch dut object + :return: A dictionary contains the dynamic minimum fan speed data + """ dut_platform = dut.facts["platform"] return MINIMUM_TABLE[dut_platform] diff --git a/tests/platform_tests/test_platform_info.py b/tests/platform_tests/test_platform_info.py index 497f0be2aaf..c7a42092416 100644 --- a/tests/platform_tests/test_platform_info.py +++ b/tests/platform_tests/test_platform_info.py @@ -91,7 +91,7 @@ def psu_test_setup_teardown(duthost): logging.info("Starting psu test teardown") sensord_running_status, sensord_pid = check_sensord_status(duthost) if not sensord_running_status: - ans_host.command("docker exec pmon supervisorctl restart lm-sensors") + duthost.command("docker exec pmon supervisorctl restart lm-sensors") time.sleep(3) sensord_running_status, sensord_pid = check_sensord_status(duthost) if sensord_running_status: @@ -186,7 +186,7 @@ def test_turn_on_off_psu_and_check_psustatus(duthost, psu_controller): pytest.skip("Some PSU are still down, skip rest of the testing in this case") assert len(psu_test_results.keys()) == psu_num, \ - "In consistent PSU number output by '%s' and '%s'" % (CMD_PLATFORM_PSUSTATUS, cmd_num_psu) + "In consistent PSU number output by '%s' and '%s'" % (CMD_PLATFORM_PSUSTATUS, "sudo psuutil numpsus") logging.info("Start testing turn off/on PSUs") all_psu_status = psu_ctrl.get_psu_status() @@ -420,13 +420,13 @@ def test_thermal_control_fan_status(duthost, mocker_factory): with loganalyzer: logging.info('Mocking a fault FAN...') single_fan_mocker.mock_status(False) - check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME, 2) + check_cli_output_with_mocker(duthost, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME, 2) loganalyzer.expect_regex = [LOG_EXPECT_FAN_FAULT_CLEAR_RE, LOG_EXPECT_INSUFFICIENT_FAN_NUM_CLEAR_RE] with loganalyzer: logging.info('Mocking the fault FAN back to normal...') single_fan_mocker.mock_status(True) - check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME, 2) + check_cli_output_with_mocker(duthost, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME, 2) loganalyzer.expect_regex = [LOG_EXPECT_FAN_OVER_SPEED_RE] with loganalyzer: From d9311fbcde3cc8ef4347562cc0ea3ef86bd6dfb8 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 18 Sep 2020 09:50:46 +0800 Subject: [PATCH 4/4] Fix issue found in test --- .../mellanox/mellanox_thermal_control_test_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py index 8e0d1a64815..2caccb51191 100644 --- a/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py +++ b/tests/platform_tests/mellanox/mellanox_thermal_control_test_helper.py @@ -295,7 +295,7 @@ def mock_presence(self, presence): :param presence: Given presence value. 1 means present, 0 means not present. :return: """ - always_present = self.platform_data['fans']['hot_swappable'] + always_present = not self.platform_data['fans']['hot_swappable'] if always_present: self.mocked_presence = 'Present' elif self.presence_file: