From 8b07d095acbbb1069c1fb44142ccfdd0aeed075f Mon Sep 17 00:00:00 2001 From: Oyvind Albrigtsen Date: Wed, 16 May 2018 14:10:49 +0200 Subject: [PATCH] vdo-vol: new resource agent --- doc/man/Makefile.am | 3 +- heartbeat/Makefile.am | 1 + heartbeat/vdo-vol | 234 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 237 insertions(+), 1 deletion(-) create mode 100755 heartbeat/vdo-vol diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index c59126d1..8d94c10c 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -158,11 +158,12 @@ man_MANS = ocf_heartbeat_AoEtarget.7 \ ocf_heartbeat_slapd.7 \ ocf_heartbeat_sybaseASE.7 \ ocf_heartbeat_sg_persist.7 \ - ocf_heartbeat_mpathpersist.7 \ + ocf_heartbeat_mpathpersist.7 \ ocf_heartbeat_symlink.7 \ ocf_heartbeat_syslog-ng.7 \ ocf_heartbeat_tomcat.7 \ ocf_heartbeat_varnish.7 \ + ocf_heartbeat_vdo-vol.7 \ ocf_heartbeat_vmware.7 \ ocf_heartbeat_zabbixserver.7 diff --git a/heartbeat/Makefile.am b/heartbeat/Makefile.am index 4f5059e2..a68fa978 100644 --- a/heartbeat/Makefile.am +++ b/heartbeat/Makefile.am @@ -162,6 +162,7 @@ ocf_SCRIPTS = AoEtarget \ syslog-ng \ tomcat \ varnish \ + vdo-vol \ vmware \ vsftpd \ zabbixserver diff --git a/heartbeat/vdo-vol b/heartbeat/vdo-vol new file mode 100755 index 00000000..074339db --- /dev/null +++ b/heartbeat/vdo-vol @@ -0,0 +1,234 @@ +#!/bin/sh +# +# License: GNU General Public License (GPL) +# (c) 2018 O. Albrigtsen +# and Linux-HA contributors +# +# ----------------------------------------------------------------------------- +# O C F R E S O U R C E S C R I P T S P E C I F I C A T I O N +# ----------------------------------------------------------------------------- +# +# NAME +# vdo-vol : OCF resource agent script for VDO (Virtual Data Optimizer) +# + +# Initialization: +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Defaults +OCF_RESKEY_volume_default="" + +: ${OCF_RESKEY_volume=${OCF_RESKEY_volume_default}} + + +vdo_usage() { + cat < + + +0.75 + + +OCF Resource script for VDO (Virtual Data Optimizer) volume(s). It manages VDO volume(s) as a HA resource. + +The configuration file needs to be synced to all nodes, and the systemd vdo service must be disabled when +using this agent. + +VDO resource agent + + + + + Configuration file + Config file + + + + + VDO Volume (leave empty for all) + Volume (empty for all) + + + + + + + + + + + + + + +END +} + + +rebuild() { + ocf_log warn "${OCF_RESKEY_volume} is in $MODE mode, starting in rebuild mode" + + vdo stop $OPTIONS + + while vdo_monitor skiprocheck; do + sleep 1 + done + + vdo start $OPTIONS --forceRebuild + + while ! vdo_monitor; do + sleep 1 + done + + return $? +} + +vdo_start() { + # if resource is already running,no need to continue code after this. + if vdo_monitor; then + ocf_log info "VDO volume(s): ${OCF_RESKEY_volume} is already active" + return $OCF_SUCCESS + fi + + vdo activate $OPTIONS + vdo start $OPTIONS + + while ! vdo_monitor skiprocheck; do + sleep 1 + done + + MODE=$(vdostats --verbose ${OCF_RESKEY_volume} | grep "operating mode" | awk '{print $NF}') + if [ $(echo "$MODE" | grep -v "normal" | wc -l) -gt 0 ]; then + rebuild + fi + + if [ $? -eq $OCF_SUCCESS ]; then + ocf_log info "VDO volume(s): ${OCF_RESKEY_volume} activated" + return ${OCF_SUCCESS} + fi + + return $? +} + +vdo_stop() { + vdo_monitor skiprocheck + if [ $? -ne $OCF_SUCCESS ]; then + # Currently not running. Nothing to do. + ocf_log info "VDO volume(s): ${OCF_RESKEY_volume} already deactivated" + + return $OCF_SUCCESS + fi + + vdo stop $OPTIONS + vdo deactivate $OPTIONS + + # Wait for process to stop + while vdo_monitor skiprocheck; do + sleep 1 + done + + return $OCF_SUCCESS +} + +vdo_monitor(){ + status=$(vdo status $OPTIONS 2>&1) + MODE=$(vdostats vdo_vol --verbose | grep "operating mode" | awk '{print $NF}') + + case "$status" in + *"Device mapper status: not available"*) + return $OCF_NOT_RUNNING + ;; + *"Device mapper status: "*online*) + if [ "$MODE" = "read-only" ] && [ "$1" != "skiprocheck" ]; then + ocf_log err "VDO volume(s): ${OCF_RESKEY_volume} is in $MODE mode." + return $OCF_ERR_GENERIC + else + return $OCF_SUCCESS + fi + ;; + *) + ocf_log err "VDO volume(s): ${OCF_RESKEY_volume} failed\n$status" + return $OCF_ERR_GENERIC;; + esac +} + +vdo_validate_all(){ + check_binary "vdo" + + if systemctl is-enabled vdo > /dev/null 2>&1; then + ocf_exit_reason "systemd service vdo needs to be disabled" + exit $OCF_ERR_CONFIGURED + fi + + if [ -n "${OCF_RESKEY_config}" ] && [ ! -f "${OCF_RESKEY_config}" ]; then + ocf_exit_reason "Configuration file: ${OCF_RESKEY_config} not found" + exit $OCF_ERR_CONFIGURED + fi + + return $OCF_SUCCESS +} + + +# **************************** MAIN SCRIPT ************************************ + +# Make sure meta-data and usage always succeed +case $__OCF_ACTION in + meta-data) + vdo_meta_data + exit $OCF_SUCCESS + ;; + usage|help) + vdo_usage + exit $OCF_SUCCESS + ;; +esac + +# This OCF agent script need to be run as root user. +if ! ocf_is_root; then + echo "$0 agent script need to be run as root user." + ocf_log debug "$0 agent script need to be run as root user." + exit $OCF_ERR_GENERIC +fi + +if [ -z "${OCF_RESKEY_volume}" ]; then + OPTIONS="-a" +else + OPTIONS="-n ${OCF_RESKEY_volume}" +fi + +if [ -n "${OCF_RESKEY_config}" ]; then + OPTIONS="$OPTIONS -f ${OCF_RESKEY_config}" +fi + +# Translate each action into the appropriate function call +case $__OCF_ACTION in + start) + vdo_validate_all + vdo_start;; + stop) + vdo_stop;; + status|monitor) + vdo_monitor;; + validate-all) + ;; + *) + vdo_usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + +exit $? + +# End of this script -- 2.17.1