From 5ce1c5a0a1e59a4ee991aa7c3c909b44eced2cbb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 1 Mar 2021 17:42:15 -0500 Subject: [PATCH] cephadm: add docker.service dependency in systemd units This ensures that (1) we start after the docker daemon is running, and (2) a restart of docker will also restart the ceph services. Fixes: https://tracker.ceph.com/issues/46745 Signed-off-by: Sage Weil (cherry picked from commit 0b5bc8fc2e11f1ec84be96e7a2bdbb884e1d0de3) --- src/cephadm/cephadm | 21 ++++++++++++++++----- src/cephadm/tests/test_cephadm.py | 9 +++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index 8125461714f11..3a90939cf9192 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -2912,6 +2912,7 @@ def get_unit_file(ctx, fsid): 'Type=forking\n' 'PIDFile=/%t/%n-pid\n') + docker = 'docker' in ctx.container_path u = """# generated by cephadm [Unit] Description=Ceph %i for {fsid} @@ -2920,8 +2921,9 @@ Description=Ceph %i for {fsid} # http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget # these can be removed once ceph-mon will dynamically change network # configuration. -After=network-online.target local-fs.target time-sync.target +After=network-online.target local-fs.target time-sync.target{docker_after} Wants=network-online.target local-fs.target time-sync.target +{docker_requires} PartOf=ceph-{fsid}.target Before=ceph-{fsid}.target @@ -2947,7 +2949,11 @@ WantedBy=ceph-{fsid}.target container_path=ctx.container_path, fsid=fsid, data_dir=ctx.data_dir, - extra_args=extra_args) + extra_args=extra_args, + # if docker, we depend on docker.service + docker_after=' docker.service' if docker else '', + docker_requires='Requires=docker.service\n' if docker else '', +) return u @@ -6951,11 +6957,13 @@ class CephadmDaemon(): @property def unit_file(self): + docker = 'docker' in self.ctx.container_path return """#generated by cephadm [Unit] Description=cephadm exporter service for cluster {fsid} -After=network-online.target +After=network-online.target{docker_after} Wants=network-online.target +{docker_requires} PartOf=ceph-{fsid}.target Before=ceph-{fsid}.target @@ -6971,8 +6979,11 @@ RestartSec=10s WantedBy=ceph-{fsid}.target """.format( fsid=self.fsid, - daemon_path=self.daemon_path -) + daemon_path=self.daemon_path, + # if docker, we depend on docker.service + docker_after=' docker.service' if docker else '', + docker_requires='Requires=docker.service\n' if docker else '', + ) def deploy_daemon_unit(self, config=None): """deploy a specific unit file for cephadm diff --git a/src/cephadm/tests/test_cephadm.py b/src/cephadm/tests/test_cephadm.py index af10355878fe1..7b2c4db711dc9 100644 --- a/src/cephadm/tests/test_cephadm.py +++ b/src/cephadm/tests/test_cephadm.py @@ -23,6 +23,15 @@ with patch('builtins.open', create=True): class TestCephAdm(object): + def test_docker_unit_file(self): + ctx = mock.Mock() + ctx.container_path = '/usr/bin/docker' + r = cd.get_unit_file(ctx, '9b9d7609-f4d5-4aba-94c8-effa764d96c9') + assert 'Requires=docker.service' in r + ctx.container_path = '/usr/sbin/podman' + r = cd.get_unit_file(ctx, '9b9d7609-f4d5-4aba-94c8-effa764d96c9') + assert 'Requires=docker.service' not in r + @mock.patch('cephadm.logger') def test_attempt_bind(self, logger): ctx = None -- 2.39.5