Skip to content

Commit d3d3d79

Browse files
committed
cephadm: add command to send signals to daemons
This command figures out the container id for the daemon based on the given name and then uses a docker/podman to send that signal to the container Signed-off-by: Adam King <[email protected]>
1 parent 10f802a commit d3d3d79

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,
@@ -3256,6 +3257,17 @@ def command_unit(ctx: CephadmContext) -> int:
32563257
)
32573258
return code
32583259

3260+
3261+
@infer_fsid
3262+
def command_signal(ctx: CephadmContext) -> int:
3263+
if not ctx.fsid:
3264+
raise Error('must pass --fsid to specify cluster')
3265+
3266+
container_name = DaemonIdentity.from_name(ctx.fsid, ctx.name).container_name
3267+
3268+
return send_signal_to_container_entrypoint(ctx, container_name, ctx.signal_name or ctx.signal_number)
3269+
3270+
32593271
##################################
32603272

32613273

@@ -4851,6 +4863,24 @@ def _get_parser():
48514863
help='cluster FSID')
48524864
_name_opts(parser_unit_install)
48534865

4866+
parser_signal = subparsers.add_parser(
4867+
'signal', help='Send signal to entrypoint of containerized daemon')
4868+
parser_signal.set_defaults(func=command_signal)
4869+
signal_group = parser_signal.add_mutually_exclusive_group(required=True)
4870+
signal_group.add_argument(
4871+
'--signal-number',
4872+
help='Signal number to send',)
4873+
signal_group.add_argument(
4874+
'--signal-name',
4875+
help='Signal to send')
4876+
parser_signal.add_argument(
4877+
'--fsid',
4878+
help='cluster FSID')
4879+
parser_signal.add_argument(
4880+
'--name', '-n',
4881+
required=True,
4882+
help='daemon name (type.id)')
4883+
48544884
parser_logs = subparsers.add_parser(
48554885
'logs', help='print journald logs for a daemon container')
48564886
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)