diff --git a/src/sonic-py-common/sonic_py_common/device_info.py b/src/sonic-py-common/sonic_py_common/device_info.py index 52b7900b11..4d1df63522 100644 --- a/src/sonic-py-common/sonic_py_common/device_info.py +++ b/src/sonic-py-common/sonic_py_common/device_info.py @@ -32,6 +32,13 @@ ASIC_CONF_FILENAME = "asic.conf" 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: @@ -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 # diff --git a/src/sonic-py-common/tests/device_info_test.py b/src/sonic-py-common/tests/device_info_test.py index df94d147aa..bb7af40ad9 100644 --- a/src/sonic-py-common/tests/device_info_test.py +++ b/src/sonic-py-common/tests/device_info_test.py @@ -13,6 +13,7 @@ import pytest 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: @@ -51,7 +52,6 @@ EXPECTED_GET_MACHINE_INFO_RESULT = { 'onie_kernel_version': '4.10.11' } - class TestDeviceInfo(object): @pytest.fixture(scope="class", autouse=True) def sanitize_environment(self): @@ -75,6 +75,14 @@ class TestDeviceInfo(object): 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") diff --git a/src/sonic-py-common/tests/mock_swsssdk.py b/src/sonic-py-common/tests/mock_swsssdk.py new file mode 100644 index 0000000000..df6affaf18 --- /dev/null +++ b/src/sonic-py-common/tests/mock_swsssdk.py @@ -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")