diff --git a/src/system-health/health_checker/sysmonitor.py b/src/system-health/health_checker/sysmonitor.py index 8979327eaf9..7a42768c3f9 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('.') # stop on service maybe propagated to timers and in that case, # the state_db entry for the service should not be deleted diff --git a/src/system-health/tests/mock_connector.py b/src/system-health/tests/mock_connector.py index 76ed01d2b9b..d6efdf62065 100644 --- a/src/system-health/tests/mock_connector.py +++ b/src/system-health/tests/mock_connector.py @@ -22,11 +22,14 @@ 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] = {} self.data[key][field] = value - + def hmset(self, db_id, key, fieldsvalues): self.data[key] = {} for field,value in fieldsvalues.items(): diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index 034106fd188..cb3ce6ca092 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -654,6 +654,31 @@ 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.get_all_service_list', MagicMock(return_value=['mock_snmp.service'])) def test_check_unit_status_timer(): sysmon = Sysmonitor()