mgr/dashboard: Device health status is not getting listed under hosts section

Device health is shown as failed to retrieve data under Hosts > Device Health section. This PR intends to fix this issue.

Fixes: https://tracker.ceph.com/issues/49354
Signed-off-by: Aashish Sharma <aasharma@redhat.com>
This commit is contained in:
Aashish Sharma 2021-03-11 11:36:22 +05:30
parent 762b27af2c
commit 8f4574696c
2 changed files with 34 additions and 6 deletions

View File

@ -225,12 +225,20 @@ class CephService(object):
for daemon in daemons:
svc_type, svc_id = daemon.split('.')
try:
dev_smart_data = CephService.send_command(
svc_type, 'smart', svc_id, devid=device['devid'])
except SendCommandError:
# Try to retrieve SMART data from another daemon.
continue
if 'osd' in svc_type:
try:
dev_smart_data = CephService.send_command(
svc_type, 'smart', svc_id, devid=device['devid'])
except SendCommandError:
# Try to retrieve SMART data from another daemon.
continue
else:
try:
dev_smart_data = CephService.send_command(
svc_type, 'device get-health-metrics', svc_id, devid=device['devid'])
except SendCommandError:
# Try to retrieve SMART data from another daemon.
continue
for dev_id, dev_data in dev_smart_data.items():
if 'error' in dev_data:
logger.warning(

View File

@ -107,3 +107,23 @@ def test_get_smart_data(caplog, by, args, log):
CephService._get_smart_data_by_device.assert_not_called()
assert smart_data == {}
assert log in caplog.text
@mock.patch.object(CephService, 'send_command')
def test_get_smart_data_from_appropriate_ceph_command(send_command):
# pylint: disable=protected-access
send_command.side_effect = [
{'nodes': [{'name': 'osd.1', 'status': 'up'}, {'name': 'mon.1', 'status': 'down'}]},
{'fake': {'device': {'name': '/dev/sda'}}}
]
CephService._get_smart_data_by_device({'devid': '1', 'daemons': ['osd.1', 'mon.1']})
send_command.assert_has_calls([mock.call('mon', 'osd tree'),
mock.call('osd', 'smart', '1', devid='1')])
send_command.side_effect = [
{'nodes': [{'name': 'osd.1', 'status': 'down'}, {'name': 'mon.1', 'status': 'up'}]},
{'fake': {'device': {'name': '/dev/sda'}}}
]
CephService._get_smart_data_by_device({'devid': '1', 'daemons': ['osd.1', 'mon.1']})
send_command.assert_has_calls([mock.call('mon', 'osd tree'),
mock.call('mon', 'device get-health-metrics', '1', devid='1')])