mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 21:38:07 -05:00
72a91d74ce
* 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.
87 lines
2.6 KiB
Diff
87 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
|