]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: add restful api for creating crush rule with type of 'erasure' 58224/head
authorsunlan <sunlan@asiainfo.com>
Mon, 24 Jun 2024 08:29:38 +0000 (16:29 +0800)
committersunlan <sunlan@asiainfo.com>
Wed, 10 Jul 2024 06:44:07 +0000 (14:44 +0800)
Fixes: https://tracker.ceph.com/issues/66490
Signed-off-by: sunlan <sunlan@asiainfo.com>
qa/tasks/mgr/dashboard/test_crush_rule.py
src/pybind/mgr/dashboard/controllers/crush_rule.py
src/pybind/mgr/dashboard/openapi.yaml

index aa2250b1d2a2eb3768924c575cc9d2288724c1fb..d5230f0d098919da06a6577cf3c53d22480b1890 100644 (file)
@@ -82,3 +82,16 @@ class CrushRuleTest(DashboardTestCase):
             'nodes': JList(JObj({}, allow_unknown=True)),
             'roots': JList(int)
         }))
+
+    @DashboardTestCase.RunAs('test', 'test', ['pool-manager', 'cluster-manager'])
+    def test_create_erasure_with_ssd(self):
+        data = self._get('/api/osd/0')
+        self.assertStatus(200)
+        device_class = data['osd_metadata']['default_device_class']
+        self.create_and_delete_rule({
+            'pool_type': 'erasure',
+            'name': 'some_erasure_crush_rule',
+            'profile': 'default',
+            'failure_domain': 'osd',
+            'device_class': device_class
+        })
index 250f657b2bae691622a84a6a2c0025525c813d52..dd0ab91ba4d3515746033cbc08855156e7f7a351 100644 (file)
@@ -38,14 +38,24 @@ class CrushRule(RESTController):
                 return r
         raise NotFound('No such crush rule')
 
-    def create(self, name, root, failure_domain, device_class=None):
-        rule = {
-            'name': name,
-            'root': root,
-            'type': failure_domain,
-            'class': device_class
-        }
-        CephService.send_command('mon', 'osd crush rule create-replicated', **rule)
+    def create(self, name, failure_domain, device_class=None, root=None, profile=None,
+               pool_type='replication'):
+        if pool_type == 'erasure':
+            rule = {
+                'name': name,
+                'profile': profile,
+                'type': failure_domain,
+                'class': device_class
+            }
+            CephService.send_command('mon', 'osd crush rule create-erasure', **rule)
+        else:
+            rule = {
+                'name': name,
+                'root': root,
+                'type': failure_domain,
+                'class': device_class
+            }
+            CephService.send_command('mon', 'osd crush rule create-replicated', **rule)
 
     def delete(self, name):
         CephService.send_command('mon', 'osd crush rule rm', name=name)
index beb4216015ed4c0963ed84ae16cb51a9cdb8de08..5f472024074e1399ac7829d9fbb1a0d22e9e23e5 100644 (file)
@@ -4206,11 +4206,15 @@ paths:
                   type: string
                 name:
                   type: string
+                pool_type:
+                  default: replication
+                  type: string
+                profile:
+                  type: string
                 root:
                   type: string
               required:
               - name
-              - root
               - failure_domain
               type: object
       responses: