On Fri, Oct 30, 2009 at 09:04:45AM +1000, Luke Bigum wrote:
> Here's a patch for the ldirectord resource agent. Makes the RA a lot more
> OCF compliant and generally more robust, comments inline. Questions /
> problems please ask.

Hi Luke,

this looks good to me. A few comments inline.


> --- ldirectord.orij   2009-10-30 08:56:11.328658137 +1000
> +++ ldirectord        2009-10-30 08:55:44.857698098 +1000
> @@ -49,15 +49,23 @@
>  . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
>  
>  #######################################################################
> -
> -# LDIRECTORD=/usr/sbin/ldirectord
> -# LDIRCONF=/etc/ldirectord.cf
> +#
> +#iseek ldirectord OCF Resource Agent
> +#
> +#Modified version of the Heartbeat ldirectord to return better OCF 
> +#return codes. The changes makes the RA much more robust: we don't return
> +#OCF_ERR_CONFIGURED for bad arguments any more which will stop the resource
> +#going fatal cluster wide. We also trap the ldirectord script's normal
> +#exit codes and return OCF compliant codes and make a better effort to
> +#stop ldirectord.

Could you move this changelog out of the code and into the text
in your email accompanying the patch. That way I can put it
into the mercurial commit message which seems to be the most appropriate
place for it.

> +#
> +#######################################################################
>  
>  meta_data() {
>          cat <<END
>  <?xml version="1.0"?>
>  <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> -<resource-agent name="Ldirectord" version="0.9">
> +<resource-agent name="ldirectord" version="0.9">
>  <version>1.0</version>
>  
>  <longdesc lang="en">
> @@ -79,7 +87,7 @@
>  
>  <parameter name="ldirectord">
>  <longdesc lang="en">
> -The full pathname of the ldirectord.
> +The full pathname of ldirectord.
>  </longdesc>
>  <shortdesc lang="en">ldirectord binary path</shortdesc>
>  <content type="string" default="/usr/sbin/ldirectord" />
> @@ -101,41 +109,18 @@
>  #######################################################################
>  
>  ldir_init() {
> -
> -  COMMAND=$1
> -
> -  LDIRCONF=$OCF_RESKEY_configfile
> -  if [ x"${LDIRCONF}" = "x" ]; then
> -    LDIRCONF=/etc/ldirectord.cf
> -  fi
> -
> -  if [ ! -f $LDIRCONF ]; then
> -    case $COMMAND in
> -      stop)  ocf_log warn "$LDIRCONF not found. ldirectord considered 
> stopped"
> -             exit $OCF_SUCCESS;;
> -      monitior)      exit $OCF_NOT_RUNNING;;
> -      status)        exit $LSB_STATUS_STOPPED;;
> -      start) ocf_log warn "$LDIRCONF not found."
> -             exit $OCF_NOT_RUNNING;;
> -    esac
> -  fi
> -
> -  LDIRECTORD=$OCF_RESKEY_ldirectord
> -  if [ x"${LDIRECTORD}" = x ]; then
> -    LDIRECTORD="/usr/sbin/ldirectord"
> -  fi
> -
> -  if [ ! -x $LDIRECTORD ]; then
> -    case $COMMAND in
> -      stop)  ocf_log warn "$LDIRECTORD not found."
> -             exit $OCF_SUCCESS;;
> -      monitor)  exit $OCF_NOT_RUNNING;;
> -      status)        exit $LSB_STATUS_STOPPED;;
> -      start) ocf_log warn "$LDIRECTORD not found."
> -             exit $OCF_NOT_RUNNING;;
> -    esac
> -  fi
> -
> +    #check the supplied parameters exist enough that we can do all the other 
> operations

         Could you make this and other lines <= 80 characters wide?
         Also, I think a space after the # would make things easier
         to read here and elsewhere.

> +    LDIRCONF=${OCF_RESKEY_configfile:-/etc/ha.d/ldirectord.cf}
> +    if [ ! -f $LDIRCONF ]; then
> +        ocf_log warn "$LDIRCONF not found, ldirectord not installed"
> +        exit $OCF_ERR_INSTALLED
> +    fi
> +
> +    LDIRECTORD=${OCF_RESKEY_ldirectord:-/usr/sbin/ldirectord}
> +    if [ ! -x $LDIRECTORD ]; then
> +        ocf_log warn "$LDIRECTORD not found, ldirectord not installed"
> +        exit $OCF_ERR_INSTALLED
> +    fi
>  }
>  
>  ldirectord_usage() {
> @@ -151,58 +136,117 @@
>  }
>  
>  ldirectord_start() {
> +    ldirectord_status
> +    RET=$?
> +
> +    #if ldirectord is already running or there's an error, pass on this 
> return code
> +    if [ $RET -ne $OCF_NOT_RUNNING ]; then
> +        return $RET
> +    fi
> +    

   The line above has trailing whitespace, please remove it.

> +    ocf_log info "Starting ldirectord"
>      $LDIRECTORD $LDIRCONF start
> +    RET=$?
> +    if [ $RET -ne 0 ]; then
> +        return $OCF_ERR_GENERIC
> +    fi
> +
> +    #call status again to make sure we're running properly
> +    ldirectord_status
>  }
>  
>  ldirectord_stop() {
> -    $LDIRECTORD $LDIRCONF stop
> +    #a status check is simple enough to see if ldirectord is running or not. 
> It will also
> +    #error out if there's configuration parsing errors so we can try kill 
> ldirectord even if the
> +    #config is broken.
> +    ldirectord_status
> +    RET=$?
> +
> +    #ldirectord may be running, hard to tell when status returns an error
> +    if [ $RET -eq $OCF_ERR_GENERIC ]; then
> +        #get the PID of the right ldirectord process
> +        PID=`pgrep -f "$LDIRECTORD $LDIRCONF start" 2>&1`
> +        RET=$?
> +        

   The line above has trailing whitespace, please remove it.

> +        if [ $RET -eq 0 ]; then
> +            ocf_log warn "Killing ldirectord($PID) with SIGTERM"
> +            kill $PID
> +        fi
> +        

   The line above has trailing whitespace, please remove it.

> +        pgrep -f "$LDIRECTORD $LDIRCONF start" >/dev/null 2>&1
> +        RET=$?
> +        #if ldirectord is not running any more, we've (kind of) successfully 
> stopped it
> +        if [ $RET -eq 1 ]; then
> +            return $OCF_SUCCESS
> +        else
> +            #ldirectord is still running? Kill it badly
> +            ocf_log warn "Killing ldirectord($PID) with SIGKILL"
> +            kill -9 $PID
> +
> +            pgrep -f "$LDIRECTORD $LDIRCONF start" >/dev/null 2>&1
> +            RET=$?
> +            #if it's not dead after here, we can't really do anything more
> +            if [ $RET -eq 1 ]; then
> +                return $OCF_SUCCESS
> +            fi
> +        fi
> +        

   The line above has trailing whitespace, please remove it.

> +        #if none of our kills work, return an error. This should force the 
> resource unmanaged
> +        #on this node, requiring manual intervention.
> +        return $OCF_ERR_GENERIC
> +    else
> +        ocf_log info "Stopping ldirectord"
> +        #if ldirectord status is not an error, issue a stop. Multiple stops 
> will return 0
> +        $LDIRECTORD $LDIRCONF stop
> +        RET=$?
> +        case $RET in
> +            0) return $OCF_SUCCESS;;
> +            *) return $OCF_ERR_GENERIC;;
> +        esac
> +    fi
>  }
>  
> +#simple check to see if ldirectord is running, returns the proper OCF codes.
>  ldirectord_status() {
>      OUTPUT=`$LDIRECTORD $LDIRCONF status 2>&1`
>      case $? in
> -        1)  echo $OUTPUT
> -            return $OCF_ERR_GENERIC
> -            ;;
> -        0)  echo running
> -            return $OCF_SUCCESS
> -            ;;
> -        3)  echo stopped
> -            return $OCF_SUCCESS
> -            ;;
> -        *)  echo $OUTPUT
> -            return $OCF_ERR_GENERIC
> -            ;;
> +        0) return $OCF_SUCCESS;;
> +        #if there's a stale PID file, we can still attempt start ldirectord, 
> but a status will still return 1,
> +        #so look for this error message. Every other error we shouldn't 
> ignore

           Is this a property of the underlying ldirectord code
           that should be altered?

> +        1) expr match "$OUTPUT" '.*ldirectord stale pid file.*' >/dev/null
> +           if [ $? -eq 0 ]; then
> +               return $OCF_NOT_RUNNING
> +           else
> +              return $OCF_ERR_GENERIC
> +           fi;;
> +        #if there's a config error, can't use ldirectord to do anything else 
> (start, stop, etc) so return badly
> +        2) ocf_log err "$LDIRCONF has configuration errors"
> +           echo $OUTPUT
> +           return $OCF_ERR_GENERIC;;
> +        3) return $OCF_NOT_RUNNING;;
> +        #everything else is an error, haven't looked to hard into the 
> ldirectord code yet, there may be more

           ldirectord should be returning error codes as set out
           for the old linux-ha ra spec. Anything else is probably
           a bug.

> +        #things we can try recover from
> +        *) echo $OUTPUT
> +           return $OCF_ERR_GENERIC;;
>      esac
>  }
>  
>  ldirectord_monitor() {
> -    OUTPUT=`$LDIRECTORD $LDIRCONF status 2>&1`
> -    case $? in
> -        0)  return $OCF_SUCCESS
> -            ;;
> -        3)  return $OCF_NOT_RUNNING
> -            ;;
> -        *)  echo $OUTPUT
> -            return $OCF_ERR_GENERIC
> -            ;;
> -    esac
> +    #check if the process is running first
> +    ldirectord_status
> +    RET=$?
> +
> +    if [ $RET -ne $OCF_SUCCESS ]; then
> +        return $RET
> +    fi
> +
> +    #do more advanced checks here for high OCF_CHECK_LEVELs. Don't know what 
> more we can do at this time,
> +    #a status call already hits LVS in the kernel.
>  }
>  
>  ldirectord_validate() {
> -     if [ ! -f $LDIRCONF ]; then
> -             ocf_log err $LDIRCONF
> -             ocf_log err "Configuration file $LDIRCONF not found!"
> -             exit $OCF_ERR_CONFIGURED
> -     fi
> -
> -     if [ ! -x $LDIRECTORD ]; then
> -             ocf_log err "Binary file $LDIRECTORD not found."
> -             exit $OCF_ERR_CONFIGURED
> -     fi
> -
> -#        exit $OC_ERR_UNIMPLEMENTED
> -     
> +    #ldir_init is already called, there's nothing more we can validate 
> unless we add more attributes
> +    return $OCF_SUCCESS
>  }
>  
>  ldir_init
> @@ -217,9 +261,6 @@
>  stop)   ldirectord_stop
>                  ldirectord_exit $?
>                  ;;
> -status) ldirectord_status
> -                ldirectord_exit $?
> -                ;;
>  monitor)    ldirectord_monitor
>                  ldirectord_exit $?
>                  ;;
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to