#!/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 < 1.0 Resource script for an LVM Volume Group. Controls the availability of an LVM Volume Group The name of volume group. Volume group name If set, the volume group will be activated exclusively. Exclusive activation EOF } # # methods: What methods/operations do we support? # VolumeGroup_methods() { cat <&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 $?