]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: create default pool for nvmeof 68239/head
authorKushal Deb <Kushal.Deb@ibm.com>
Tue, 7 Apr 2026 14:00:22 +0000 (19:30 +0530)
committerKushal Deb <Kushal.Deb@ibm.com>
Tue, 14 Apr 2026 06:05:28 +0000 (11:35 +0530)
Signed-off-by: Kushal Deb <Kushal.Deb@ibm.com>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/mgr_util.py
src/pybind/mgr/orchestrator/module.py
src/pybind/mgr/orchestrator/tests/test_orchestrator.py

index 347305c649954ccdf4ac903df1b6f46a9a6104f0..78c48ee08e4c51daf0f305b8181edcc69543312f 100644 (file)
@@ -62,7 +62,7 @@ from mgr_module import (
     NotifyType,
     MonCommandFailed,
 )
-from mgr_util import build_url
+from mgr_util import build_url, NvmeofMetadataPoolHelper
 import orchestrator
 from orchestrator.module import to_format, Format
 
@@ -3922,6 +3922,8 @@ Then run the following:
             nvmeof_spec = cast(NvmeofServiceSpec, spec)
             assert nvmeof_spec.pool is not None, "Pool cannot be None for nvmeof services"
             assert nvmeof_spec.service_id is not None  # for mypy
+            if nvmeof_spec.pool == '.nvmeof':
+                NvmeofMetadataPoolHelper(self).create_pool_if_needed()
             try:
                 self._check_pool_exists(nvmeof_spec.pool, nvmeof_spec.service_name())
             except OrchestratorError as e:
index d80991e49efdf55349322c3df99df1c6b3cd033f..fa44e6c56b90fb1f6e5980892f430db05fb391c3 100644 (file)
@@ -440,6 +440,28 @@ class CephFSEarmarkResolver:
             return False
 
 
+class NvmeofMetadataPoolHelper:
+    def __init__(self, mgr: "MgrModule") -> None:
+        self.mgr = mgr
+
+    def is_module_enabled(self, module: str) -> bool:
+        mgr_map = self.mgr.get('mgr_map')
+        return (
+            module in mgr_map.get('modules', [])
+            or module in mgr_map.get('always_on_modules', {}).get(self.mgr.release_name, [])
+        )
+
+    def create_pool_if_needed(self) -> None:
+        from orchestrator import OrchestratorError
+
+        if not self.is_module_enabled('nvmeof'):
+            raise OrchestratorError(
+                'NVMe-oF support requires the nvmeof manager module to be enabled before proceeding. '
+                'Enable it with: ceph mgr module enable nvmeof'
+            )
+        self.mgr.remote('nvmeof', 'create_pool_if_not_exists')
+
+
 @contextlib.contextmanager
 def open_filesystem(fsc: CephfsClient, fs_name: str) -> Generator["cephfs.LibCephFS", None, None]:
     """
index 876f1c536d63eddf25dc04891697f5f9bc13f643..4b4489237e87f414a966a57e3d9d9e94e03ac76c 100644 (file)
@@ -22,7 +22,7 @@ from ceph.deployment.hostspec import SpecValidationError
 from ceph.deployment.utils import unwrap_ipv6
 from ceph.utils import datetime_now
 from ceph.cephadm.images import NonCephImageServiceTypes
-from mgr_util import to_pretty_timedelta, format_bytes, parse_combined_pem_file
+from mgr_util import to_pretty_timedelta, format_bytes, parse_combined_pem_file, NvmeofMetadataPoolHelper
 from mgr_module import MgrModule, HandleCommandResult, Option
 from object_format import Format
 
@@ -2117,18 +2117,6 @@ Usage:
 
         return self._apply_misc([spec], dry_run, format, no_overwrite)
 
-    def _is_module_enabled(self, module: str) -> bool:
-        mgr_map = self.get('mgr_map')
-        return (
-            module in mgr_map.get('modules', [])
-            or module in mgr_map.get('always_on_modules', []).get(self.release_name, [])
-        )
-
-    def _create_nvmeof_metadata_pool_if_needed(self) -> None:
-        if not self._is_module_enabled('nvmeof'):
-            raise OrchestratorError('nvmeof module must be enabled to use .nvmeof pool')
-        self.remote('nvmeof', 'create_pool_if_not_exists')
-
     @OrchestratorCLICommand.Write('orch apply nvmeof')
     def _apply_nvmeof(self,
                       _end_positional_: int = 0,
@@ -2148,7 +2136,8 @@ Usage:
             raise OrchestratorValidationError('unrecognized command -i; -h or --help for usage')
 
         if pool == ".nvmeof":
-            self._create_nvmeof_metadata_pool_if_needed()
+            nvmeof_pool_helper = NvmeofMetadataPoolHelper(self)
+            nvmeof_pool_helper.create_pool_if_needed()
 
         cleanpool = pool.lstrip('.')
         spec = NvmeofServiceSpec(
index 3c6ed7ad7cef9ff89770f47b2c040a0d14a78d06..88aee08a0103c2573fe423c36af309240f167c80 100644 (file)
@@ -334,7 +334,10 @@ class TestApplyNvmeof:
         res = self.m._apply_nvmeof(pool=".nvmeof", group="mygroup")
 
         assert res.retval != 0
-        assert "nvmeof module must be enabled to use .nvmeof pool" in res.stderr
+        assert (
+            "NVMe-oF support requires the nvmeof manager module to be enabled before proceeding. "
+            "Enable it with: ceph mgr module enable nvmeof"
+        ) in res.stderr
         mock_remote.assert_not_called()
         mock_apply_misc.assert_not_called()