* 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
 |