Skip to content

Commit e313889

Browse files
committed
[show platform summary] Add chassis hardware info to platform summary and version (#1624)
#### What I did I added chassis model number, serial number, and hardware revision to the commands `show platform summary` and `show version` #### How I did it I refactored and modified the existing `get_hw_info_dict()` function to make calls to STATE_DB and get the chassis information populated by sonic-net/sonic-platform-daemons#183 script. The new refactored versions of `get_hw_info_dict()` are added here sonic-net/sonic-buildimage#7652
1 parent 7463817 commit e313889

File tree

4 files changed

+73
-50
lines changed

4 files changed

+73
-50
lines changed

doc/Command-Reference.md

+16-3
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,15 @@ This command displays relevant information as the SONiC and Linux kernel version
441441
Build date: Fri Mar 22 01:55:48 UTC 2019
442442
Built by: johnar@jenkins-worker-4
443443
444+
Platform: x86_64-mlnx_msn2700-r0
445+
HwSKU: Mellanox-SN2700
446+
ASIC: mellanox
447+
ASIC Count: 1
448+
Serial Number: MT1822K07815
449+
Model Number: MSN2700-CS2FO
450+
Hardware Rev: A1
451+
Uptime: 14:40:15 up 3 min, 1 user, load average: 1.26, 1.45, 0.66
452+
444453
Docker images:
445454
REPOSITORY TAG IMAGE ID SIZE
446455
docker-syncd-brcm HEAD.32-21ea29a 434240daff6e 362MB
@@ -686,9 +695,13 @@ This command displays a summary of the device's hardware platform
686695
- Example:
687696
```
688697
admin@sonic:~$ show platform summary
689-
Platform: x86_64-dell_s6000_s1220-r0
690-
HwSKU: Force10-S6000
691-
ASIC: broadcom
698+
Platform: x86_64-mlnx_msn2700-r0
699+
HwSKU: Mellanox-SN2700
700+
ASIC: mellanox
701+
ASIC Count: 1
702+
Serial Number: MT1822K07815
703+
Model Number: MSN2700-CS2FO
704+
Hardware Rev: A1
692705
```
693706

694707
**show platform syseeprom**

show/main.py

+11-22
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import utilities_common.cli as clicommon
99
import utilities_common.multi_asic as multi_asic_util
1010
from natsort import natsorted
11-
from sonic_py_common import device_info, multi_asic
11+
from sonic_py_common import device_info
1212
from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector
1313
from tabulate import tabulate
1414
from utilities_common import util_base
@@ -956,22 +956,9 @@ def logging(process, lines, follow, verbose):
956956
def version(verbose):
957957
"""Show version information"""
958958
version_info = device_info.get_sonic_version_info()
959-
960-
platform = device_info.get_platform()
961-
hwsku = device_info.get_hwsku()
962-
asic_type = version_info['asic_type']
963-
asic_count = multi_asic.get_num_asics()
964-
965-
serial_number = None
966-
db = SonicV2Connector()
967-
db.connect(db.STATE_DB)
968-
eeprom_table = db.get_all(db.STATE_DB, 'EEPROM_INFO|0x23')
969-
if "Name" in eeprom_table and eeprom_table["Name"] == "Serial Number" and "Value" in eeprom_table:
970-
serial_number = eeprom_table["Value"]
971-
else:
972-
serial_number_cmd = "sudo decode-syseeprom -s"
973-
serial_number = subprocess.Popen(serial_number_cmd, shell=True, text=True, stdout=subprocess.PIPE).stdout.read()
974-
959+
platform_info = device_info.get_platform_info()
960+
chassis_info = platform.get_chassis_info()
961+
975962
sys_uptime_cmd = "uptime"
976963
sys_uptime = subprocess.Popen(sys_uptime_cmd, shell=True, text=True, stdout=subprocess.PIPE)
977964

@@ -981,11 +968,13 @@ def version(verbose):
981968
click.echo("Build commit: {}".format(version_info['commit_id']))
982969
click.echo("Build date: {}".format(version_info['build_date']))
983970
click.echo("Built by: {}".format(version_info['built_by']))
984-
click.echo("\nPlatform: {}".format(platform))
985-
click.echo("HwSKU: {}".format(hwsku))
986-
click.echo("ASIC: {}".format(asic_type))
987-
click.echo("ASIC Count: {}".format(asic_count))
988-
click.echo("Serial Number: {}".format(serial_number.strip()))
971+
click.echo("\nPlatform: {}".format(platform_info['platform']))
972+
click.echo("HwSKU: {}".format(platform_info['hwsku']))
973+
click.echo("ASIC: {}".format(platform_info['asic_type']))
974+
click.echo("ASIC Count: {}".format(platform_info['asic_count']))
975+
click.echo("Serial Number: {}".format(chassis_info['serial']))
976+
click.echo("Model Number: {}".format(chassis_info['model']))
977+
click.echo("Hardware Revision: {}".format(chassis_info['revision']))
989978
click.echo("Uptime: {}".format(sys_uptime.stdout.read().strip()))
990979
click.echo("\nDocker images:")
991980
cmd = 'sudo docker images --format "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}"'

show/platform.py

+30-19
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,33 @@
44

55
import click
66
import utilities_common.cli as clicommon
7-
from sonic_py_common import device_info, multi_asic
7+
from sonic_py_common import device_info
88

9+
#
10+
# Helper functions
11+
#
912

10-
def get_hw_info_dict():
13+
def get_chassis_info():
1114
"""
12-
This function is used to get the HW info helper function
15+
Attempts to get the chassis info via STATE_DB and falls back to direct Platform API calls.
1316
"""
14-
hw_info_dict = {}
1517

16-
version_info = device_info.get_sonic_version_info()
18+
chassis_info = device_info.get_chassis_info()
19+
required_keys = ['serial', 'model', 'revision']
20+
failed_vals = ['', 'N/A']
21+
platform_chassis = None
1722

18-
hw_info_dict['platform'] = device_info.get_platform()
19-
hw_info_dict['hwsku'] = device_info.get_hwsku()
20-
hw_info_dict['asic_type'] = version_info['asic_type']
21-
hw_info_dict['asic_count'] = multi_asic.get_num_asics()
22-
23-
return hw_info_dict
23+
for k in required_keys:
24+
if chassis_info.get(k, '') in failed_vals:
25+
if platform_chassis is None:
26+
import platform
27+
platform_chassis = sonic_platform.platform.Platform().get_chassis()
28+
try:
29+
chassis_info[k] = getattr(platform_chassis, "get_".format(k))()
30+
except AttributeError:
31+
chassis_info[k] = 'N/A'
2432

33+
return chassis_info
2534

2635
#
2736
# 'platform' group ("show platform ...")
@@ -38,17 +47,19 @@ def platform():
3847
@click.option('--json', is_flag=True, help="Output in JSON format")
3948
def summary(json):
4049
"""Show hardware platform information"""
41-
42-
hw_info_dict = {}
43-
hw_info_dict = get_hw_info_dict()
50+
platform_info = device_info.get_platform_info()
51+
chassis_info = get_chassis_info()
4452

4553
if json:
46-
click.echo(clicommon.json_dump(hw_info_dict))
54+
click.echo(clicommon.json_dump({**platform_info, **chassis_info}))
4755
else:
48-
click.echo("Platform: {}".format(hw_info_dict['platform']))
49-
click.echo("HwSKU: {}".format(hw_info_dict['hwsku']))
50-
click.echo("ASIC: {}".format(hw_info_dict['asic_type']))
51-
click.echo("ASIC Count: {}".format(hw_info_dict['asic_count']))
56+
click.echo("Platform: {}".format(platform_info['platform']))
57+
click.echo("HwSKU: {}".format(platform_info['hwsku']))
58+
click.echo("ASIC: {}".format(platform_info['asic_type']))
59+
click.echo("ASIC Count: {}".format(platform_info['asic_count']))
60+
click.echo("Serial Number: {}".format(chassis_info['serial']))
61+
click.echo("Model Number: {}".format(chassis_info['model']))
62+
click.echo("Hardware Revision: {}".format(chassis_info['revision']))
5263

5364

5465
# 'syseeprom' subcommand ("show platform syseeprom")

tests/show_platform_test.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,29 @@ class TestShowPlatform(object):
2626
TEST_PLATFORM = "x86_64-mlnx_msn2700-r0"
2727
TEST_HWSKU = "Mellanox-SN2700"
2828
TEST_ASIC_TYPE = "mellanox"
29+
TEST_ASIC_COUNT = 1
30+
TEST_SERIAL = "MT1822K07815"
31+
TEST_MODEL = "MSN2700-CS2FO"
32+
TEST_REV = "A1"
2933

3034
# Test 'show platform summary'
3135
def test_summary(self):
3236
expected_output = """\
3337
Platform: {}
3438
HwSKU: {}
3539
ASIC: {}
36-
""".format(self.TEST_PLATFORM, self.TEST_HWSKU, self.TEST_ASIC_TYPE)
37-
38-
with mock.patch("show.platform.get_hw_info_dict",
39-
return_value={"platform": self.TEST_PLATFORM, "hwsku": self.TEST_HWSKU, "asic_type": self.TEST_ASIC_TYPE}):
40-
result = CliRunner().invoke(show.cli.commands["platform"].commands["summary"], [])
41-
assert result.output == textwrap.dedent(expected_output)
40+
ASIC Count: {}
41+
Serial Number: {}
42+
Model Number: {}
43+
Hardware Revision: {}
44+
""".format(self.TEST_PLATFORM, self.TEST_HWSKU, self.TEST_ASIC_TYPE, self.TEST_ASIC_COUNT, self.TEST_SERIAL, self.TEST_MODEL, self.TEST_REV)
45+
46+
with mock.patch("sonic_py_common.device_info.get_platform_info",
47+
return_value={"platform": self.TEST_PLATFORM, "hwsku": self.TEST_HWSKU, "asic_type": self.TEST_ASIC_TYPE, "asic_count": self.TEST_ASIC_COUNT}):
48+
with mock.patch("show.platform.get_chassis_info",
49+
return_value={"serial": self.TEST_SERIAL, "model": self.TEST_MODEL, "revision": self.TEST_REV}):
50+
result = CliRunner().invoke(show.cli.commands["platform"].commands["summary"], [])
51+
assert result.output == textwrap.dedent(expected_output)
4252

4353

4454
class TestShowPlatformPsu(object):

0 commit comments

Comments
 (0)