Skip to content

Commit b983b03

Browse files
authored
Merge pull request ceph#63962 from adk3798/cephadm-signal-containerized-daemon
cephadm: add command to send signals to daemons Reviewed-by: John Mulligan <[email protected]>
2 parents 8497458 + d3d3d79 commit b983b03

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

src/cephadm/cephadm.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
)
139139
from cephadmlib.systemd import check_unit, check_units, terminate_service, enable_service
140140
from cephadmlib import systemd_unit
141+
from cephadmlib.signals import send_signal_to_container_entrypoint
141142
from cephadmlib import runscripts
142143
from cephadmlib.container_types import (
143144
CephContainer,
@@ -3282,6 +3283,17 @@ def command_unit(ctx: CephadmContext) -> int:
32823283
)
32833284
return code
32843285

3286+
3287+
@infer_fsid
3288+
def command_signal(ctx: CephadmContext) -> int:
3289+
if not ctx.fsid:
3290+
raise Error('must pass --fsid to specify cluster')
3291+
3292+
container_name = DaemonIdentity.from_name(ctx.fsid, ctx.name).container_name
3293+
3294+
return send_signal_to_container_entrypoint(ctx, container_name, ctx.signal_name or ctx.signal_number)
3295+
3296+
32853297
##################################
32863298

32873299

@@ -4877,6 +4889,24 @@ def _get_parser():
48774889
help='cluster FSID')
48784890
_name_opts(parser_unit_install)
48794891

4892+
parser_signal = subparsers.add_parser(
4893+
'signal', help='Send signal to entrypoint of containerized daemon')
4894+
parser_signal.set_defaults(func=command_signal)
4895+
signal_group = parser_signal.add_mutually_exclusive_group(required=True)
4896+
signal_group.add_argument(
4897+
'--signal-number',
4898+
help='Signal number to send',)
4899+
signal_group.add_argument(
4900+
'--signal-name',
4901+
help='Signal to send')
4902+
parser_signal.add_argument(
4903+
'--fsid',
4904+
help='cluster FSID')
4905+
parser_signal.add_argument(
4906+
'--name', '-n',
4907+
required=True,
4908+
help='daemon name (type.id)')
4909+
48804910
parser_logs = subparsers.add_parser(
48814911
'logs', help='print journald logs for a daemon container')
48824912
parser_logs.set_defaults(func=command_logs)

src/cephadm/cephadmlib/signals.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# functions related to sending signals
2+
3+
import logging
4+
import signal
5+
6+
from typing import Optional, Union
7+
8+
from .call_wrappers import call, CallVerbosity
9+
from .context import CephadmContext
10+
from .exceptions import Error
11+
12+
logger = logging.getLogger()
13+
14+
15+
def send_signal_to_container_entrypoint(
16+
ctx: CephadmContext, container_name: str, sig: Union[str, int]
17+
) -> int:
18+
sig_str: Optional[str] = None
19+
if isinstance(sig, int) or sig.isdigit():
20+
try:
21+
sig_value = signal.Signals(int(sig))
22+
except ValueError:
23+
raise Error(f'Failed to find signal name for signal ({sig})')
24+
else:
25+
name = sig.upper()
26+
sig_value = signal.Signals[
27+
name if name.startswith('SIG') else 'SIG' + name
28+
]
29+
sig_str = str(sig_value.name)
30+
31+
logger.info(
32+
f'Sending signal {sig_str} to entrypoint of container {container_name}'
33+
)
34+
35+
_, _, code = call(
36+
ctx,
37+
[
38+
ctx.container_engine.path,
39+
'kill',
40+
container_name,
41+
'--signal',
42+
sig_str,
43+
],
44+
verbosity=CallVerbosity.VERBOSE,
45+
desc='',
46+
)
47+
return code

0 commit comments

Comments
 (0)