From 0e24f56a8c6d655393bb90194cecf894022790a0 Mon Sep 17 00:00:00 2001 From: "david.zagury" Date: Thu, 20 Apr 2023 20:34:47 +0300 Subject: [PATCH 1/3] [system-health] When disabling a feature the SYSTEM_READY|SYSTEM_STATE was not updated --- src/system-health/health_checker/sysmonitor.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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) From aea4d55b8083a96ca7d15d80ce8c3404899095cc Mon Sep 17 00:00:00 2001 From: "david.zagury" Date: Sun, 23 Apr 2023 15:41:38 +0000 Subject: [PATCH 2/3] Add unit test --- src/system-health/tests/mock_connector.py | 3 +++ src/system-health/tests/test_system_health.py | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+) 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..bd0c9a06ce9 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()) +def test_check_unit_status2(): + sysmon = Sysmonitor() + sysmon.publish_system_status('UP') + + sysmon.check_unit_status('mock_bgp.service') + assert 'mock_bgp.service' in sysmon.dnsrvs_name + print(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 + print(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','-','-'))) From 2ad7731c1d61db212dc913eeba31b94c1ecca43c Mon Sep 17 00:00:00 2001 From: "david.zagury" Date: Tue, 25 Apr 2023 11:38:22 +0300 Subject: [PATCH 3/3] Fix unit test --- src/system-health/tests/test_system_health.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/system-health/tests/test_system_health.py b/src/system-health/tests/test_system_health.py index bd0c9a06ce9..a3c7c846093 100644 --- a/src/system-health/tests/test_system_health.py +++ b/src/system-health/tests/test_system_health.py @@ -661,20 +661,19 @@ def test_check_unit_status(): @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()) -def test_check_unit_status2(): +@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 - print(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 - print(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"