Skip to content

Commit 2946b19

Browse files
author
Alexander Indenbaum
committed
mgr/cephadm: ceph nvmeof monitor support
Signed-off-by: Alexander Indenbaum <[email protected]>
1 parent bb75dde commit 2946b19

File tree

3 files changed

+54
-54
lines changed

3 files changed

+54
-54
lines changed

src/cephadm/cephadmlib/daemons/nvmeof.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ def identity(self) -> DaemonIdentity:
6363
return DaemonIdentity(self.fsid, self.daemon_type, self.daemon_id)
6464

6565
@staticmethod
66-
def _get_container_mounts(data_dir: str, log_dir: str) -> Dict[str, str]:
66+
def _get_container_mounts(
67+
data_dir: str, log_dir: str, mtls_dir: Optional[str] = None
68+
) -> Dict[str, str]:
6769
mounts = dict()
6870
mounts[os.path.join(data_dir, 'config')] = '/etc/ceph/ceph.conf:z'
6971
mounts[os.path.join(data_dir, 'keyring')] = '/etc/ceph/keyring:z'
@@ -74,6 +76,8 @@ def _get_container_mounts(data_dir: str, log_dir: str) -> Dict[str, str]:
7476
mounts['/dev/hugepages'] = '/dev/hugepages'
7577
mounts['/dev/vfio/vfio'] = '/dev/vfio/vfio'
7678
mounts[log_dir] = '/var/log/ceph:z'
79+
if mtls_dir:
80+
mounts[mtls_dir] = '/src/mtls:z'
7781
return mounts
7882

7983
def _get_tls_cert_key_mounts(
@@ -98,8 +102,15 @@ def customize_container_mounts(
98102
) -> None:
99103
data_dir = self.identity.data_dir(ctx.data_dir)
100104
log_dir = os.path.join(ctx.log_dir, self.identity.fsid)
101-
mounts.update(self._get_container_mounts(data_dir, log_dir))
102-
mounts.update(self._get_tls_cert_key_mounts(data_dir, self.files))
105+
mtls_dir = os.path.join(ctx.data_dir, self.identity.fsid, 'mtls')
106+
if os.path.exists(mtls_dir):
107+
mounts.update(
108+
self._get_container_mounts(
109+
data_dir, log_dir, mtls_dir=mtls_dir
110+
)
111+
)
112+
else:
113+
mounts.update(self._get_container_mounts(data_dir, log_dir))
103114

104115
def customize_container_binds(
105116
self, ctx: CephadmContext, binds: List[List[str]]

src/pybind/mgr/cephadm/services/nvmeof.py

Lines changed: 39 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from mgr_module import HandleCommandResult
88
from ceph.deployment.service_spec import NvmeofServiceSpec
99

10-
from orchestrator import DaemonDescription, DaemonDescriptionStatus
10+
from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus
1111
from .cephadmservice import CephadmDaemonDeploySpec, CephService
1212
from .. import utils
1313

@@ -20,10 +20,16 @@ class NvmeofService(CephService):
2020

2121
def config(self, spec: NvmeofServiceSpec) -> None: # type: ignore
2222
assert self.TYPE == spec.service_type
23-
assert spec.pool
24-
self.pool = spec.pool
25-
assert spec.group is not None
26-
self.group = spec.group
23+
# Looking at src/pybind/mgr/cephadm/services/iscsi.py
24+
# asserting spec.pool/spec.group might be appropriate
25+
if not spec.pool:
26+
raise OrchestratorError("pool should be in the spec")
27+
if spec.group is None:
28+
raise OrchestratorError("group should be in the spec")
29+
# unlike some other config funcs, if this fails we can't
30+
# go forward deploying the daemon and then retry later. For
31+
# that reason we make no attempt to catch the OrchestratorError
32+
# this may raise
2733
self.mgr._check_pool_exists(spec.pool, spec.service_name())
2834

2935
def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
@@ -80,34 +86,33 @@ def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonD
8086

8187
daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
8288
daemon_spec.deps = []
83-
if not hasattr(self, 'gws'):
84-
self.gws = {} # id -> name map of gateways for this service.
85-
self.gws[nvmeof_gw_id] = name # add to map of service's gateway names
8689
return daemon_spec
8790

8891
def daemon_check_post(self, daemon_descrs: List[DaemonDescription]) -> None:
8992
""" Overrides the daemon_check_post to add nvmeof gateways safely
9093
"""
9194
self.mgr.log.info(f"nvmeof daemon_check_post {daemon_descrs}")
92-
# Assert configured
93-
assert self.pool
94-
assert self.group is not None
95+
spec = cast(NvmeofServiceSpec,
96+
self.mgr.spec_store.all_specs.get(daemon_descrs[0].service_name(), None))
97+
if not spec:
98+
self.mgr.log.error(f'Failed to find spec for {daemon_descrs[0].name()}')
99+
return
100+
pool = spec.pool
101+
group = spec.group
95102
for dd in daemon_descrs:
96-
self.mgr.log.info(f"nvmeof daemon_descr {dd}")
97-
assert dd.daemon_id in self.gws
98-
name = self.gws[dd.daemon_id]
99-
self.mgr.log.info(f"nvmeof daemon name={name}")
100103
# Notify monitor about this gateway creation
101104
cmd = {
102105
'prefix': 'nvme-gw create',
103-
'id': name,
104-
'group': self.group,
105-
'pool': self.pool
106+
'id': f'{utils.name_to_config_section("nvmeof")}.{dd.daemon_id}',
107+
'group': group,
108+
'pool': pool
106109
}
107110
self.mgr.log.info(f"create gateway: monitor command {cmd}")
108111
_, _, err = self.mgr.mon_command(cmd)
109112
if err:
110-
self.mgr.log.error(f"Unable to send monitor command {cmd}, error {err}")
113+
err_msg = (f"Unable to send monitor command {cmd}, error {err}")
114+
logger.error(err_msg)
115+
raise OrchestratorError(err_msg)
111116
super().daemon_check_post(daemon_descrs)
112117

113118
def config_dashboard(self, daemon_descrs: List[DaemonDescription]) -> None:
@@ -119,8 +124,11 @@ def get_set_cmd_dicts(out: str) -> List[dict]:
119124
self.mgr.spec_store.all_specs.get(daemon_descrs[0].service_name(), None))
120125

121126
for dd in daemon_descrs:
122-
assert dd.hostname is not None
123127
service_name = dd.service_name()
128+
if dd.hostname is None:
129+
err_msg = ('Trying to config_dashboard nvmeof but no hostname is defined')
130+
logger.error(err_msg)
131+
raise OrchestratorError(err_msg)
124132

125133
if not spec:
126134
logger.warning(f'No ServiceSpec found for {service_name}')
@@ -182,41 +190,22 @@ def post_remove(self, daemon: DaemonDescription, is_failed_deploy: bool) -> None
182190
if not ret:
183191
logger.info(f'{daemon.hostname} removed from nvmeof gateways dashboard config')
184192

185-
# Assert configured
186-
assert self.pool
187-
assert self.group is not None
188-
assert daemon.daemon_id in self.gws
189-
name = self.gws[daemon.daemon_id]
190-
self.gws.pop(daemon.daemon_id)
193+
spec = cast(NvmeofServiceSpec,
194+
self.mgr.spec_store.all_specs.get(daemon.service_name(), None))
195+
if not spec:
196+
self.mgr.log.error(f'Failed to find spec for {daemon.name()}')
197+
return
198+
pool = spec.pool
199+
group = spec.group
200+
191201
# Notify monitor about this gateway deletion
192202
cmd = {
193203
'prefix': 'nvme-gw delete',
194-
'id': name,
195-
'group': self.group,
196-
'pool': self.pool
204+
'id': f'{utils.name_to_config_section("nvmeof")}.{daemon.daemon_id}',
205+
'group': group,
206+
'pool': pool
197207
}
198208
self.mgr.log.info(f"delete gateway: monitor command {cmd}")
199209
_, _, err = self.mgr.mon_command(cmd)
200210
if err:
201211
self.mgr.log.error(f"Unable to send monitor command {cmd}, error {err}")
202-
203-
def purge(self, service_name: str) -> None:
204-
"""Make sure no zombie gateway is left behind
205-
"""
206-
# Assert configured
207-
assert self.pool
208-
assert self.group is not None
209-
for daemon_id in self.gws:
210-
name = self.gws[daemon_id]
211-
self.gws.pop(daemon_id)
212-
# Notify monitor about this gateway deletion
213-
cmd = {
214-
'prefix': 'nvme-gw delete',
215-
'id': name,
216-
'group': self.group,
217-
'pool': self.pool
218-
}
219-
self.mgr.log.info(f"purge delete gateway: monitor command {cmd}")
220-
_, _, err = self.mgr.mon_command(cmd)
221-
if err:
222-
self.mgr.log.error(f"Unable to send monitor command {cmd}, error {err}")

src/pybind/mgr/cephadm/tests/test_services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ def test_nvmeof_config(self, _get_name, _run_cephadm, cephadm_module: CephadmOrc
405405
allowed_consecutive_spdk_ping_failures = 1
406406
spdk_ping_interval_in_seconds = 2.0
407407
ping_spdk_under_lock = False
408-
enable_monitor_client = False
408+
enable_monitor_client = True
409409
410410
[gateway-logs]
411411
log_level = INFO

0 commit comments

Comments
 (0)