Skip to content

Commit ede7095

Browse files
committed
Merge branch 'master' into master_dhcp_server_syslog
2 parents 1e610c9 + 1fba66c commit ede7095

8 files changed

Lines changed: 94 additions & 13 deletions

File tree

platform/broadcom/sai.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
LIBSAIBCM_XGS_VERSION = 10.1.7.0
1+
LIBSAIBCM_XGS_VERSION = 10.1.21.0
22
LIBSAIBCM_DNX_VERSION = 10.1.21.0
33
LIBSAIBCM_XGS_BRANCH_NAME = SAI_10.1.0_GA
44
LIBSAIBCM_DNX_BRANCH_NAME = SAI_10.1.21.1

src/system-health/health_checker/service_checker.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,19 @@
1515
EVENTS_PUBLISHER_SOURCE = "sonic-events-host"
1616
EVENTS_PUBLISHER_TAG = "process-not-running"
1717

18+
def check_docker_image(image_name):
19+
"""
20+
@summary: This function will check if docker image exists.
21+
@return: True if the image exists, otherwise False.
22+
"""
23+
try:
24+
DOCKER_CLIENT = docker.DockerClient(base_url='unix://var/run/docker.sock')
25+
DOCKER_CLIENT.images.get(image_name)
26+
return True
27+
except (docker.errors.ImageNotFound, docker.errors.APIError) as err:
28+
logger.log_warning("Failed to get image '{}'. Error: '{}'".format(image_name, err))
29+
return False
30+
1831
class ServiceChecker(HealthChecker):
1932
"""
2033
Checker that checks critical system service status via monit service.
@@ -84,21 +97,39 @@ def get_expected_running_containers(self, feature_table):
8497
# it will be removed from exception list.
8598
run_all_instance_list = ['database', 'bgp']
8699

87-
for feature_name, feature_entry in feature_table.items():
100+
container_list = []
101+
for container_name in feature_table.keys():
102+
# slim image does not have telemetry container and corresponding docker image
103+
if container_name == "telemetry":
104+
ret = check_docker_image("docker-sonic-telemetry")
105+
if not ret:
106+
# If telemetry container image is not present, check gnmi container image
107+
# If gnmi container image is not present, ignore telemetry container check
108+
# if gnmi container image is present, check gnmi container instead of telemetry
109+
ret = check_docker_image("docker-sonic-gnmi")
110+
if not ret:
111+
logger.log_debug("Ignoring telemetry container check on image which has no corresponding docker image")
112+
else:
113+
container_list.append("gnmi")
114+
continue
115+
container_list.append(container_name)
116+
117+
for container_name in container_list:
118+
feature_entry = feature_table[container_name]
88119
if feature_entry["state"] not in ["disabled", "always_disabled"]:
89120
if multi_asic.is_multi_asic():
90121
if feature_entry.get("has_global_scope", "True") == "True":
91-
expected_running_containers.add(feature_name)
92-
container_feature_dict[feature_name] = feature_name
122+
expected_running_containers.add(container_name)
123+
container_feature_dict[container_name] = container_name
93124
if feature_entry.get("has_per_asic_scope", "False") == "True":
94125
num_asics = multi_asic.get_num_asics()
95126
for asic_id in range(num_asics):
96-
if asic_id in asics_id_presence or feature_name in run_all_instance_list:
97-
expected_running_containers.add(feature_name + str(asic_id))
98-
container_feature_dict[feature_name + str(asic_id)] = feature_name
127+
if asic_id in asics_id_presence or container_name in run_all_instance_list:
128+
expected_running_containers.add(container_name + str(asic_id))
129+
container_feature_dict[container_name + str(asic_id)] = container_name
99130
else:
100-
expected_running_containers.add(feature_name)
101-
container_feature_dict[feature_name] = feature_name
131+
expected_running_containers.add(container_name)
132+
container_feature_dict[container_name] = container_name
102133

103134
if device_info.is_supervisor():
104135
expected_running_containers.add("database-chassis")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
program:gnmi-native

src/system-health/tests/test_system_health.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import copy
1313
import os
1414
import sys
15+
import docker
1516
from imp import load_source
1617
from swsscommon import swsscommon
1718

@@ -23,6 +24,7 @@
2324
swsscommon.SonicV2Connector = MockConnector
2425

2526
test_path = os.path.dirname(os.path.abspath(__file__))
27+
telemetry_path = os.path.join(test_path, 'telemetry')
2628
modules_path = os.path.dirname(test_path)
2729
scripts_path = os.path.join(modules_path, 'scripts')
2830
sys.path.insert(0, modules_path)
@@ -166,6 +168,53 @@ def test_service_checker_single_asic(mock_config_db, mock_run, mock_docker_clien
166168
assert origin_container_critical_processes == checker.container_critical_processes
167169

168170

171+
@patch('swsscommon.swsscommon.ConfigDBConnector.connect', MagicMock())
172+
@patch('health_checker.service_checker.ServiceChecker._get_container_folder', MagicMock(return_value=telemetry_path))
173+
@patch('sonic_py_common.multi_asic.is_multi_asic', MagicMock(return_value=False))
174+
@patch('docker.DockerClient')
175+
@patch('health_checker.utils.run_command')
176+
@patch('swsscommon.swsscommon.ConfigDBConnector')
177+
def test_service_checker_telemetry(mock_config_db, mock_run, mock_docker_client):
178+
setup()
179+
mock_db_data = MagicMock()
180+
mock_get_table = MagicMock()
181+
mock_db_data.get_table = mock_get_table
182+
mock_config_db.return_value = mock_db_data
183+
mock_get_table.return_value = {
184+
'gnmi': {
185+
'state': 'enabled',
186+
'has_global_scope': 'True',
187+
'has_per_asic_scope': 'False',
188+
189+
},
190+
'telemetry': {
191+
'state': 'enabled',
192+
'has_global_scope': 'True',
193+
'has_per_asic_scope': 'False',
194+
195+
}
196+
}
197+
mock_containers = MagicMock()
198+
mock_gnmi_container = MagicMock()
199+
mock_gnmi_container.name = 'gnmi'
200+
mock_containers.list = MagicMock(return_value=[mock_gnmi_container])
201+
mock_docker_client_object = MagicMock()
202+
mock_docker_client.return_value = mock_docker_client_object
203+
mock_docker_client_object.containers = mock_containers
204+
mock_docker_client_object.images = MagicMock()
205+
mock_docker_client_object.images.get = MagicMock()
206+
except_err = docker.errors.ImageNotFound("Unit test")
207+
mock_docker_client_object.images.get.side_effect = [except_err, None]
208+
209+
mock_run.return_value = "gnmi-native RUNNING pid 67, uptime 1:03:56"
210+
211+
checker = ServiceChecker()
212+
assert checker.get_category() == 'Services'
213+
config = Config()
214+
checker.check(config)
215+
assert 'gnmi:gnmi-native' in checker._info
216+
assert checker._info['gnmi:gnmi-native'][HealthChecker.INFO_FIELD_OBJECT_STATUS] == HealthChecker.STATUS_OK
217+
169218

170219
@patch('swsscommon.swsscommon.ConfigDBConnector.connect', MagicMock())
171220
@patch('health_checker.service_checker.ServiceChecker._get_container_folder', MagicMock(return_value=test_path))

0 commit comments

Comments
 (0)