diff --git a/heartbeat/Xen.in b/heartbeat/Xen.in index ea64e390a..a33cc15b4 100644 --- a/heartbeat/Xen.in +++ b/heartbeat/Xen.in @@ -1,208 +1,206 @@ #!/bin/sh # # # Support: linux-ha@lists.linux-ha.org # License: GNU General Public License (GPL) # # Resource Agent for the Xen Hypervisor. # Manages Xen virtual machine instances by # mapping cluster resource start and stop, # to Xen create and shutdown, respectively. # # usage: $0 {start|stop|status|monitor|meta-data} # # OCF parameters are as below: # OCF_RESKEY_xmfile # Absolute path to the Xen control file, # for this virtual machine. ####################################################################### # Initialization: . @hb_libdir@/ocf-shellfuncs ####################################################################### DOMAIN_NAME="$OCF_RESOURCE_INSTANCE" usage() { cat <<-! usage: $0 {start|stop|status|monitor|meta-data|validate-all} ! } meta_data() { cat < 1.0 Resource Agent for the Xen Hypervisor. Manages Xen virtual machine instances by mapping cluster resource start and stop, to Xen create and shutdown, respectively. Para-virtualized guests can also be migrated by enabling the meta_attribute allow_migrate. Manages Xen DomUs Absolute path to the Xen control file, for this virtual machine. Xen control file END } Xen_Status() { - xm list $DOMAIN_NAME - rc=$? - if - [ $rc -ne 0 ] - then - return $OCF_NOT_RUNNING - else + STATUS=`xm list --long $DOMAIN_NAME | grep status 2>/dev/null` + STATUS_NOSPACES=`echo "$STATUS" | awk '{ print $1,$2}'` + if [ "$STATUS_NOSPACES" = "(status 2)" ] ; then return $OCF_SUCCESS + else + return $OCF_NOT_RUNNING fi } Xen_Monitor() { Xen_Status } Xen_Start() { if Xen_Status then ocf_log info "Xen domain $DOMAIN_NAME already running." return $OCF_SUCCESS else xm create $OCF_RESKEY_xmfile name=$DOMAIN_NAME rc=$? if [ $rc -ne 0 ] then return $OCF_ERR_PERM else return $OCF_SUCCESS fi fi } Xen_Stop() { if Xen_Status then # TODO: If after 50% of our timeout this one doesn't return, we # should instead switch to xm destroy # TODO: Should we just always use xm destroy here in the meantime # to make sure we indeed always stop? xm shutdown -w $DOMAIN_NAME rc=$? if [ $rc -ne 0 ] then return $OCF_ERR_PERM else return $OCF_SUCCESS fi else ocf_log info "Xen domain $DOMAIN_NAME already stopped." return $OCF_SUCCESS fi } Xen_Migrate_To() { target_node="$OCF_RESKEY_CRM_meta_migrate_target" if Xen_Status then ocf_log info "$DOMAIN_NAME: Starting xm migrate to $target_node" xm migrate --live $DOMAIN_NAME $target_node rc=$? if [ $rc -ne 0 ] then ocf_log err "$DOMAIN_NAME: xm migrate to $target_node failed: $rc" return $OCF_ERR_PERM else ocf_log err "$DOMAIN_NAME: xm migrate to $target_node succeeded." return $OCF_SUCCESS fi else ocf_log err "$DOMAIN_NAME: migrate_to: Not active locally!" return $OCF_ERR_PERM fi } Xen_Migrate_From() { if Xen_Status then ocf_log info "$DOMAIN_NAME: Active locally, migration successful" return $OCF_SUCCESS else ocf_log err "$DOMAIN_NAME: Not active locally, migration failed!" return $OCF_ERR_PERM fi } Xen_Validate_All() { return $OCF_SUCCESS } if [ $# -ne 1 ]; then usage exit $OCF_ERR_ARGS fi case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; start) Xen_Start ;; stop) Xen_Stop ;; migrate_to) Xen_Migrate_To ;; migrate_from) Xen_Migrate_From ;; monitor) Xen_Monitor ;; status) Xen_Status ;; validate-all) Xen_Validate_All ;; usage) usage exit $OCF_SUCCESS ;; *) usage exit $OCF_ERR_ARGS ;; esac exit $?