NotifyType,
MonCommandFailed,
)
-from mgr_util import build_url
+from mgr_util import build_url, NvmeofMetadataPoolHelper
import orchestrator
from orchestrator.module import to_format, Format
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:
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]:
"""
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
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,
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(
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()