diff --git a/src/system-health/health_checker/sysmonitor.py b/src/system-health/health_checker/sysmonitor.py index b3f43e447f7..6be3f347f87 100755 --- a/src/system-health/health_checker/sysmonitor.py +++ b/src/system-health/health_checker/sysmonitor.py @@ -405,7 +405,13 @@ def check_unit_status(self, event): #then it should be removed from STATE_DB & set if event in self.dnsrvs_name: self.dnsrvs_name.remove(event) - + + if len(self.dnsrvs_name) == 0: + astate = "UP" + else: + astate = "DOWN" + self.publish_system_status(astate) + srv_name,last = event.split('.') key = 'ALL_SERVICE_STATUS|{}'.format(srv_name) key_exists = self.state_db.exists(self.state_db.STATE_DB, key) diff --git a/src/system-health/tests/mock_connector.py b/src/system-health/tests/mock_connector.py index d602c8eaf16..490d40da63c 100644 --- a/src/system-health/tests/mock_connector.py +++ b/src/system-health/tests/mock_connector.py @@ -22,6 +22,9 @@ def keys(self, db_id, pattern): def get_all(self, db_id, key): return MockConnector.data[key] + + def exists(self, db_id, key): + return key in MockConnector.data def set(self, db_id, key, field, value): self.data[key] = {} diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index 6793a116cad..a3c7c846093 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -654,6 +654,30 @@ def test_check_unit_status(): assert 'mock_bgp.service' in sysmon.dnsrvs_name +@patch('health_checker.sysmonitor.Sysmonitor.get_all_service_list', MagicMock(side_effect=[ + ['mock_snmp.service', 'mock_bgp.service', 'mock_ns.service'], + ['mock_snmp.service', 'mock_ns.service'] +])) +@patch('health_checker.sysmonitor.Sysmonitor.run_systemctl_show', MagicMock(return_value=mock_srv_props['mock_bgp.service'])) +@patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value=('Down','-','-'))) +@patch('health_checker.sysmonitor.Sysmonitor.post_unit_status', MagicMock()) +@patch('health_checker.sysmonitor.Sysmonitor.print_console_message', MagicMock()) +def test_system_status_up_after_service_removed(): + sysmon = Sysmonitor() + sysmon.publish_system_status('UP') + + sysmon.check_unit_status('mock_bgp.service') + assert 'mock_bgp.service' in sysmon.dnsrvs_name + result = swsscommon.SonicV2Connector.get(MockConnector, 0, "SYSTEM_READY|SYSTEM_STATE", 'Status') + print("system status result before service was removed from system: {}".format(result)) + assert result == "DOWN" + + sysmon.check_unit_status('mock_bgp.service') + assert 'mock_bgp.service' not in sysmon.dnsrvs_name + result = swsscommon.SonicV2Connector.get(MockConnector, 0, "SYSTEM_READY|SYSTEM_STATE", 'Status') + print("system status result after service was removed from system: {}".format(result)) + assert result == "UP" + @patch('health_checker.sysmonitor.Sysmonitor.run_systemctl_show', MagicMock(return_value=mock_srv_props['mock_radv.service'])) @patch('health_checker.sysmonitor.Sysmonitor.get_app_ready_status', MagicMock(return_value=('Up','-','-')))