summaryrefslogtreecommitdiffstats
path: root/agents/ocf/Stateful.in
diff options
context:
space:
mode:
Diffstat (limited to 'agents/ocf/Stateful.in')
-rwxr-xr-xagents/ocf/Stateful.in267
1 files changed, 267 insertions, 0 deletions
diff --git a/agents/ocf/Stateful.in b/agents/ocf/Stateful.in
new file mode 100755
index 0000000..c7c5d75
--- /dev/null
+++ b/agents/ocf/Stateful.in
@@ -0,0 +1,267 @@
+#!/bin/sh
+#
+# ocf:pacemaker:Stateful resource agent
+#
+# Copyright 2006-2023 the Pacemaker project contributors
+#
+# The version control history for this file may have further details.
+#
+# This source code is licensed under the GNU General Public License version 2
+# or later (GPLv2+) WITHOUT ANY WARRANTY.
+#
+
+#
+# Example of a stateful OCF Resource Agent
+#
+
+#######################################################################
+# Initialization:
+
+: ${OCF_FUNCTIONS:="${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs"}
+. "${OCF_FUNCTIONS}"
+: ${__OCF_ACTION:="$1"}
+
+# Explicitly list all environment variables used, to make static analysis happy
+: ${OCF_RESKEY_CRM_meta_interval:=0}
+: ${OCF_RESKEY_CRM_meta_globally_unique:="false"}
+: ${OCF_RESKEY_notify_delay:=0}
+: ${OCF_RESKEY_envfile:=""}
+: ${OCF_RESKEY_state:=""}
+
+# Until we can assume the new name is available ...
+: ${OCF_RUNNING_PROMOTED:=$OCF_RUNNING_MASTER}
+
+SCORE_UNPROMOTED=5
+SCORE_PROMOTED=10
+
+#######################################################################
+
+meta_data() {
+ cat <<END
+<?xml version="1.0"?>
+<resource-agent name="Stateful" version="@VERSION@">
+<version>1.1</version>
+
+<longdesc lang="en">
+This is an example resource agent that implements Promoted and Unpromoted roles
+</longdesc>
+<shortdesc lang="en">Example stateful resource agent</shortdesc>
+
+<parameters>
+
+<parameter name="state" unique-group="state">
+<longdesc lang="en">
+Location to store the resource state in
+</longdesc>
+<shortdesc lang="en">State file</shortdesc>
+<content type="string" default="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state" />
+</parameter>
+
+<parameter name="envfile" reloadable="1">
+<longdesc lang="en">
+If this is set, the environment will be dumped to this file for every call.
+</longdesc>
+<shortdesc lang="en">Environment dump file</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+<parameter name="notify_delay" reloadable="1">
+<longdesc lang="en">
+The notify action will sleep for this many seconds before returning,
+to simulate a long-running notify.
+</longdesc>
+<shortdesc lang="en">Notify delay in seconds</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+</parameters>
+
+<actions>
+<action name="start" timeout="20s" />
+<action name="stop" timeout="20s" />
+<action name="monitor" depth="0" timeout="20s" interval="10s" role="Promoted"/>
+<action name="monitor" depth="0" timeout="20s" interval="11s" role="Unpromoted"/>
+<action name="promote" timeout="10s" />
+<action name="demote" timeout="10s" />
+<action name="notify" timeout="5s" />
+<action name="meta-data" timeout="5s" />
+<action name="reload-agent" timeout="10s" />
+<action name="validate-all" timeout="30s" depth="0" />
+</actions>
+</resource-agent>
+END
+ exit $OCF_SUCCESS
+}
+
+#######################################################################
+
+stateful_usage() {
+ cat <<END
+Usage: $0 <action>
+
+where <action> is one of: meta-data validate-all start stop monitor
+ promote demote notify reload-agent
+
+This conforms to the OCF Resource Agent API version 1.1, and expects
+to have OCF-compliant environment variables provided.
+END
+ exit $1
+}
+
+stateful_update() {
+ echo $1 > "${OCF_RESKEY_state}"
+}
+
+stateful_check_state() {
+ target="$1"
+ if [ -f "${OCF_RESKEY_state}" ]; then
+ state=$(cat "${OCF_RESKEY_state}")
+ if [ "$target" = "$state" ]; then
+ return 0
+ fi
+
+ else
+ if [ -z "$target" ]; then
+ return 0
+ fi
+ fi
+
+ return 1
+}
+
+dump_env() {
+ if [ "${OCF_RESKEY_envfile}" != "" ]; then
+ echo "### ${__OCF_ACTION} @ $(date) ###
+$(env | sort)
+###" >> "${OCF_RESKEY_envfile}"
+ fi
+}
+
+set_promotion_score() {
+ "${HA_SBIN_DIR}/crm_attribute" --promotion -v "$1"
+}
+
+stateful_start() {
+ stateful_check_state Promoted
+ if [ $? -eq 0 ]; then
+ # CRM Error - Should never happen
+ return $OCF_RUNNING_PROMOTED
+ fi
+ stateful_update Unpromoted
+ set_promotion_score $SCORE_UNPROMOTED
+ return 0
+}
+
+stateful_demote() {
+ stateful_check_state
+ if [ $? -eq 0 ]; then
+ # CRM Error - Should never happen
+ return $OCF_NOT_RUNNING
+ fi
+ stateful_update Unpromoted
+ set_promotion_score $SCORE_UNPROMOTED
+ return 0
+}
+
+stateful_promote() {
+ stateful_check_state
+ if [ $? -eq 0 ]; then
+ return $OCF_NOT_RUNNING
+ fi
+ stateful_update Promoted
+ set_promotion_score $SCORE_PROMOTED
+ return 0
+}
+
+stateful_stop() {
+ "${HA_SBIN_DIR}/crm_attribute" --promotion -D
+ stateful_check_state Promoted
+ if [ $? -eq 0 ]; then
+ # CRM Error - Should never happen
+ return $OCF_RUNNING_PROMOTED
+ fi
+ if [ -f "${OCF_RESKEY_state}" ]; then
+ rm "${OCF_RESKEY_state}"
+ fi
+ return 0
+}
+
+stateful_monitor() {
+ # for testing
+ if [ -f "${OCF_RESKEY_state}.rc" ]; then
+ rc=$(cat "${OCF_RESKEY_state}.rc")
+ ocf_exit_reason "$rc GB redirected to /dev/null"
+ exit $rc
+ fi
+
+ stateful_check_state Promoted
+ if [ $? -eq 0 ]; then
+ if [ $OCF_RESKEY_CRM_meta_interval -eq 0 ]; then
+ # Restore the promotion score during probes
+ set_promotion_score $SCORE_PROMOTED
+ fi
+ return $OCF_RUNNING_PROMOTED
+ fi
+
+ stateful_check_state Unpromoted
+ if [ $? -eq 0 ]; then
+ if [ $OCF_RESKEY_CRM_meta_interval -eq 0 ]; then
+ # Restore the promotion score during probes
+ set_promotion_score $SCORE_UNPROMOTED
+ fi
+ return $OCF_SUCCESS
+ fi
+
+ if [ -f "${OCF_RESKEY_state}" ]; then
+ echo "File '${OCF_RESKEY_state}' exists but contains unexpected contents"
+ cat "${OCF_RESKEY_state}"
+ return $OCF_ERR_GENERIC
+ fi
+ return 7
+}
+
+stateful_notify() {
+ if [ "${OCF_RESKEY_notify_delay}" != "0" ]; then
+ sleep "${OCF_RESKEY_notify_delay}"
+ fi
+ return $OCF_SUCCESS
+}
+
+stateful_validate() {
+ exit $OCF_SUCCESS
+}
+
+stateful_reload_agent() {
+ return $OCF_SUCCESS
+}
+
+if [ -z "$OCF_RESKEY_state" ]; then
+ if [ "${OCF_RESKEY_CRM_meta_globally_unique}" = "false" ]; then
+ state="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state"
+
+ # Strip off the trailing clone marker
+ OCF_RESKEY_state=$(echo $state | sed s/:[0-9][0-9]*\.state/.state/)
+ else
+ OCF_RESKEY_state="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state"
+ fi
+fi
+
+dump_env
+
+case "$__OCF_ACTION" in
+meta-data) meta_data;;
+start) stateful_start;;
+promote) stateful_promote;;
+demote) stateful_demote;;
+notify) stateful_notify ;;
+stop) stateful_stop;;
+monitor) stateful_monitor;;
+validate-all) stateful_validate;;
+reload-agent) stateful_reload_agent;;
+usage|help) stateful_usage $OCF_SUCCESS;;
+*) stateful_usage $OCF_ERR_UNIMPLEMENTED;;
+esac
+
+exit $?
+
+# vim: set filetype=sh expandtab tabstop=4 softtabstop=4 shiftwidth=4 textwidth=80: