mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
e40d44be8d
Updated patch from Florian Haas from Linux-HA project. User needs to 'configure --enable-ocf' to get file installed by 'make install' target by default. User can also use 'make install_ocf' to get only ocf files installed. With disabled (default) ocf support - no ocf files are installed. FIXME: ocf installation path needs to be kept in sync with pacemaker. find better way and possible also better location.
280 lines
6.8 KiB
Bash
280 lines
6.8 KiB
Bash
#!/bin/sh
|
|
#
|
|
# VolumeGroup
|
|
#
|
|
# Description: Manages an LVM2 volume group as an HA resource in
|
|
# an OCF-compliant cluster
|
|
#
|
|
#
|
|
# Authors: Alan Robertson, Lars Marowsky-Bree, Florian Haas,
|
|
# and others from the Linux-HA project
|
|
# License: GNU General Public License (GPL)
|
|
# Copyright: (C) 2002 - 2005 International Business Machines, Inc.
|
|
# (C) 2010 LINBIT HA-Solutions GmbH
|
|
#
|
|
# This code significantly inspired by the LVM resource
|
|
# in FailSafe by Lars Marowsky-Bree
|
|
#
|
|
#######################################################################
|
|
# Initialization:
|
|
|
|
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
|
|
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
|
|
|
|
#######################################################################
|
|
|
|
|
|
usage() {
|
|
methods=`VolumeGroup_methods`
|
|
methods=`echo $methods | tr ' ' '|'`
|
|
cat <<EOF
|
|
usage: $0 $methods
|
|
|
|
$0 manages an LVM Volume Group (VG) as an HA resource
|
|
|
|
The 'start' operation brings the given volume online
|
|
The 'stop' operation takes the given volume offline
|
|
The 'status' operation reports whether the volume is available
|
|
The 'monitor' operation reports whether the volume seems present
|
|
The 'validate-all' operation checks whether the OCF parameters are valid
|
|
The 'methods' operation reports on the methods $0 supports
|
|
|
|
EOF
|
|
}
|
|
|
|
meta_data() {
|
|
cat <<EOF
|
|
<?xml version="1.0"?>
|
|
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
<resource-agent name="VolumeGroup">
|
|
<version>1.0</version>
|
|
|
|
<longdesc lang="en">
|
|
Resource script for an LVM Volume Group.
|
|
</longdesc>
|
|
<shortdesc lang="en">Controls the availability of an LVM Volume Group</shortdesc>
|
|
|
|
<parameters>
|
|
<parameter name="volgrpname" unique="0" required="1">
|
|
<longdesc lang="en">
|
|
The name of volume group.
|
|
</longdesc>
|
|
<shortdesc lang="en">Volume group name</shortdesc>
|
|
<content type="string" default="" />
|
|
</parameter>
|
|
<parameter name="exclusive" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
If set, the volume group will be activated exclusively.
|
|
</longdesc>
|
|
<shortdesc lang="en">Exclusive activation</shortdesc>
|
|
<content type="boolean" default="false" />
|
|
</parameter>
|
|
</parameters>
|
|
|
|
<actions>
|
|
<action name="start" timeout="30" />
|
|
<action name="stop" timeout="30" />
|
|
<action name="status" timeout="30" />
|
|
<action name="monitor" depth="0" timeout="30" interval="10" />
|
|
<action name="methods" timeout="5" />
|
|
<action name="meta-data" timeout="5" />
|
|
<action name="validate-all" timeout="5" />
|
|
</actions>
|
|
</resource-agent>
|
|
EOF
|
|
}
|
|
|
|
#
|
|
# methods: What methods/operations do we support?
|
|
#
|
|
VolumeGroup_methods() {
|
|
cat <<EOF
|
|
start
|
|
stop
|
|
status
|
|
monitor
|
|
methods
|
|
validate-all
|
|
usage
|
|
EOF
|
|
}
|
|
|
|
#
|
|
# Report on LVM volume status. VG may be reported as active
|
|
# ($OCF_SUCCESS) or inactive ($OCF_NOT_RUNNING)
|
|
#
|
|
VolumeGroup_status() {
|
|
|
|
VGOUT=`vgdisplay -v $OCF_RESKEY_volgrpname 2>&1` || exit $OCF_ERR_GENERIC
|
|
echo "$VGOUT" | grep -i 'Status[ \t]*available' >/dev/null
|
|
rc=$?
|
|
|
|
if [ $rc -eq 0 ]; then
|
|
ocf_log debug "LVM Volume Group $OCF_RESKEY_volgrpname is available (started)"
|
|
else
|
|
ocf_log debug "LVM Volume Group $OCF_RESKEY_volgrpname is not available (stopped)"
|
|
return $OCF_NOT_RUNNING
|
|
fi
|
|
|
|
if echo "$VGOUT" | grep -i 'Access.*read/write' >/dev/null; then
|
|
ocf_log debug "Volume $OCF_RESKEY_volgrpname is available read/write (running)"
|
|
else
|
|
ocf_log debug "Volume $OCF_RESKEY_volgrpname is available read-only (running)"
|
|
fi
|
|
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
#
|
|
# Monitor the volume - does it really seem to be working? May report
|
|
# $OCF_SUCCESS or $OCF_NOT_RUNNING like VolumeGroup_status, plus
|
|
# $OCF_ERR_GENERIC in case vgck reports an error.
|
|
#
|
|
VolumeGroup_monitor() {
|
|
if ! VolumeGroup_status $OCF_RESKEY_volgrpname; then
|
|
ocf_log info "LVM Volume Group $OCF_RESKEY_volgrpname is offline"
|
|
return $OCF_NOT_RUNNING
|
|
fi
|
|
|
|
ocf_run vgck $OCF_RESKEY_volgrpname || exit $OCF_ERR_GENERIC
|
|
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
#
|
|
# Activate the volume group, either locally (if $OCF_RESKEY_exclusive
|
|
# is false or unset), or exclusively (if $OCF_RESKEY_exclusive is
|
|
# true).
|
|
# Either returns successfully, or exits with $OCF_ERR_GENERIC.
|
|
#
|
|
VolumeGroup_start() {
|
|
|
|
ocf_log info "Activating volume group $OCF_RESKEY_volgrpname"
|
|
ocf_run vgscan
|
|
|
|
local active_mode
|
|
active_mode="ly"
|
|
if ocf_is_true "$OCF_RESKEY_exclusive" ; then
|
|
active_mode="ey"
|
|
fi
|
|
|
|
ocf_run vgchange -a $active_mode $OCF_RESKEY_volgrpname || exit $OCF_ERR_GENERIC
|
|
|
|
if ! VolumeGroup_status $OCF_RESKEY_volgrpname; then
|
|
ocf_log err "LVM: $OCF_RESKEY_volgrpname did not activate correctly"
|
|
exit $OCF_ERR_GENERIC
|
|
fi
|
|
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
#
|
|
# Deactivate the volume group.
|
|
# Either returns successfully, or exits with $OCF_ERR_GENERIC.
|
|
#
|
|
VolumeGroup_stop() {
|
|
if ! VolumeGroup_status; then
|
|
ocf_log debug "Volume Group $OCF_RESKEY_volgrpname already stopped"
|
|
return $OCF_SUCCESS
|
|
fi
|
|
|
|
ocf_log info "Deactivating volume group $OCF_RESKEY_volgrpname"
|
|
ocf_run vgchange -a ln $OCF_RESKEY_volgrpname || exit $OCF_ERR_GENERIC
|
|
|
|
if VolumeGroup_status; then
|
|
ocf_log err "LVM: $OCF_RESKEY_volgrpname did not stop correctly"
|
|
exit $OCF_ERR_GENERIC
|
|
fi
|
|
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
#
|
|
# Check whether the OCF instance parameters are valid.
|
|
# Either returns successfully, or exits with
|
|
# $OCF_ERR_CONFIGURED if required parameters are missing;
|
|
# $OCF_ERR_INSTALLED if required binaries are missing;
|
|
# $OCF_ERR_GENERIC in case of any other error.
|
|
#
|
|
VolumeGroup_validate_all() {
|
|
|
|
if [ -z $OCF_RESKEY_volgrpname ]; then
|
|
ocf_log err 'Missing required parameter "volgrpname"!'
|
|
exit $OCF_ERR_CONFIGURED
|
|
fi
|
|
|
|
check_binary vgchange
|
|
check_binary vgck
|
|
check_binary vgdisplay
|
|
|
|
# Run the following tests only if we're not invoked by a probe
|
|
# operation
|
|
if ! ocf_is_probe; then
|
|
# Off-the-shelf tests...
|
|
vgck "$OCF_RESKEY_volgrpname" >/dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
ocf_log err "Volume group $OCF_RESKEY_volgrpname does not exist or contains error!"
|
|
exit $OCF_ERR_GENERIC
|
|
fi
|
|
|
|
# Double-check
|
|
vgdisplay -v "$OCF_RESKEY_volgrpname" >/dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
ocf_log err "Volume group $OCF_RESKEY_volgrpname does not exist or contains error!"
|
|
exit $OCF_ERR_GENERIC
|
|
fi
|
|
fi
|
|
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
#
|
|
# 'main' starts here...
|
|
#
|
|
if [ $# -ne 1 ]; then
|
|
usage
|
|
exit $OCF_ERR_ARGS
|
|
fi
|
|
|
|
case $1 in
|
|
meta-data) meta_data
|
|
exit $OCF_SUCCESS;;
|
|
|
|
methods) VolumeGroup_methods
|
|
exit $OCF_SUCCESS;;
|
|
|
|
usage) usage
|
|
exit $OCF_SUCCESS;;
|
|
*) ;;
|
|
esac
|
|
|
|
# Everything except usage and meta-data must pass the validate test
|
|
VolumeGroup_validate_all
|
|
|
|
# What kind of method was invoked?
|
|
case "$1" in
|
|
start)
|
|
VolumeGroup_start
|
|
;;
|
|
stop)
|
|
VolumeGroup_stop
|
|
;;
|
|
status)
|
|
VolumeGroup_status
|
|
;;
|
|
monitor)
|
|
VolumeGroup_monitor
|
|
;;
|
|
validate-all)
|
|
;;
|
|
notify|promote|demote|migrate_from|migrate_to)
|
|
usage
|
|
exit $OCF_ERR_UNIMPLEMENTED
|
|
;;
|
|
*) usage
|
|
exit $OCF_ERR_ARGS
|
|
;;
|
|
esac
|
|
|
|
exit $?
|