]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: do not recommend throughput for ssd's only cluster
authorNizamudeen A <nia@redhat.com>
Mon, 18 Jul 2022 05:38:28 +0000 (11:08 +0530)
committerKen Dreyer <kdreyer@redhat.com>
Mon, 1 Aug 2022 20:29:34 +0000 (20:29 +0000)
This is just a bug fix where we recommend the throughput option even if
there are only ssd's are present in the cluster.

Resolves: rhbz#2101680

Fixes: https://tracker.ceph.com/issues/56413
Signed-off-by: Nizamudeen A <nia@redhat.com>
(cherry picked from commit 0f6f79f1d9c716e13f662151459fa107f651f158)
(cherry picked from commit dc81fcd37c63c7916fc0f2f8109c022cd560e989)

src/pybind/mgr/dashboard/controllers/osd.py
src/pybind/mgr/dashboard/tests/test_osd.py

index df3eb2f88a13c7615622a4638c4fb10d071cc030..9c903ed672eec997627e79952fcbe169cb8f0634 100644 (file)
@@ -505,16 +505,17 @@ class OsdUi(Osd):
                 if device.available:
                     if device.human_readable_type == 'hdd':
                         hdds += 1
+                    # SSDs and NVMe are both counted as 'ssd'
+                    # so differentiating nvme using its path
+                    elif '/dev/nvme' in device.path:
+                        nvmes += 1
                     else:
                         ssds += 1
-                        # we still don't know how to infer nvmes
-                        # Tracker: https://tracker.ceph.com/issues/55728
-                        nvmes += 1
 
         if hdds:
             res.options[OsdDeploymentOptions.COST_CAPACITY].available = True
             res.recommended_option = OsdDeploymentOptions.COST_CAPACITY
-        if ssds:
+        if hdds and ssds:
             res.options[OsdDeploymentOptions.THROUGHPUT].available = True
             res.recommended_option = OsdDeploymentOptions.THROUGHPUT
         if nvmes:
index 9f83fa74b37cbbd6c0d2aa265dfd8454e50fe4bf..144a98e49af4634c57c209a5c82def46ba3e1807 100644 (file)
@@ -431,8 +431,8 @@ class OsdTest(ControllerTestCase):
 
         res = self._get_deployment_options(fake_client, devices_data)
         self.assertFalse(res['options'][OsdDeploymentOptions.COST_CAPACITY]['available'])
-        self.assertTrue(res['options'][OsdDeploymentOptions.THROUGHPUT]['available'])
-        self.assertEqual(res['recommended_option'], 'throughput_optimized')
+        self.assertFalse(res['options'][OsdDeploymentOptions.THROUGHPUT]['available'])
+        self.assertEqual(res['recommended_option'], None)
 
     @mock.patch('dashboard.controllers.orchestrator.OrchClient.instance')
     def test_deployment_options_throughput(self, instance):
@@ -451,5 +451,42 @@ class OsdTest(ControllerTestCase):
         res = self._get_deployment_options(fake_client, devices_data)
         self.assertTrue(res['options'][OsdDeploymentOptions.COST_CAPACITY]['available'])
         self.assertTrue(res['options'][OsdDeploymentOptions.THROUGHPUT]['available'])
-        self.assertTrue(res['options'][OsdDeploymentOptions.IOPS]['available'])
+        self.assertFalse(res['options'][OsdDeploymentOptions.IOPS]['available'])
         assert res['recommended_option'] == OsdDeploymentOptions.THROUGHPUT
+
+    @mock.patch('dashboard.controllers.orchestrator.OrchClient.instance')
+    def test_deployment_options_with_hdds_and_nvmes(self, instance):
+        fake_client = mock.Mock()
+        instance.return_value = fake_client
+        fake_client.get_missing_features.return_value = []
+
+        devices_data = [
+            {'type': 'ssd', 'path': '/dev/nvme01', 'host': 'host1'},
+            {'type': 'ssd', 'path': '/dev/nvme02', 'host': 'host1'},
+            {'type': 'ssd', 'path': '/dev/nvme03', 'host': 'host2'},
+            {'type': 'hdd', 'path': '/dev/sde', 'host': 'host1'},
+            {'type': 'hdd', 'path': '/dev/sdd', 'host': 'host2'},
+        ]
+
+        res = self._get_deployment_options(fake_client, devices_data)
+        self.assertTrue(res['options'][OsdDeploymentOptions.COST_CAPACITY]['available'])
+        self.assertFalse(res['options'][OsdDeploymentOptions.THROUGHPUT]['available'])
+        self.assertTrue(res['options'][OsdDeploymentOptions.IOPS]['available'])
+        assert res['recommended_option'] == OsdDeploymentOptions.COST_CAPACITY
+
+    @mock.patch('dashboard.controllers.orchestrator.OrchClient.instance')
+    def test_deployment_options_iops(self, instance):
+        fake_client = mock.Mock()
+        instance.return_value = fake_client
+        fake_client.get_missing_features.return_value = []
+
+        devices_data = [
+            {'type': 'ssd', 'path': '/dev/nvme01', 'host': 'host1'},
+            {'type': 'ssd', 'path': '/dev/nvme02', 'host': 'host1'},
+            {'type': 'ssd', 'path': '/dev/nvme03', 'host': 'host2'}
+        ]
+
+        res = self._get_deployment_options(fake_client, devices_data)
+        self.assertFalse(res['options'][OsdDeploymentOptions.COST_CAPACITY]['available'])
+        self.assertFalse(res['options'][OsdDeploymentOptions.THROUGHPUT]['available'])
+        self.assertTrue(res['options'][OsdDeploymentOptions.IOPS]['available'])