diff --git a/ocf/dcmanager-api b/ocf/dcmanager-api new file mode 100644 index 000000000..50ae3570b --- /dev/null +++ b/ocf/dcmanager-api @@ -0,0 +1,323 @@ +#!/bin/sh +# OpenStack DC Manager API Service (dcmanager-api) +# +# Description: Manages an OpenStack DC Manager API Service (dcmanager-api) process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="dcmanager-api" +OCF_RESKEY_config_default="/etc/dcmanager/dcmanager.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Manager API Service (dcmanager-api) + +Manages the OpenStack DC Manager API Service(dcmanager-api) + + + + +Location of the DC Manager API server binary (dcmanager-api) + +DC Manager API server binary (dcmanager-api) + + + + + +Location of the DC Manager API (dcmanager-api) configuration file + +DC Manager API (dcmanager-api registry) config file + + + + + +User running DC Manager API (dcmanager-api) + +DC Manager API (dcmanager-api) user + + + + + +The pid file to use for this DC Manager API (dcmanager-api) instance + +DC Manager API (dcmanager-api) pid file + + + + + +Additional parameters to pass on to the OpenStack NovaAPI (dcmanager-api) + +Additional parameters for dcmanager-api + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcmanager_api_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcmanager_api_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Manager API (dcmanager-api) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Manager API (dcmanager-api) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcmanager_api_monitor() { + local rc + + dcmanager_api_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Manager API (dcmanager-api) monitor succeeded" + return $OCF_SUCCESS +} + +dcmanager_api_start() { + local rc + + dcmanager_api_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Manager API (dcmanager-api) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcmanager-api daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcmanager_api_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Manager API (dcmanager-api) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Manager API (dcmanager-api) started" + return $OCF_SUCCESS +} + +dcmanager_api_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_processes=`pgrep -l -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + pkill -KILL -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)" + fi +} + +dcmanager_api_stop() { + local rc + local pid + + dcmanager_api_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Manager API (dcmanager-api) already stopped" + dcmanager_api_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Manager API (dcmanager-api) couldn't be stopped" + dcmanager_api_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcmanager_api_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Manager API (dcmanager-api) still hasn't stopped yet. Waiting ..." + done + + dcmanager_api_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Manager API (dcmanager-api) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcmanager_api_confirm_stop + + ocf_log info "DC Manager API (dcmanager-api) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcmanager_api_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcmanager_api_start;; + stop) dcmanager_api_stop;; + status) dcmanager_api_status;; + monitor) dcmanager_api_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcmanager-manager b/ocf/dcmanager-manager new file mode 100644 index 000000000..835fb26c0 --- /dev/null +++ b/ocf/dcmanager-manager @@ -0,0 +1,325 @@ +#!/bin/sh +# OpenStack DC Manager Service (dcmanager-manager) +# +# Description: +# Manages an OpenStack DC Manager Service (dcmanager-manager) +# process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcmanager-manager" +OCF_RESKEY_config_default="/etc/dcmanager/dcmanager.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Manager service (dcmanager-manager) + +Manages the OpenStack DC Manager Service (dcmanager-manager) + + + + +Location of the DC Manager Service binary (dcmanager-manager) + +DC Manager Service binary (dcmanager-manager) + + + + + +Location of the DC Manager Service (dcmanager-manager) configuration file + +DC Manager Service (dcmanager-manager registry) config file + + + + + +User running DC Manager Service (dcmanager-manager) + +DC Manager Service (dcmanager-manager) user + + + + + +The pid file to use for this DC Manager Service (dcmanager-manager) instance + +DC Manager Service (dcmanager-manager) pid file + + + + + +Additional parameters to pass on to the OpenStack NovaAPI (dcmanager-manager) + +Additional parameters for dcmanager-manager + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcmanager_manager_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcmanager_manager_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Manager Service (dcmanager-manager) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Manager Service (dcmanager-manager) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcmanager_manager_monitor() { + local rc + + dcmanager_manager_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Manager Service (dcmanager-manager) monitor succeeded" + return $OCF_SUCCESS +} + +dcmanager_manager_start() { + local rc + + dcmanager_manager_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Manager Service (dcmanager-manager) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcmanager-manager daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcmanager_manager_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Manager Service (dcmanager-manager) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Manager Service (dcmanager-manager) started" + return $OCF_SUCCESS +} + +dcmanager_manager_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_processes=`pgrep -l -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + pkill -KILL -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)" + fi +} + +dcmanager_manager_stop() { + local rc + local pid + + dcmanager_manager_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Manager Service (dcmanager-manager) already stopped" + dcmanager_manager_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Manager Service (dcmanager-manager) couldn't be stopped" + dcmanager_manager_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcmanager_manager_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Manager Service (dcmanager-manager) still hasn't stopped yet. Waiting ..." + done + + dcmanager_manager_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Manager Service (dcmanager-manager) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcmanager_manager_confirm_stop + + ocf_log info "DC Manager Service (dcmanager-manager) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcmanager_manager_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcmanager_manager_start;; + stop) dcmanager_manager_stop;; + status) dcmanager_manager_status;; + monitor) dcmanager_manager_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-cinder-api-proxy b/ocf/dcorch-cinder-api-proxy new file mode 100644 index 000000000..30d808fc4 --- /dev/null +++ b/ocf/dcorch-cinder-api-proxy @@ -0,0 +1,327 @@ +#!/bin/sh +# OpenStack DC Orchestrator Cinder Api Proxy Service (dcorch-cinder-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator Cinder Api Proxy Service (dcorch-cinder-api-proxy) +# process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Cinder API proxy service (dcorch-cinder-api-proxy) + +Manages the OpenStack DC Orchestrator Cinder Api Proxy Service (dcorch-cinder-api-proxy) + + + + +Location of the DC Orchestrator Cinder API proxy server binary (dcorch-cinder-api-proxy) + +DC Orchestrator Cinder API proxy server binary (dcorch-cinder-api-proxy) + + + + + +Location of the DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) configuration file + +DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy registry) config file + + + + + +User running DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) + +DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) instance + +DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) pid file + + + + + +Additional parameters to pass on to the OpenStack Cinder API (dcorch-cinder-api-proxy) + +Additional parameters for dcorch-cinder-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_cinder_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_cinder_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_cinder_api_proxy_monitor() { + local rc + + dcorch_cinder_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_cinder_api_proxy_start() { + local rc + + dcorch_cinder_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-cinder-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type volume \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_cinder_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_cinder_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="volume" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_cinder_api_proxy_stop() { + local rc + local pid + + dcorch_cinder_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) already stopped" + dcorch_cinder_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) couldn't be stopped" + dcorch_cinder_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_cinder_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_cinder_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_cinder_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator Cinder API proxy (dcorch-cinder-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_cinder_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_cinder_api_proxy_start;; + stop) dcorch_cinder_api_proxy_stop;; + status) dcorch_cinder_api_proxy_status;; + monitor) dcorch_cinder_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-engine b/ocf/dcorch-engine new file mode 100644 index 000000000..48b3d1bee --- /dev/null +++ b/ocf/dcorch-engine @@ -0,0 +1,323 @@ +#!/bin/sh +# OpenStack DC Orchestrator Engine Service (dcorch-engine) +# +# Description: Manages an OpenStack DC Orchestrator Engine Service (dcorch-engine) process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-engine" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Engine Service (dcorch-engine) + +Manages the OpenStack DC Orchestrator Engine Service(dcorch-engine) + + + + +Location of the DC Orchestrator Engine binary (dcorch-engine) + +DC Orchestrator Engine binary (dcorch-engine) + + + + + +Location of the DC Orchestrator Engine (dcorch-engine) configuration file + +DC Orchestrator Engine (dcorch-engine registry) config file + + + + + +User running DC Orchestrator Engine (dcorch-engine) + +DC Orchestrator Engine (dcorch-engine) user + + + + + +The pid file to use for this DC Orchestrator Engine (dcorch-engine) instance + +DC Orchestrator Engine (dcorch-engine) pid file + + + + + +Additional parameters to pass on to the OpenStack DC Orchestrator Engine (dcorch-engine) + +Additional parameters for dcorch-engine + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_engine_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_engine_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Engine (dcorch-engine) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Engine (dcorch-engine) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_engine_monitor() { + local rc + + dcorch_engine_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Engine (dcorch-engine) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_engine_start() { + local rc + + dcorch_engine_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Engine (dcorch-engine) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-engine daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_engine_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Engine (dcorch-engine) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Engine (dcorch-engine) started" + return $OCF_SUCCESS +} + +dcorch_engine_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_processes=`pgrep -l -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + pkill -KILL -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)" + fi +} + +dcorch_engine_stop() { + local rc + local pid + + dcorch_engine_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Engine (dcorch-engine) already stopped" + dcorch_engine_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Engine (dcorch-engine) couldn't be stopped" + dcorch_engine_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_engine_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Engine (dcorch-engine) still hasn't stopped yet. Waiting ..." + done + + dcorch_engine_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Engine (dcorch-engine) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_engine_confirm_stop + + ocf_log info "DC Orchestrator Engine (dcorch-engine) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_engine_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_engine_start;; + stop) dcorch_engine_stop;; + status) dcorch_engine_status;; + monitor) dcorch_engine_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-identity-api-proxy b/ocf/dcorch-identity-api-proxy new file mode 100644 index 000000000..e38f22baa --- /dev/null +++ b/ocf/dcorch-identity-api-proxy @@ -0,0 +1,327 @@ +#!/bin/sh +# OpenStack DC Orchestrator Identity Api Proxy Service (dcorch-identity-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator Identity Api Proxy Service (dcorch-identity-api-proxy) +# process as an HA resource +# +# +# Copyright (c) 2018 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="dcorch" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Identity Api proxy service (dcorch-identity-api-proxy) + +Manages the OpenStack DC Orchestrator Identity Api Proxy Service (dcorch-identity-api-proxy) + + + + +Location of the DC Orchestrator Identity Api proxy server binary (dcorch-identity-api-proxy) + +DC Orchestrator Identity Api proxy server binary (dcorch-identity-api-proxy) + + + + + +Location of the DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) configuration file + +DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy registry) config file + + + + + +User running DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) + +DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) instance + +DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) pid file + + + + + +Additional parameters to pass on to the OpenStack identity API (dcorch-identity-api-proxy) + +Additional parameters for dcorch-identity-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_identity_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_identity_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_identity_api_proxy_monitor() { + local rc + + dcorch_identity_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_identity_api_proxy_start() { + local rc + + dcorch_identity_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-identity-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type identity \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_identity_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_identity_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="identity" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_identity_api_proxy_stop() { + local rc + local pid + + dcorch_identity_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) already stopped" + dcorch_identity_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) couldn't be stopped" + dcorch_identity_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_identity_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_identity_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_identity_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator Identity Api proxy (dcorch-identity-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_identity_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_identity_api_proxy_start;; + stop) dcorch_identity_api_proxy_stop;; + status) dcorch_identity_api_proxy_status;; + monitor) dcorch_identity_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-neutron-api-proxy b/ocf/dcorch-neutron-api-proxy new file mode 100644 index 000000000..b3e659a5a --- /dev/null +++ b/ocf/dcorch-neutron-api-proxy @@ -0,0 +1,327 @@ +#!/bin/sh +# OpenStack DC Orchestrator Neutron Api Proxy Service (dcorch-neutron-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator Neutron Api Proxy Service (dcorch-neutron-api-proxy) +# process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Neutron API proxy service (dcorch-neutron-api-proxy) + +Manages the OpenStack DC Orchestrator Neutron Api Proxy Service (dcorch-neutron-api-proxy) + + + + +Location of the DC Orchestrator Neutron Api proxy server binary (dcorch-neutron-api-proxy) + +DC Orchestrator Neutron Api proxy server binary (dcorch-neutron-api-proxy) + + + + + +Location of the DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) configuration file + +DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy registry) config file + + + + + +User running DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) + +DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) instance + +DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) pid file + + + + + +Additional parameters to pass on to the OpenStack NeutronAPI (dcorch-neutron-api-proxy) + +Additional parameters for dcorch-neutron-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_neutron_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_neutron_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_neutron_api_proxy_monitor() { + local rc + + dcorch_neutron_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_neutron_api_proxy_start() { + local rc + + dcorch_neutron_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-neutron-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type network \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_neutron_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_neutron_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="network" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_neutron_api_proxy_stop() { + local rc + local pid + + dcorch_neutron_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) already stopped" + dcorch_neutron_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) couldn't be stopped" + dcorch_neutron_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_neutron_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_neutron_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_neutron_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator Neutron Api proxy (dcorch-neutron-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_neutron_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_neutron_api_proxy_start;; + stop) dcorch_neutron_api_proxy_stop;; + status) dcorch_neutron_api_proxy_status;; + monitor) dcorch_neutron_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-nova-api-proxy b/ocf/dcorch-nova-api-proxy new file mode 100644 index 000000000..9890f7fcf --- /dev/null +++ b/ocf/dcorch-nova-api-proxy @@ -0,0 +1,327 @@ +#!/bin/sh +# OpenStack DC Orchestrator Nova Api Proxy Service (dcorch-nova-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator Nova Api Proxy Service (dcorch-nova-api-proxy) +# process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Nova API proxy service (dcorch-nova-api-proxy) + +Manages the OpenStack DC Orchestrator Nova Api Proxy Service (dcorch-nova-api-proxy) + + + + +Location of the DC Orchestrator Nova Api proxy server binary (dcorch-nova-api-proxy) + +DC Orchestrator Nova Api proxy server binary (dcorch-nova-api-proxy) + + + + + +Location of the DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) configuration file + +DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy registry) config file + + + + + +User running DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) + +DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) instance + +DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) pid file + + + + + +Additional parameters to pass on to the OpenStack NovaAPI (dcorch-nova-api-proxy) + +Additional parameters for dcorch-nova-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_nova_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_nova_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_nova_api_proxy_monitor() { + local rc + + dcorch_nova_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_nova_api_proxy_start() { + local rc + + dcorch_nova_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-nova-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type compute \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_nova_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_nova_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="compute" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_nova_api_proxy_stop() { + local rc + local pid + + dcorch_nova_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) already stopped" + dcorch_nova_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) couldn't be stopped" + dcorch_nova_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_nova_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_nova_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_nova_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator Nova Api proxy (dcorch-nova-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_nova_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_nova_api_proxy_start;; + stop) dcorch_nova_api_proxy_stop;; + status) dcorch_nova_api_proxy_status;; + monitor) dcorch_nova_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-patch-api-proxy b/ocf/dcorch-patch-api-proxy new file mode 100644 index 000000000..6bb0eb123 --- /dev/null +++ b/ocf/dcorch-patch-api-proxy @@ -0,0 +1,326 @@ +#!/bin/sh +# OpenStack DC Orchestrator Patching Api Proxy Service (dcorch-patch-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator Patching Api Proxy Service (dcorch-patch-api-proxy) +# process as an HA resource +# +# Copyright (c) 2018 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator Patching Api proxy service (dcorch-patch-api-proxy) + +Manages the OpenStack DC Orchestrator Patching Api Proxy Service (dcorch-patch-api-proxy) + + + + +Location of the DC Orchestrator Patching Api proxy server binary (dcorch-patch-api-proxy) + +DC Orchestrator Patching Api proxy server binary (dcorch-patch-api-proxy) + + + + + +Location of the DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) configuration file + +DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy registry) config file + + + + + +User running DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) + +DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) instance + +DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) pid file + + + + + +Additional parameters to pass on to this DC Orchestrator Patching API (dcorch-patch-api-proxy) + +Additional parameters for dcorch-patch-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_patch_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_patch_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_patch_api_proxy_monitor() { + local rc + + dcorch_patch_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_patch_api_proxy_start() { + local rc + + dcorch_patch_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-patch-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type patching \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_patch_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_patch_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="patching" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_patch_api_proxy_stop() { + local rc + local pid + + dcorch_patch_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) already stopped" + dcorch_patch_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) couldn't be stopped" + dcorch_patch_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_patch_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_patch_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_patch_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator Patching Api proxy (dcorch-patch-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_patch_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_patch_api_proxy_start;; + stop) dcorch_patch_api_proxy_stop;; + status) dcorch_patch_api_proxy_status;; + monitor) dcorch_patch_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac diff --git a/ocf/dcorch-snmp b/ocf/dcorch-snmp new file mode 100644 index 000000000..ef0802906 --- /dev/null +++ b/ocf/dcorch-snmp @@ -0,0 +1,323 @@ +#!/bin/sh +# OpenStack Distributed Cloud snmp Service (dcorch-snmp) +# +# Description: Manages an OpenStack DC Orchestrator SNMP Service (dcorch-snmp) process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="dcorch-snmp" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator SNMP Service (dorch-snmp) + +Manages the OpenStack DC Orchestrator SNMP service(dorch-snmp) + + + + +Location of the DC Orchestrator SNMP server binary (dorch-snmp) + +DC Orchestrator SNMP server binary (dorch-snmp) + + + + + +Location of the DC Orchestrator SNMP (dorch-snmp) configuration file + +DC Orchestrator SNMP (dorch-snmp registry) config file + + + + + +User running DC Orchestrator SNMP (dorch-snmp) + +DC Orchestrator SNMP (dorch-snmp) user + + + + + +The pid file to use for this DC Orchestrator SNMP (dorch-snmp) instance + +DC Orchestrator SNMP (dorch-snmp) pid file + + + + + +Additional parameters to pass on to the OpenStack NovaAPI (dorch-snmp) + +Additional parameters for dorch-snmp + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_snmp_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_snmp_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator SNMP (dorch-snmp) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator SNMP (dorch-snmp) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_snmp_monitor() { + local rc + + dcorch_snmp_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator SNMP (dorch-snmp) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_snmp_start() { + local rc + + dcorch_snmp_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator SNMP (dorch-snmp) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dorch-snmp daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_snmp_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator SNMP (dorch-snmp) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator SNMP (dorch-snmp) started" + return $OCF_SUCCESS +} + +dcorch_snmp_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_processes=`pgrep -l -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + pkill -KILL -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)" + fi +} + +dcorch_snmp_stop() { + local rc + local pid + + dcorch_snmp_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator SNMP (dorch-snmp) already stopped" + dcorch_snmp_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator SNMP (dorch-snmp) couldn't be stopped" + dcorch_snmp_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_snmp_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator SNMP (dorch-snmp) still hasn't stopped yet. Waiting ..." + done + + dcorch_snmp_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator SNMP (dorch-snmp) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_snmp_confirm_stop + + ocf_log info "DC Orchestrator SNMP (dorch-snmp) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_snmp_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_snmp_start;; + stop) dcorch_snmp_stop;; + status) dcorch_snmp_status;; + monitor) dcorch_snmp_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac + diff --git a/ocf/dcorch-sysinv-api-proxy b/ocf/dcorch-sysinv-api-proxy new file mode 100644 index 000000000..a5a42a63f --- /dev/null +++ b/ocf/dcorch-sysinv-api-proxy @@ -0,0 +1,327 @@ +#!/bin/sh +# OpenStack DC Orchestrator System Inventory Api Proxy Service (dcorch-sysinv-api-proxy) +# +# Description: +# Manages an OpenStack DC Orchestrator System Inventory Api Proxy Service (dcorch-sysinv-api-proxy) +# process as an HA resource +# +# Copyright (c) 2017 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_additional_parameters +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# Fill in some defaults if no values are specified + +OCF_RESKEY_binary_default="/usr/bin/dcorch-api-proxy" +OCF_RESKEY_config_default="/etc/dcorch/dcorch.conf" +OCF_RESKEY_user_default="root" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the DC Orchestrator System Inventory Api proxy service (dcorch-sysinv-api-proxy) + +Manages the OpenStack DC Orchestrator System Inventory Api Proxy Service (dcorch-sysinv-api-proxy) + + + + +Location of the DC Orchestrator System Inventory Api proxy server binary (dcorch-sysinv-api-proxy) + +DC Orchestrator System Inventory Api proxy server binary (dcorch-sysinv-api-proxy) + + + + + +Location of the DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) configuration file + +DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy registry) config file + + + + + +User running DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) + +DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) user + + + + + +The pid file to use for this DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) instance + +DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) pid file + + + + + +Additional parameters to pass on to the OpenStack sysinv API (dcorch-sysinv-api-proxy) + +Additional parameters for dcorch-sysinv-api-proxy + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +dcorch_sysinv_api_proxy_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary curl + check_binary tr + check_binary grep + check_binary cut + check_binary head + + # A config file on shared storage that is not available + # during probes is OK. + if [ ! -f $OCF_RESKEY_config ]; then + if ! ocf_is_probe; then + ocf_log err "Config $OCF_RESKEY_config doesn't exist" + return $OCF_ERR_INSTALLED + fi + ocf_log_warn "Config $OCF_RESKEY_config not available during a probe" + fi + + getent passwd $OCF_RESKEY_user >/dev/null 2>&1 + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "User $OCF_RESKEY_user doesn't exist" + return $OCF_ERR_INSTALLED + fi + + true +} + +dcorch_sysinv_api_proxy_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) is not running" + return $OCF_NOT_RUNNING + else + pid=`cat $OCF_RESKEY_pid` + fi + + ocf_run -warn kill -s 0 $pid + rc=$? + if [ $rc -eq 0 ]; then + return $OCF_SUCCESS + else + ocf_log info "Old PID file found, but DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) is not running" + rm -f $OCF_RESKEY_pid + return $OCF_NOT_RUNNING + fi +} + +dcorch_sysinv_api_proxy_monitor() { + local rc + + dcorch_sysinv_api_proxy_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Further verify the service availibility. + + ocf_log debug "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) monitor succeeded" + return $OCF_SUCCESS +} + +dcorch_sysinv_api_proxy_start() { + local rc + + dcorch_sysinv_api_proxy_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) already running" + return $OCF_SUCCESS + fi + + # Change the working dir to /, to be sure it's accesible + cd / + + # run the actual dcorch-sysinv-api-proxy daemon. Don't use ocf_run as we're sending the tool's output + # straight to /dev/null anyway and using ocf_run would break stdout-redirection here. + su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config --type platform \ + $OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid + + # Spin waiting for the server to come up. + # Let the CRM/LRM time us out if required + while true; do + dcorch_sysinv_api_proxy_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) started" + return $OCF_SUCCESS +} + +dcorch_sysinv_api_proxy_confirm_stop() { + local my_bin + local my_processes + + my_binary=`which ${OCF_RESKEY_binary}` + my_type="platform" + my_processes=`pgrep -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary} .*--type ${my_type}([^\w-]|$)"` + + if [ -n "${my_processes}" ] + then + ocf_log info "About to SIGKILL the following: ${my_processes}" + # replace the new line with with a space in the process list + kill -9 `echo "${my_processes}" | tr '\n' ' '` + fi +} + +dcorch_sysinv_api_proxy_stop() { + local rc + local pid + + dcorch_sysinv_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) already stopped" + dcorch_sysinv_api_proxy_confirm_stop + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) couldn't be stopped" + dcorch_sysinv_api_proxy_confirm_stop + exit $OCF_ERR_GENERIC + fi + + # stop waiting + shutdown_timeout=15 + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5)) + fi + count=0 + while [ $count -lt $shutdown_timeout ]; do + dcorch_sysinv_api_proxy_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) still hasn't stopped yet. Waiting ..." + done + + dcorch_sysinv_api_proxy_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + dcorch_sysinv_api_proxy_confirm_stop + + ocf_log info "DC Orchestrator System Inventory Api proxy (dcorch-sysinv-api-proxy) stopped" + + rm -f $OCF_RESKEY_pid + + return $OCF_SUCCESS +} + +####################################################################### + +case "$1" in + meta-data) meta_data + exit $OCF_SUCCESS;; + usage|help) usage + exit $OCF_SUCCESS;; +esac + +# Anything except meta-data and help must pass validation +dcorch_sysinv_api_proxy_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) dcorch_sysinv_api_proxy_start;; + stop) dcorch_sysinv_api_proxy_stop;; + status) dcorch_sysinv_api_proxy_status;; + monitor) dcorch_sysinv_api_proxy_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac +