--- /dev/null
+# generated by cephadm
+[Unit]
+Description=cephadm agent for cluster {{agent.fsid}}
+
+PartOf=ceph-{{agent.fsid}}.target
+Before=ceph-{{agent.fsid}}.target
+
+[Service]
+Type=forking
+ExecStart=/bin/bash {{agent.daemon_dir}}/unit.run
+Restart=on-failure
+RestartSec=10s
+
+[Install]
+WantedBy=ceph-{{agent.fsid}}.target
--- /dev/null
+# generated by cephadm
+[Unit]
+Description=Ceph %i for {{fsid}}
+
+# According to:
+# 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{% if has_docker_engine %} docker.service{% endif %}
+Wants=network-online.target local-fs.target time-sync.target
+{%- if has_docker_engine %}
+Requires=docker.service
+{%- endif %}
+
+PartOf=ceph-{{fsid}}.target
+Before=ceph-{{fsid}}.target
+
+[Service]
+LimitNOFILE=1048576
+LimitNPROC=1048576
+EnvironmentFile=-/etc/environment
+ExecStart=/bin/bash {{ctx.data_dir}}/{{fsid}}/%i/unit.run
+ExecStop=-/bin/bash -c 'bash {{ctx.data_dir}}/{{fsid}}/%i/unit.stop'
+ExecStopPost=-/bin/bash {{ctx.data_dir}}/{{fsid}}/%i/unit.poststop
+KillMode=none
+Restart=on-failure
+RestartSec=10s
+TimeoutStartSec=200
+TimeoutStopSec=120
+StartLimitInterval=30min
+StartLimitBurst=5
+{%- if has_podman_engine %}
+ExecStartPre=-/bin/rm -f %t/%n-pid %t/%n-cid
+ExecStopPost=-/bin/rm -f %t/%n-pid %t/%n-cid
+Type=forking
+PIDFile=%t/%n-pid
+{%- if has_podman_split_version %}
+Delegate=yes
+{%- endif %}
+{%- endif %}
+
+[Install]
+WantedBy=ceph-{{fsid}}.target
# templating.py - functions to wrap string/file templating libs
+import enum
from typing import Any, Optional, IO
_DIR = 'templates'
+class Templates(str, enum.Enum):
+ """Known template files."""
+
+ ceph_service = 'ceph.service.j2'
+ agent_service = 'agent.service.j2'
+
+ def __str__(self) -> str:
+ return self.value
+
+ def __repr__(self) -> str:
+ return repr(self.value)
+
+
class Templater:
"""Cephadm's generic templater class. Based on jinja2."""
return self._env.from_string(template).render(ctx=ctx, **kwargs)
def render(self, ctx: CephadmContext, name: str, **kwargs: Any) -> str:
- return self._env.get_template(name).render(ctx=ctx, **kwargs)
+ return self._env.get_template(str(name)).render(ctx=ctx, **kwargs)
def render_to_file(
self, fp: IO, ctx: CephadmContext, name: str, **kwargs: Any
) -> None:
- self._env.get_template(name).stream(ctx=ctx, **kwargs).dump(fp)
+ self._env.get_template(str(name)).stream(ctx=ctx, **kwargs).dump(fp)
# create a defaultTemplater instace from the Templater class that will