Skip to content

Commit

Permalink
Add OCF-compliant resource agent for Ceph daemons
Browse files Browse the repository at this point in the history
Add a wrapper around the ceph init script that makes
MDS, OSD and MON configurable as Open Cluster Framework
(OCF) compliant cluster resources. Allows Ceph
daemons to tie in with cluster resource managers that
support OCF, such as Pacemaker (http://www.clusterlabs.org).

Disabled by default, configure --with-ocf to enable.

Signed-off-by: Florian Haas <florian@hastexo.com>
  • Loading branch information
fghaas authored and liewegas committed Dec 30, 2011
1 parent 6617063 commit 92cfad4
Show file tree
Hide file tree
Showing 4 changed files with 210 additions and 2 deletions.
8 changes: 8 additions & 0 deletions configure.ac
Expand Up @@ -277,6 +277,12 @@ AM_CONDITIONAL(WITH_LIBATOMIC, [test "$HAVE_ATOMIC_OPS" = "1"])
# [],
# [with_newsyn=no])

AC_ARG_WITH([ocf],
[AS_HELP_STRING([--with-ocf], [build OCF-compliant cluster resource agent])],
,
[with_ocf=no])
AM_CONDITIONAL(WITH_OCF, [ test "$with_ocf" = "yes" ])

# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
Expand Down Expand Up @@ -375,6 +381,8 @@ AM_PATH_PYTHON([2.4],
AC_CONFIG_HEADERS([src/acconfig.h])
AC_CONFIG_FILES([Makefile
src/Makefile
src/ocf/Makefile
src/ocf/ceph
man/Makefile
ceph.spec])
AC_OUTPUT
4 changes: 2 additions & 2 deletions src/Makefile.am
@@ -1,6 +1,6 @@
AUTOMAKE_OPTIONS = gnu
SUBDIRS =
DIST_SUBDIRS = gtest
SUBDIRS = ocf
DIST_SUBDIRS = gtest ocf
CLEANFILES =
bin_PROGRAMS =
# like bin_PROGRAMS, but these targets are only built for debug builds
Expand Down
23 changes: 23 additions & 0 deletions src/ocf/Makefile.am
@@ -0,0 +1,23 @@
EXTRA_DIST = ceph.in Makefile.in

if WITH_OCF
# The root of the OCF resource agent hierarchy
# Per the OCF standard, it's always "lib",
# not "lib64" (even on 64-bit platforms).
ocfdir = $(prefix)/lib/ocf

# The ceph provider directory
radir = $(ocfdir)/resource.d/$(PACKAGE_NAME)

ra_SCRIPTS = ceph

install-data-hook:
$(LN_S) ceph $(DESTDIR)$(radir)/osd
$(LN_S) ceph $(DESTDIR)$(radir)/mds
$(LN_S) ceph $(DESTDIR)$(radir)/mon

uninstall-hook:
rm -f $(DESTDIR)$(radir)/osd
rm -f $(DESTDIR)$(radir)/mds
rm -f $(DESTDIR)$(radir)/mon
endif
177 changes: 177 additions & 0 deletions src/ocf/ceph.in
@@ -0,0 +1,177 @@
#!/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."
longdesc="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."
longdesc="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."
longdesc="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

0 comments on commit 92cfad4

Please sign in to comment.