Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add OCF-compliant resource agent for Ceph daemons
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
Showing
4 changed files
with
210 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |