]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/nvmeof: introduce the new nvmeof module
authorTomer Haskalovitch <tomer.haska@ibm.com>
Tue, 24 Feb 2026 11:22:11 +0000 (13:22 +0200)
committerTomer Haskalovitch <tomer.haska@ibm.com>
Wed, 25 Feb 2026 01:05:20 +0000 (03:05 +0200)
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 <tomer.haska@ibm.com>
src/pybind/mgr/nvmeof/__init__.py [new file with mode: 0644]
src/pybind/mgr/nvmeof/module.py [new file with mode: 0644]

diff --git a/src/pybind/mgr/nvmeof/__init__.py b/src/pybind/mgr/nvmeof/__init__.py
new file mode 100644 (file)
index 0000000..33b8e63
--- /dev/null
@@ -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 (file)
index 0000000..df780f0
--- /dev/null
@@ -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)