From 382666c33f3abb8d916f5868b789110013a77047 Mon Sep 17 00:00:00 2001 From: Sonic Build Admin Date: Wed, 1 Jul 2026 04:26:09 +0000 Subject: [PATCH] [BMC] Align get_presence for the new infra #### Description - Updated `sonic_platform_base/bmc_base.py` to check: - `device_info.is_switch_host()` - `device_info.get_bmc_data()` - Removed the older `bmc_addr`-only presence condition. - Updated `tests/bmc_base_test.py` to match the new behavior: - present on Switch-Host with bmc data - not present when bmc data is missing - not present on non-host even if bmc data exists #### Motivation and Context `BMCBase.get_presence()` was aligned with the new host/BMC split (https://github.com/sonic-net/sonic-buildimage/pull/26544) so BMC presence is reported only for Switch-Host platforms with runtime BMC data. This avoids treating Switch-BMC side execution as BMC-present for host-only logic. #### How Has This Been Tested? - Run unit tests: - `pytest tests/bmc_base_test.py` - Validate platform API behavior manually: - `bmc.get_presence()` returns `True` only on Switch-Host with valid `/etc/sonic/bmc.json` - returns `False` on Switch-BMC side or when BMC data is unavailable Signed-off-by: Sonic Build Admin #### Additional Information (Optional) --- sonic_platform_base/bmc_base.py | 3 +-- tests/bmc_base_test.py | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/sonic_platform_base/bmc_base.py b/sonic_platform_base/bmc_base.py index 18f193a..fa7602e 100644 --- a/sonic_platform_base/bmc_base.py +++ b/sonic_platform_base/bmc_base.py @@ -268,8 +268,7 @@ def get_presence(self): A boolean indicating whether the BMC device is present """ from sonic_py_common import device_info - bmc_data = device_info.get_bmc_data() - if bmc_data and bmc_data.get('bmc_addr'): + if device_info.is_switch_host() and device_info.get_bmc_data(): return True return False diff --git a/tests/bmc_base_test.py b/tests/bmc_base_test.py index 7b27060..f3b6a3d 100644 --- a/tests/bmc_base_test.py +++ b/tests/bmc_base_test.py @@ -53,17 +53,28 @@ def test_get_name(self): bmc = BMCBase('169.254.0.1') assert bmc.get_name() == BMCBase.BMC_NAME - def test_get_presence_true(self): - """Test get_presence returns True when BMC data is present""" - with mock.patch('sonic_py_common.device_info.get_bmc_data', create=True, return_value={'bmc_addr': '169.254.0.1'}): - bmc = BMCBase('169.254.0.1') - assert bmc.get_presence() == True + @mock.patch('sonic_py_common.device_info.is_switch_host', create=True, return_value=True) + @mock.patch('sonic_py_common.device_info.get_bmc_data', create=True, + return_value={'bmc_addr': '169.254.0.1'}) + def test_get_presence_true(self, _mock_get_bmc_data, _mock_is_switch_host): + """Test get_presence returns True on Switch-Host when bmc.json data exists""" + bmc = BMCBase('169.254.0.1') + assert bmc.get_presence() is True - def test_get_presence_false(self): - """Test get_presence returns False when BMC data is not present""" - with mock.patch('sonic_py_common.device_info.get_bmc_data', create=True, return_value=None): - bmc = BMCBase('169.254.0.1') - assert bmc.get_presence() == False + @mock.patch('sonic_py_common.device_info.is_switch_host', create=True, return_value=True) + @mock.patch('sonic_py_common.device_info.get_bmc_data', create=True, return_value=None) + def test_get_presence_false_no_bmc_data(self, _mock_get_bmc_data, _mock_is_switch_host): + """Test get_presence returns False when /etc/sonic/bmc.json is unavailable""" + bmc = BMCBase('169.254.0.1') + assert bmc.get_presence() is False + + @mock.patch('sonic_py_common.device_info.is_switch_host', create=True, return_value=False) + @mock.patch('sonic_py_common.device_info.get_bmc_data', create=True, + return_value={'bmc_addr': '169.254.0.1'}) + def test_get_presence_false_not_switch_host(self, _mock_get_bmc_data, _mock_is_switch_host): + """Test get_presence returns False on Switch-BMC even if bmc.json data exists""" + bmc = BMCBase('169.254.0.1') + assert bmc.get_presence() is False def test_is_replaceable(self): """Test is_replaceable returns False"""