guix/gnu/packages/patches/ganeti-shepherd-support.patch
Marius Bakke 72a91d74ce
gnu: Add ganeti.
* gnu/packages/virtualization.scm (system->qemu-target, ganeti): New variables.
* gnu/packages/patches/ganeti-deterministic-manual.patch,
gnu/packages/patches/ganeti-disable-version-symlinks.patch,
gnu/packages/patches/ganeti-drbd-compat.patch,
gnu/packages/patches/ganeti-haskell-pythondir.patch,
gnu/packages/patches/ganeti-os-disk-size.patch,
gnu/packages/patches/ganeti-preserve-PYTHONPATH.patch,
gnu/packages/patches/ganeti-shepherd-master-failover.patch,
gnu/packages/patches/ganeti-shepherd-support.patch: New files.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
2020-07-16 21:51:43 +02:00

88 lines
2.6 KiB
Diff

Ganeti uses an internal tool to start/stop daemons during init and
upgrade. This patch makes the tool use native Shepherd facilities.
diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
--- a/daemons/daemon-util.in
+++ b/daemons/daemon-util.in
@@ -184,6 +184,21 @@ use_systemctl() {
return 1
}
+# Checks if we should use the Shepherd to start/stop daemons
+use_shepherd() {
+ # Is Shepherd running as PID 1?
+ ps --no-headers -p 1 -o cmd | grep -q shepherd || return 1
+
+ type -p herd >/dev/null || return 1
+
+ # Does Shepherd know about Ganeti at all?
+ if herd status | grep -q ganeti; then
+ return 0
+ fi
+
+ return 1
+}
+
# Prints path to PID file for a daemon.
daemon_pidfile() {
if [[ "$#" -lt 1 ]]; then
@@ -261,6 +276,13 @@ check() {
else
return 1
fi
+ elif use_shepherd; then
+ activestate="$(herd status ${name})"
+ if echo $activestate | grep -q Running ; then
+ return 0
+ else
+ return 1
+ fi
elif type -p start-stop-daemon >/dev/null; then
start-stop-daemon --stop --signal 0 --quiet \
--pidfile $pidfile --name "$name"
@@ -291,6 +313,20 @@ start() {
return $?
fi
+ if use_shepherd; then
+ if herd status "$name" | grep -q "disabled"; then
+ # The Shepherd will disable a service that has stopped, even if it exits
+ # gracefully. Thus, we must re-enable it in case of a master failover.
+ herd enable "${name}"
+ fi
+ # Note: unlike systemd, which happily starts a service and returns success
+ # even if the daemon immediately exits, the Shepherd actually waits for it
+ # to come up. Thus, ignore the exit status from 'herd start' in case of
+ # master daemons running on the wrong node, or ganeti-kvmd disabled, etc.
+ herd start "${name}"
+ return 0
+ fi
+
# Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
@@ -336,6 +372,13 @@ stop() {
if use_systemctl; then
systemctl stop "${name}.service"
+ elif use_shepherd; then
+ if herd status | grep -q "$name"; then
+ herd stop "$name"
+ else
+ # Do not raise an error if the service has not been enabled.
+ return 0
+ fi
elif type -p start-stop-daemon >/dev/null; then
start-stop-daemon --stop --quiet --oknodo --retry 30 \
--pidfile $pidfile --name "$name"
@@ -352,6 +395,9 @@ check_and_start() {
if use_systemctl; then
echo "${name} supervised by systemd but not running, will not restart."
return 1
+ elif use_shepherd; then
+ echo "${name} supervised by shepherd but not running, will not restart."
+ return 1
fi
start $name