Skip to content

Commit

Permalink
[sonic-py-common] Add platform and chassis info methods to device_info (
Browse files Browse the repository at this point in the history
#7652)

#### Why I did it
These methods were added to make some convenient platform and chassis information methods accessible through sonic-py-common. These methods were refactored from sonic-utilities and are used in the `show platform summary` and `show version` commands. 

#### How I did it
There are two methods, one is `get_platform_info()` which simply calls local methods to collect useful platform information into a dictionary format, this came directly from sonic-utilities.
  • Loading branch information
alexrallen authored and qiluo-msft committed Jul 8, 2022
1 parent 6fe583e commit 2c3dc47
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 1 deletion.
48 changes: 48 additions & 0 deletions src/sonic-py-common/sonic_py_common/device_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@
FRONTEND_ASIC_SUB_ROLE = "FrontEnd"
BACKEND_ASIC_SUB_ROLE = "BackEnd"

# Chassis STATE_DB keys
CHASSIS_INFO_TABLE = 'CHASSIS_INFO|chassis {}'
CHASSIS_INFO_CARD_NUM_FIELD = 'module_num'
CHASSIS_INFO_SERIAL_FIELD = 'serial'
CHASSIS_INFO_MODEL_FIELD = 'model'
CHASSIS_INFO_REV_FIELD = 'revision'


def get_localhost_info(field):
try:
Expand Down Expand Up @@ -303,6 +310,47 @@ def get_sonic_version_file():

return SONIC_VERSION_YAML_PATH


# Get hardware information
def get_platform_info():
"""
This function is used to get the HW info helper function
"""
from .multi_asic import get_num_asics

hw_info_dict = {}

version_info = get_sonic_version_info()

hw_info_dict['platform'] = get_platform()
hw_info_dict['hwsku'] = get_hwsku()
hw_info_dict['asic_type'] = version_info['asic_type']
hw_info_dict['asic_count'] = get_num_asics()

return hw_info_dict


def get_chassis_info():
"""
This function is used to get the Chassis serial / model / rev number
"""

chassis_info_dict = {}

try:
# Init statedb connection
db = SonicV2Connector()
db.connect(db.STATE_DB)
table = CHASSIS_INFO_TABLE.format(1)

chassis_info_dict['serial'] = db.get(db.STATE_DB, table, CHASSIS_INFO_SERIAL_FIELD)
chassis_info_dict['model'] = db.get(db.STATE_DB, table, CHASSIS_INFO_MODEL_FIELD)
chassis_info_dict['revision'] = db.get(db.STATE_DB, table, CHASSIS_INFO_REV_FIELD)
except Exception:
pass

return chassis_info_dict

#
# Multi-NPU functionality
#
Expand Down
10 changes: 9 additions & 1 deletion src/sonic-py-common/tests/device_info_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from sonic_py_common import device_info

from .mock_swsssdk import SonicV2Connector

# TODO: Remove this if/else block once we no longer support Python 2
if sys.version_info.major == 3:
Expand Down Expand Up @@ -51,7 +52,6 @@
'onie_kernel_version': '4.10.11'
}


class TestDeviceInfo(object):
@pytest.fixture(scope="class", autouse=True)
def sanitize_environment(self):
Expand All @@ -75,6 +75,14 @@ def test_get_platform(self):
result = device_info.get_platform()
assert result == "x86_64-mlnx_msn2700-r0"

def test_get_chassis_info(self):
with mock.patch("sonic_py_common.device_info.SonicV2Connector", new=SonicV2Connector):
result = device_info.get_chassis_info()
truth = {"serial": SonicV2Connector.TEST_SERIAL,
"model": SonicV2Connector.TEST_MODEL,
"revision": SonicV2Connector.TEST_REV}
assert result == truth

@classmethod
def teardown_class(cls):
print("TEARDOWN")
16 changes: 16 additions & 0 deletions src/sonic-py-common/tests/mock_swsssdk.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class SonicV2Connector:
TEST_SERIAL = "MT1822K07815"
TEST_MODEL = "MSN2700-CS2FO"
TEST_REV = "A1"

def __init__(self):
self.STATE_DB = 'STATE_DB'
self.data = {"serial": self.TEST_SERIAL,
"model": self.TEST_MODEL,
"revision": self.TEST_REV}

def connect(self, db):
pass

def get(self, db, table, field):
return self.data.get(field, "N/A")

0 comments on commit 2c3dc47

Please sign in to comment.