#!/bin/sh

# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs

# Convenience variables
# When sysconfdir isn't passed in as a configure flag,
# it's defined in terms of prefix
prefix=@prefix@
CEPH_INIT=@sysconfdir@/init.d/ceph

ceph_meta_data() {
    local longdesc
    local shortdesc
    case $__SCRIPT_NAME in
	"osd")
	    longdesc="Wraps the ceph init script to provide an OCF resource agent that manages and monitors the Ceph OSD service."
	    shortdesc="Manages a Ceph OSD instance."
	    ;;
	"mds")
	    longdesc="Wraps the ceph init script to provide an OCF resource agent that manages and monitors the Ceph MDS service."
	    shortdesc="Manages a Ceph MDS instance."
	    ;;
	"mon")
	    longdesc="Wraps the ceph init script to provide an OCF resource agent that manages and monitors the Ceph MON service."
	    shortdesc="Manages a Ceph MON instance."
	    ;;
    esac
    
cat <<EOF
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="${__SCRIPT_NAME}" version="0.1">
  <version>0.1</version>
  <longdesc lang="en">${longdesc}</longdesc>
  <shortdesc lang="en">${shortdesc}</shortdesc>
  <parameters/>
  <actions>
    <action name="start"        timeout="20" />
    <action name="stop"         timeout="20" />
    <action name="monitor"      timeout="20"
                                interval="10"/>
    <action name="meta-data"    timeout="5" />
    <action name="validate-all"   timeout="20" />
  </actions>
</resource-agent>
EOF
}

ceph_action() {
    local init_action
    init_action="$1"

    case ${__SCRIPT_NAME} in
	osd|mds|mon)
	    ocf_run $CEPH_INIT $init_action ${__SCRIPT_NAME}
	    ;;
	*)
	    ocf_run $CEPH_INIT $init_action
	    ;;
    esac
}

ceph_validate_all() {
    # Do we have the ceph init script?
    check_binary @sysconfdir@/init.d/ceph

    # Do we have a configuration file?
    [ -e @sysconfdir@/ceph/ceph.conf ] || exit $OCF_ERR_INSTALLED
}

ceph_monitor() {
    local rc

    ceph_action status

    # 0: running, and fully caught up with master
    # 3: gracefully stopped
    # any other: error
    case "$?" in
        0)
            rc=$OCF_SUCCESS
            ocf_log debug "Resource is running"
            ;;
        3)
            rc=$OCF_NOT_RUNNING
            ocf_log debug "Resource is not running"
            ;;
        *)
            ocf_log err "Resource has failed"
            rc=$OCF_ERR_GENERIC
    esac

    return $rc
}

ceph_start() {
    # if resource is already running, bail out early
    if ceph_monitor; then
        ocf_log info "Resource is already running"
        return $OCF_SUCCESS
    fi

    ceph_action start

    while ! ceph_monitor; do
        ocf_log debug "Resource has not started yet, waiting"
        sleep 1
    done

    return $OCF_SUCCESS
}

ceph_stop() {
    local rc

    # exit immediately if configuration is not valid
    ceph_validate_all || exit $?

    ceph_monitor
    rc=$?
    case "$rc" in
        "$OCF_SUCCESS")
            # Currently running. Normal, expected behavior.
            ocf_log debug "Resource is currently running"
            ;;
        "$OCF_NOT_RUNNING")
            # Currently not running. Nothing to do.
            ocf_log info "Resource is already stopped"
            return $OCF_SUCCESS
            ;;
    esac

    ceph_action stop

    while ceph_monitor; do
        ocf_log debug "Resource has not stopped yet, waiting"
        sleep 1
    done

    # only return $OCF_SUCCESS if _everything_ succeeded as expected
    return $OCF_SUCCESS

}



# Make sure meta-data and usage always succeed
case $__OCF_ACTION in
meta-data)      ceph_meta_data
                exit $OCF_SUCCESS
                ;;
usage|help)     ceph_usage
                exit $OCF_SUCCESS
                ;;
esac

# Anything other than meta-data and usage must pass validation
ceph_validate_all || exit $?

# Translate each action into the appropriate function call
case $__OCF_ACTION in
start)          ceph_start;;
stop)           ceph_stop;;
status|monitor) ceph_monitor;;
reload)         ocf_log info "Reloading..."
                ceph_start
                ;;
validate-all)   ;;
*)              ceph_usage
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac
rc=$?

exit $rc
