]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm: add docker.service dependency in systemd units 39770/head
authorSage Weil <sage@newdream.net>
Mon, 1 Mar 2021 22:42:15 +0000 (17:42 -0500)
committerSage Weil <sage@newdream.net>
Tue, 2 Mar 2021 14:50:49 +0000 (09:50 -0500)
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 <sage@newdream.net>
src/cephadm/cephadm
src/cephadm/tests/test_cephadm.py

index 66c2bee6b1666ec1c2b9b87ff20e18dde9a57820..166e44215185d11d90eb62af544ffdbe6d8a266d 100755 (executable)
@@ -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
index af10355878fe192f797bfaace509fc019a181a6c..7b2c4db711dc9b794b90e213338cd4374cd9b501 100644 (file)
@@ -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