[Cluster-devel] cluster/rgmanager/src/resources Makefile xenvm.sh

lhh at sourceware.org lhh at sourceware.org
Wed Jul 12 15:43:57 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	lhh at sourceware.org	2006-07-12 15:43:56

Modified files:
	rgmanager/src/resources: Makefile 
Added files:
	rgmanager/src/resources: xenvm.sh 

Log message:
	Add missing xenvm.sh resource

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/xenvm.sh.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/Makefile.diff?cvsroot=cluster&r1=1.11&r2=1.12

/cvs/cluster/cluster/rgmanager/src/resources/xenvm.sh,v  -->  standard output
revision 1.1
--- cluster/rgmanager/src/resources/xenvm.sh
+++ -	2006-07-12 15:43:57.727243000 +0000
@@ -0,0 +1,432 @@
+#!/bin/bash
+
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+
+export PATH
+
+#
+# Xen para VM start/stop script.
+#
+
+meta_data()
+{
+    cat <<EOT
+<?xml version="1.0"?>
+<resource-agent version="rgmanager 2.0" name="xenvm">
+    <version>1.0</version>
+
+    <longdesc lang="en">
+	Defines a Xen Para-Virtual Machine
+    </longdesc>
+    <shortdesc lang="en">
+        Defines a Xen domain.
+    </shortdesc>
+
+    <parameters>
+        <parameter name="name" primary="1">
+            <longdesc lang="en">
+                This is the name of the Xen domain.
+            </longdesc>
+            <shortdesc lang="en">
+                Name
+            </shortdesc>
+            <content type="string"/>
+        </parameter>
+    
+        <parameter name="domain">
+            <longdesc lang="en">
+                Fail over domains define lists of cluster members
+                to try in the event that the host of the Xen domain
+		fails.
+            </longdesc>
+            <shortdesc lang="en">
+                Cluster Fail Over Domain
+            </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+        <parameter name="autostart">
+            <longdesc lang="en">
+	    	If set to yes, this resource group will automatically be started
+		after the cluster forms a quorum.  If set to no, this resource
+		group will start in the 'disabled' state after the cluster forms
+		a quorum.
+            </longdesc>
+            <shortdesc lang="en">
+	    	Automatic start after quorum formation
+            </shortdesc>
+            <content type="boolean"/>
+        </parameter>
+
+        <parameter name="recovery" reconfig="1">
+            <longdesc lang="en">
+	        This currently has three possible options: "restart" tries
+		to restart failed parts of this resource group locally before
+		attempting to relocate (default); "relocate" does not bother
+		trying to restart the service locally; "disable" disables
+		the resource group if any component fails.  Note that
+		any resource with a valid "recover" operation which can be
+		recovered without a restart will be.
+            </longdesc>
+            <shortdesc lang="en">
+	    	Failure recovery policy
+            </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+	<parameter name="memory" reconfig="1">
+	    <longdesc lang="en">
+		Memory size.  This can be reconfigured on the fly.
+	    </longdesc>
+	    <shortdesc lang="en">
+		Memory Size
+	    </shortdesc>
+            <content type="integer"/>
+        </parameter>
+
+	<parameter name="bootloader" required="1">
+	    <longdesc lang="en">
+		Root disk for the Xen VM (as presented to the VM)
+	    </longdesc>
+	    <shortdesc lang="en">
+		Boot loader that can start the Xen VM from physical image
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+	<parameter name="rootdisk_physical" unique="1">
+	    <longdesc lang="en">
+		root disk for the Xen VM.  (physical, on the host)
+	    </longdesc>
+	    <shortdesc lang="en">
+		root disk for the Xen VM.  (physical, on the host)
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+        
+	<parameter name="rootdisk_virtual">
+	    <longdesc lang="en">
+		rootdisk for the Xen VM.  (as presented to the VM)
+	    </longdesc>
+	    <shortdesc lang="en">
+		rootdisk for the Xen VM.  (as presented to the VM)
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+
+	<parameter name="swapdisk_physical" unique="1">
+	    <longdesc lang="en">
+		Swap disk for the Xen VM.  (physical, on the host)
+	    </longdesc>
+	    <shortdesc lang="en">
+		Swap disk for the Xen VM.  (physical, on the host)
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+        
+	<parameter name="swapdisk_virtual">
+	    <longdesc lang="en">
+		Swap disk for the Xen VM.  (as presented to the VM)
+	    </longdesc>
+	    <shortdesc lang="en">
+		Swap disk for the Xen VM.  (as presented to the VM)
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+	<parameter name="vif">
+	    <longdesc lang="en">
+		Virtual interface MAC address
+	    </longdesc>
+	    <shortdesc lang="en">
+		Virtual interface MAC address
+	    </shortdesc>
+            <content type="string"/>
+        </parameter>
+
+
+    </parameters>
+
+    <actions>
+        <action name="start" timeout="20"/>
+        <action name="stop" timeout="240"/>
+	
+	<!-- No-ops.  Groups are abstract resource types.  -->
+        <action name="status" timeout="10" interval="30m"/>
+        <action name="monitor" timeout="10" interval="30m"/>
+
+	<!-- reconfigure - reconfigure with new OCF parameters.
+	     NOT OCF COMPATIBLE AT ALL -->
+	<action name="reconfig" timeout="10"/>
+
+	<!-- Suspend: if available, suspend this resource instead of
+	     doing a full stop. -->
+	<!-- <action name="suspend" timeout="10m"/> -->
+
+        <action name="meta-data" timeout="5"/>
+        <action name="verify-all" timeout="5"/>
+
+    </actions>
+    
+    <special tag="rgmanager">
+        <attributes maxinstances="1"/>
+    </special>
+</resource-agent>
+EOT
+}
+
+
+#
+# Find a list of possible IP addresses to try.
+#
+xen_host_ips()
+{
+	declare xen_ips=$(ip -f inet -o addr list | grep 'xen-br[0-9]\+[^:]' | awk '{print $4}')
+	declare tmp1=""
+	declare i
+
+	for i in $xen_ips; do
+                i=${i/\/*/}
+		if [ -z "$tmp1" ]; then
+			tmp1="$i"
+		else
+			tmp1="$i,$tmp1"
+		fi
+	done
+
+	echo $tmp1
+}
+
+
+build_xen_cmdline()
+{
+	#
+	# Virtual domains should never restart themselves when 
+	# controlled externally; the external monitoring app
+	# should.
+	#
+	declare cmdline="restart=\"never\""
+	declare varp val temp
+
+
+	#
+	# Transliterate the OCF_RESKEY_* to something the xm
+	# command can recognize.
+	#
+	for var in ${!OCF_RESKEY_*}; do
+		varp=${var/OCF_RESKEY_/}
+		val=`eval "echo \\$$var"`
+
+		case $varp in
+		bootloader)
+			cmdline="$cmdline bootloader=\"$val\""
+			;;
+		rootdisk_physical)
+			[ -n "$OCF_RESKEY_rootdisk_virtual" ] || exit 2
+			cmdline="$cmdline disk=\"phy:$val,$OCF_RESKEY_rootdisk_virtual,w\""
+			;;
+		swapdisk_physical)
+			[ -n "$OCF_RESKEY_swapdisk_virtual" ] || exit 2
+			cmdline="$cmdline disk=\"phy:$val,$OCF_RESKEY_swapdisk_virtual,w\""
+			;;
+		vif)
+			cmdline="$cmdline vif=\"mac=$val\""
+			;;
+		recovery|autostart|domain)
+			;;
+		memory)
+			cmdline="$cmdline $varp=$val"
+			;;
+		swapdisk_virtual)
+			;;
+		rootdisk_virtual)
+			;;
+		*)
+			cmdline="$cmdline $varp=\"$val\""
+			;;
+		esac
+	done
+
+	echo $cmdline
+}
+
+
+#
+# Start a Xen para-virtual machine given the parameters from
+# the environment.
+#
+start()
+{
+	# Use /dev/null for the configuration file, if xmdefconfig
+	# doesn't exist...
+	#
+	declare cmdline
+
+	if [ -f "/etc/xen/xmdefconfig" ]; then
+		cmdline="`build_xen_cmdline`"
+	else
+		cmdline="`build_xen_cmdline` /dev/null"
+	fi
+
+	echo $cmdline
+
+	eval xm create $cmdline
+	return $?
+}
+
+
+#
+# Stop a Xen VM.  Try to shut it down.  Wait a bit, and if it
+# doesn't shut down, destroy it.
+#
+stop()
+{
+	declare -i timeout=120
+	declare -i ret=1
+	declare st
+
+	for op in $*; do
+		echo xm $op $OCF_RESKEY_name ...
+		xm $op $OCF_RESKEY_name
+
+		timeout=120
+		while [ $timeout -gt 0 ]; do
+			sleep 5
+			((timeout -= 5))
+			status || return 0
+			while read dom state; do
+				#
+				# State is "stopped".  Kill it.
+				#
+				if [ "$dom" != "$OCF_RESKEY_name" ]; then
+					continue
+				fi
+				if [ "$state" != "---s-" ]; then
+					continue
+				fi
+				xm destroy $OCF_RESKEY_name
+			done < <(xm list | awk '{print $1, $5}')
+		done
+	done
+
+	return 1
+}
+
+
+#
+# Reconfigure a running Xen VM.  Currently, all we support is
+# memory ballooning.
+#
+reconfigure()
+{
+	if [ -n "$OCF_RESKEY_memory" ]; then
+		echo "xm balloon $OCF_RESKEY_name $OCF_RESKEY_memory"
+		xm balloon $OCF_RESKEY_name $OCF_RESKEY_memory
+		return $?
+	fi
+	return 0
+}
+
+
+#
+# Simple status check: Find the Xen VM in the list of running
+# VMs
+#
+status()
+{
+	xm list $OCF_RESKEY_name &> /dev/null
+	return $?
+}
+
+
+verify_all()
+{
+	declare errors=0
+	declare tmp1, tmp2
+
+	if [ -z "$OCF_RESKEY_kernel" ]; then
+		echo "Required parameter OCF_RESKEY_kernel is not present"
+		((errors++))
+	elif ! [ -f "$OCF_RESKEY_kernel" ]; then
+		echo "$OCF_RESKEY_kernel (OCF_RESKEY_kernel) is not valid"
+		((errors++))
+	fi
+
+	tmp1=`echo $OCF_RESKEY_swapdisk | cut -f1 -d,`
+	tmp2=`echo $OCF_RESKEY_swapdisk | cut -f2 -d,`
+		
+	if [ -z "$tmp2" ]; then
+		echo "Swapdisk option malformed"
+		((errors++))
+	fi
+
+	if ! [ -b "$tmp1" ]; then
+		echo "Specified swapdisk device $tmp1 is not a block device"
+		((errors++))
+	fi
+
+	if [ -z "$OCF_RESKEY_rootdisk" ]; then
+		echo "Required parameter OCF_RESKEY_rootdisk is not present"
+		((errors++))
+	else
+		tmp1=`echo $OCF_RESKEY_rootdisk | cut -f1 -d,`
+		tmp2=`echo $OCF_RESKEY_rootdisk | cut -f2 -d,`
+		
+		if [ -z "$tmp2" ]; then
+			echo "Rootdisk option malformed"
+			((errors++))
+		fi
+
+		if ! [ -b "$tmp1" ]; then
+			echo "Specified rootdisk device $tmp1 is not a block device"
+			((errors++))
+		fi
+	fi
+}
+
+#
+# A Resource group is abstract, but the OCF RA API doesn't allow for abstract
+# resources, so here it is.
+#
+case $1 in
+	start)
+		start
+		exit $?
+		;;
+	stop)
+		stop shutdown destroy
+		exit $?
+		;;
+	kill)
+		stop destroy
+		exit $?
+		;;
+	recover|restart)
+		exit 0
+		;;
+	status|monitor)
+		status
+		exit $?
+		;;
+	reload)
+		exit 0
+		;;
+	reconfig)
+		echo "$0 RECONFIGURING $OCF_RESKEY_memory"
+		reconfigure
+		exit $?
+		;;
+	meta-data)
+		meta_data
+		exit 0
+		;;
+	verify-all)
+		verify_all
+		exit $?
+		;;
+	*)
+		echo "usage: $0 {start|stop|restart|status|reload|reconfig|meta-data|verify-all}"
+		exit 1
+		;;
+esac
--- cluster/rgmanager/src/resources/Makefile	2006/06/02 17:37:10	1.11
+++ cluster/rgmanager/src/resources/Makefile	2006/07/12 15:43:56	1.12
@@ -18,7 +18,7 @@
 INCLUDE += -I $(top_srcdir)/include
 
 RESOURCES=fs.sh service.sh ip.sh nfsclient.sh nfsexport.sh \
-	script.sh netfs.sh clusterfs.sh smb.sh
+	script.sh netfs.sh clusterfs.sh smb.sh xenvm.sh
 
 TARGETS=${RESOURCES} ocf-shellfuncs svclib_nfslock
 




More information about the Cluster-devel mailing list