]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/vol: allow passing pool names to "fs volume create" cmd
authorRishabh Dave <ridave@redhat.com>
Sat, 8 Feb 2025 14:30:37 +0000 (20:00 +0530)
committerRishabh Dave <ridave@redhat.com>
Wed, 19 Mar 2025 10:56:05 +0000 (16:26 +0530)
Fixes: https://tracker.ceph.com/issues/69878
Signed-off-by: Rishabh Dave <ridave@redhat.com>
src/pybind/mgr/volumes/fs/operations/volume.py
src/pybind/mgr/volumes/fs/volume.py
src/pybind/mgr/volumes/module.py

index 93844bce119c99e149a15cf2089b804fa3d155c2..8c031c498ff33def8107cfbf7c6c59e0dec68a06 100644 (file)
@@ -72,22 +72,57 @@ def get_pool_ids(mgr, volname):
         return None, None
     return metadata_pool_id, data_pool_ids
 
-def create_volume(mgr, volname, placement):
-    """
-    create volume  (pool, filesystem and mds)
-    """
+def create_fs_pools(mgr, volname, data_pool, metadata_pool):
+    '''
+    Generate names of metadata pool and data pool and create these pools.
+
+    This methods returns a list where the first member represents whether or
+    not this method ran successfullly.
+    '''
+    assert not data_pool and not metadata_pool
+
     metadata_pool, data_pool = gen_pool_names(volname)
-    # create pools
+
     r, outb, outs = create_pool(mgr, metadata_pool)
     if r != 0:
-        return r, outb, outs
+        return [False, r, outb, outs]
+
     # default to a bulk pool for data. In case autoscaling has been disabled
-    # for the cluster with `ceph osd pool set noautoscale`, this will have no effect.
+    # for the cluster with `ceph osd pool set noautoscale`, this will have
+    # no effect.
     r, outb, outs = create_pool(mgr, data_pool, bulk=True)
+    # cleanup
     if r != 0:
-        #cleanup
         remove_pool(mgr, metadata_pool)
-        return r, outb, outs
+        return [False, r, outb, outs]
+
+    return [True, data_pool, metadata_pool]
+
+def create_volume(mgr, volname, placement, data_pool, metadata_pool):
+    """
+    Create volume, create pools if pool names are not passed and create MDS
+    based on placement passed.
+    """
+    # although writing this case is technically redundant (because pool names
+    # are passed by user they must exist already), leave it here so that some
+    # future readers know that this case is already considered and not missed
+    # by chance.
+    if data_pool and metadata_pool:
+        pass
+    elif not data_pool and metadata_pool:
+        errmsg = 'data pool name isn\'t passed'
+        return -errno.EINVAL, '', errmsg
+    elif data_pool and not metadata_pool:
+        errmsg = 'metadata pool name isn\'t passed'
+        return -errno.EINVAL, '', errmsg
+    elif not data_pool and not metadata_pool:
+        retval = create_fs_pools(mgr, volname, data_pool, metadata_pool)
+        success = retval.pop(0)
+        if success:
+            data_pool, metadata_pool = retval
+        else:
+            return retval
+
     # create filesystem
     r, outb, outs = create_filesystem(mgr, volname, metadata_pool, data_pool)
     if r != 0:
index af3fa29a40f490f14998296bcb3aa6c558d19b07..b2e5d762af1814ff1e5e18a97fd53980fdcd15f2 100644 (file)
@@ -120,8 +120,8 @@ class VolumeClient(CephfsClient["Module"]):
 
     ### volume operations -- create, rm, ls
 
-    def create_fs_volume(self, volname, placement):
-        return create_volume(self.mgr, volname, placement)
+    def create_fs_volume(self, volname, placement, data_pool, meta_pool):
+        return create_volume(self.mgr, volname, placement, data_pool, meta_pool)
 
     def delete_fs_volume(self, volname, confirm):
         if confirm != "--yes-i-really-mean-it":
index 5de0e28fd42cd094971012942878b58a8631228b..622aef8362e33d34232cfe033ec7e79e960a8a1d 100644 (file)
@@ -49,7 +49,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
         {
             'cmd': 'fs volume create '
                    f'name=name,type=CephString,goodchars={goodchars} '
-                   'name=placement,type=CephString,req=false ',
+                   'name=placement,type=CephString,req=false '
+                  f'name=meta_pool,type=CephString,goodchars={goodchars},req=false '
+                  f'name=data_pool,type=CephString,goodchars={goodchars},req=false ',
             'desc': "Create a CephFS volume",
             'perm': 'rw'
         },
@@ -679,7 +681,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
     def _cmd_fs_volume_create(self, inbuf, cmd):
         vol_id = cmd['name']
         placement = cmd.get('placement', '')
-        return self.vc.create_fs_volume(vol_id, placement)
+        data_pool = cmd.get('data_pool', None)
+        meta_pool = cmd.get('meta_pool', None)
+        return self.vc.create_fs_volume(vol_id, placement, data_pool, meta_pool)
 
     @mgr_cmd_wrap
     def _cmd_fs_volume_rm(self, inbuf, cmd):