From f10599d9650cdb1029a6eea0408e18dd560768e6 Mon Sep 17 00:00:00 2001 From: Rishabh Dave Date: Sat, 8 Feb 2025 20:00:37 +0530 Subject: [PATCH] mgr/vol: allow passing pool names to "fs volume create" cmd Fixes: https://tracker.ceph.com/issues/69878 Signed-off-by: Rishabh Dave (cherry picked from commit e794a19fd0da92c4331702ed4c35e9d659e53f81) --- .../mgr/volumes/fs/operations/volume.py | 53 +++++++++++++++---- src/pybind/mgr/volumes/fs/volume.py | 4 +- src/pybind/mgr/volumes/module.py | 8 ++- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/pybind/mgr/volumes/fs/operations/volume.py b/src/pybind/mgr/volumes/fs/operations/volume.py index 0ff15c5478b..19f0e2fa1d3 100644 --- a/src/pybind/mgr/volumes/fs/operations/volume.py +++ b/src/pybind/mgr/volumes/fs/operations/volume.py @@ -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: diff --git a/src/pybind/mgr/volumes/fs/volume.py b/src/pybind/mgr/volumes/fs/volume.py index 2e96f830636..4b9b93b8e9d 100644 --- a/src/pybind/mgr/volumes/fs/volume.py +++ b/src/pybind/mgr/volumes/fs/volume.py @@ -94,8 +94,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": diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index c4f96f60329..c339e5a6d21 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -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' }, @@ -579,7 +581,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): -- 2.39.5