Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Mellanox] Update the method of reading model number for MLNX platforms #21763

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from sonic_platform_base.chassis_base import ChassisBase
from sonic_py_common.logger import Logger
import os
import subprocess
from functools import reduce
from .utils import extract_RJ45_ports_index
from . import module_host_mgmt_initializer
Expand Down Expand Up @@ -57,6 +58,9 @@
REBOOT_TYPE_KEXEC_PATTERN_WARM = ".*SONIC_BOOT_TYPE=(warm|fastfast).*"
REBOOT_TYPE_KEXEC_PATTERN_FAST = ".*SONIC_BOOT_TYPE=(fast|fast-reboot).*"

GET_HWSKU_CMD = ["sonic-cfggen", "-d", "-v", "DEVICE_METADATA.localhost.hwsku"]
SYS_DISPLAY = "SYS_DISPLAY"

# Global logger class instance
logger = Logger()

Expand Down Expand Up @@ -742,8 +746,15 @@ def get_model(self):
Returns:
string: Model/part number of device
"""
self.initialize_eeprom()
return self._eeprom.get_part_number()
model = None
if self._read_model_from_vpd():
if not self.vpd_data:
self.vpd_data = self._parse_vpd_data(VPD_DATA_FILE)
model = self.vpd_data.get(SYS_DISPLAY, "N/A")
else:
self.initialize_eeprom()
model = self._eeprom.get_part_number()
return model

def get_base_mac(self):
"""
Expand Down Expand Up @@ -944,6 +955,19 @@ def _parse_vpd_data(self, filename):

return result

def _read_model_from_vpd(self):
"""
Returns if model number should be returned from VPD file

Returns:
Returns True if spectrum version is higher than Spectrum-4 according to sku number
"""
p = subprocess.Popen(self.GET_HWSKU_CMD, universal_newlines=True, stdout=subprocess.PIPE)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We may be able to get this info directly from the vpd_data file(multi fields can be used: 'Part Number', 'SYS_DISPLAY', 'Platform Name', etc... ), and there is a function implemented to parse the vpd_data: https://github.com/sonic-net/sonic-buildimage/blob/master/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py#L928

root@sonic:/home/admin# cat /var/run/hw-management/eeprom/vpd_data 
Part Number:             MSN2700-CS2FO
Serial Number:           MT2020T04244
Base MAC Address:        1c34daa19680
Manufacture Date:        05/18/2020 11:05:43
Device Version:          17
MAC Addresses:           128
SN:                      MT2020T04244
PN:                      MSN2700-CS2FO
REV:                     BA
MFG_DATE:                3253955
PROD_NAME:               Panther Eth 100
HW_MGT_ID:               80
HW_MGT_REV:              17
SW_MGT_ID:               2700
SYS_DISPLAY:             MSN2700
MAX_POWER:               0
CRIT_AMB_TEMP:           0
CRIT_IC_TEMP:            0
ALERT_AMB_TEMP:          0
ALERT_IC_TEMP:           0
FAN_DIR:                 0
LENGTH:                  0
WIDTH:                   0
LED:                     0
GUID_TYPE:               0xd
BASE_MAC_1:              1C:34:DA:A1:96:80
MAC_RANGE_1:             0x8000
BASE_GUID_1:             1C:34:DA:03:00:A1:96:80
FEATURE_EN_0:            0
FEATURE_EN_1:            70
FEATURE_EN_2:            0
FEATURE_EN_3:            0
FEATURE_EN_4:            8
FEATURE_EN_5:            0
FEATURE_EN_6:            5
FEATURE_EN_7:            5
FEATURE_EN_8:            5
FEATURE_EN_9:            5
FEATURE_EN_10:           0
FEATURE_EN_11:           0
NUM_SCHEME:              0
EN_PORTS_NUM:            32
PORTS_INC_SCHEME:        0
PORTS_INC_ORDER_0:       0
PORTS_INC_ORDER_1:       0
PORTS_INC_ORDER_2:       0
PORTS_INC_ORDER_3:       0
Manufacturer:            Mellanox
Platform Name:           x86_64-mlnx_msn2700-r0
Product Name:            MSN2700
ONIE Version:            2023.11-5.3.0011-9600
CHSUM_FIELD:             0X878FA694

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed it, the idea to separate implementation for previous SPCs to ensure backward compatibility. It is not guaranteed that SYS_DISPLAY had the desired value for all previous platforms.

out, err = p.communicate()
out.rstrip('\n')
sku_num = re.search('[0-9]{4}', out).group()
return int(sku_num) >= 5000

def _verify_reboot_cause(self, filename):
'''
Open and read the reboot cause file in
Expand Down
4 changes: 3 additions & 1 deletion platform/mellanox/mlnx-platform-api/tests/test_eeprom.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#
# Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES.
# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES
# Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -33,6 +34,7 @@
class TestEeprom:
@patch('os.path.exists', MagicMock(return_value=True))
@patch('os.path.islink', MagicMock(return_value=True))
@patch('sonic_platform.chassis.subprocess.Popen', MagicMock(return_value='MSN3700'))
@patch('sonic_platform.eeprom.Eeprom.get_system_eeprom_info')
@patch('sonic_platform.chassis.extract_RJ45_ports_index', MagicMock(return_value=[]))
def test_chassis_eeprom(self, mock_eeprom_info):
Expand Down
Loading