Skip to content

Commit 5dfd11e

Browse files
authored
Fix 'show version' KeyError when sonic_version.yml has missing fields (#4324)
'show version' crashes with KeyError when debian_version or kernel_version are missing from sonic_version.yml. This happens in docker-sonic-vs containers where the version file is generated without these fields (they are only set during full image builds). Use .get() with sensible runtime fallbacks: - debian_version: 'N/A' (not available in container context) - kernel_version: os.uname().release (actual host kernel at runtime) - build_version: 'N/A' - sonic_os_version: 'N/A' Fixes sonic-net/sonic-buildimage#25765 Signed-off-by: securely1g <securely1g@users.noreply.github.com>
1 parent 4c77f9d commit 5dfd11e

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

show/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,10 +1695,10 @@ def version(verbose):
16951695

16961696
sys_date = datetime.now()
16971697

1698-
click.echo("\nSONiC Software Version: SONiC.{}".format(version_info['build_version']))
1699-
click.echo("SONiC OS Version: {}".format(version_info['sonic_os_version']))
1700-
click.echo("Distribution: Debian {}".format(version_info['debian_version']))
1701-
click.echo("Kernel: {}".format(version_info['kernel_version']))
1698+
click.echo("\nSONiC Software Version: SONiC.{}".format(version_info.get('build_version', 'N/A')))
1699+
click.echo("SONiC OS Version: {}".format(version_info.get('sonic_os_version', 'N/A')))
1700+
click.echo("Distribution: Debian {}".format(version_info.get('debian_version', 'N/A')))
1701+
click.echo("Kernel: {}".format(version_info.get('kernel_version', os.uname().release)))
17021702
click.echo("Build commit: {}".format(version_info['commit_id']))
17031703
click.echo("Build date: {}".format(version_info['build_date']))
17041704
click.echo("Built by: {}".format(version_info['built_by']))

tests/show_test.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,36 @@ def test_show_version():
249249
result = runner.invoke(show.cli.commands["version"])
250250
assert "SONiC OS Version: 11" in result.output
251251

252+
253+
@patch('sonic_py_common.device_info.get_sonic_version_info', MagicMock(return_value={
254+
"build_version": "",
255+
"commit_id": "46415d112",
256+
"build_date": "Mon Mar 2 03:02:39 UTC 2026",
257+
"built_by": "test@host",
258+
"sonic_os_version": "13"}))
259+
@patch('sonic_py_common.device_info.get_platform_info', MagicMock(return_value={
260+
"platform": "x86_64-kvm_x86_64-r0",
261+
"hwsku": "Force10-S6000",
262+
"asic_type": "vs",
263+
"asic_count": 1}))
264+
@patch('sonic_py_common.device_info.get_chassis_info', MagicMock(return_value={
265+
"serial": "N/A",
266+
"model": "N/A",
267+
"revision": "N/A"}))
268+
@patch('subprocess.Popen', MagicMock(side_effect=side_effect_subprocess_popen))
269+
def test_show_version_missing_fields():
270+
"""Test show version doesn't crash when debian_version and kernel_version are missing.
271+
272+
docker-sonic-vs containers may not have these fields in sonic_version.yml
273+
since they are only populated during full image builds.
274+
"""
275+
runner = CliRunner()
276+
result = runner.invoke(show.cli.commands["version"])
277+
assert result.exit_code == 0, "show version crashed: {}".format(result.output)
278+
assert "Distribution: Debian N/A" in result.output
279+
assert "Kernel:" in result.output
280+
assert "Build commit: 46415d112" in result.output
281+
252282
class TestShowAcl(object):
253283
def setup(self):
254284
print('SETUP')

0 commit comments

Comments
 (0)