From: Tomer Haskalovitch Date: Tue, 24 Feb 2026 11:22:11 +0000 (+0200) Subject: mgr/nvmeof: introduce the new nvmeof module X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dd008f92178166846b835f86f729cfe03ae9e20e;p=ceph-ci.git mgr/nvmeof: introduce the new nvmeof module Introduce a new NVMe-oF mgr module and which create the pool used for storing NVMe-related metadata ceph orch nvmeof apply command. This removes the need for users to manually create and configure the metadata pool before using the NVMe-oF functionality, simplifying setup and reducing the chance of misconfiguration. Fixes: https://tracker.ceph.com/issues/74702 Signed-off-by: Tomer Haskalovitch --- diff --git a/src/pybind/mgr/nvmeof/__init__.py b/src/pybind/mgr/nvmeof/__init__.py new file mode 100644 index 00000000000..33b8e63a31c --- /dev/null +++ b/src/pybind/mgr/nvmeof/__init__.py @@ -0,0 +1,2 @@ +# flake8: noqa +from .module import NVMeoF diff --git a/src/pybind/mgr/nvmeof/module.py b/src/pybind/mgr/nvmeof/module.py new file mode 100644 index 00000000000..df780f0bdc8 --- /dev/null +++ b/src/pybind/mgr/nvmeof/module.py @@ -0,0 +1,57 @@ +import logging +from typing import Any + +from mgr_module import MgrModule +import rbd + +logger = logging.getLogger(__name__) + +POOL_NAME = ".nvmeof" + + +class NVMeoF(MgrModule): + def __init__(self, *args: Any, **kwargs: Any) -> None: + super(NVMeoF, self).__init__(*args, **kwargs) + + def _pool_exists(self, pool_name: str) -> bool: + logger.info(f"checking if pool {pool_name} exists") + pool_exists = self.pool_exists(pool_name) + if pool_exists: + logger.info(f"pool {pool_name} already exists") + else: + logger.info(f"pool {pool_name} doesn't exist") + return pool_exists + + def _create_pool(self, pool_name: str) -> None: + try: + self.create_pool(pool_name) + logger.info(f"Pool '{pool_name}' created.") + except Exception: + logger.error(f"Error creating pool '{pool_name}", exc_info=True) + raise + + def _enable_rbd_application(self, pool_name: str) -> None: + try: + self.appify_pool(pool_name, 'rbd') + logger.info(f"'rbd' application enabled on pool '{pool_name}'.") + except Exception: + logger.error( + f"Failed to enable 'rbd' application on '{pool_name}'", + exc_info=True + ) + raise + + def _rbd_pool_init(self, pool_name: str) -> None: + try: + with self.rados.open_ioctx(pool_name) as ioctx: + rbd.RBD().pool_init(ioctx, False) + logger.info(f"RBD pool_init completed on '{pool_name}'.") + except Exception: + logger.error(f"Failed to initialize RBD pool '{pool_name}'", exc_info=True) + raise + + def create_pool_if_not_exists(self) -> None: + if not self._pool_exists(POOL_NAME): + self._create_pool(POOL_NAME) + self._enable_rbd_application(POOL_NAME) + self._rbd_pool_init(POOL_NAME)