]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Device health status is not getting listed under hosts section 40495/head
authorAashish Sharma <aashishsharma@localhost.localdomain>
Thu, 11 Mar 2021 06:06:22 +0000 (11:36 +0530)
committerAashish Sharma <aashishsharma@localhost.localdomain>
Thu, 22 Apr 2021 08:12:45 +0000 (13:42 +0530)
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>
(cherry picked from commit 8f4574696c5272de4be6cbcbd3a8fc713d6b604e)

src/pybind/mgr/dashboard/services/ceph_service.py
src/pybind/mgr/dashboard/tests/test_ceph_service.py

index ea794a4474eff1d9234e2d3724ef4d1330077b10..d2715c59439aef2356a1babf18fbfabeb72a23d4 100644 (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(
index 3b2aa8b1332343fbf9e149c9cea58476065f91db..fa6e8f04995bb591a74584fc0aa84f74574245a8 100644 (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')])