diff --git a/ocf/neutron-agent-dhcp b/ocf/neutron-agent-dhcp new file mode 100644 index 0000000..4b4e54e --- /dev/null +++ b/ocf/neutron-agent-dhcp @@ -0,0 +1,339 @@ +#!/bin/sh +# +# +# OpenStack DHCP Service (neutron-dhcp-agent) +# +# Description: Manages an OpenStack DHCP Service (neutron-dhcp-agent) process as an HA resource +# +# Authors: Emilien Macchi +# Mainly inspired by the Nova Network resource agent written by Emilien Macchi & Sebastien Han +# +# Support: openstack@lists.launchpad.net +# License: Apache Software License (ASL) 2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_plugin_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_amqp_server_port +# 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="neutron-dhcp-agent" +OCF_RESKEY_config_default="/etc/neutron/neutron.conf" +OCF_RESKEY_plugin_config_default="/etc/neutron/dhcp_agent.ini" +OCF_RESKEY_user_default="neutron" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" +OCF_RESKEY_amqp_server_port_default="5672" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_plugin_config=${OCF_RESKEY_plugin_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} +: ${OCF_RESKEY_amqp_server_port=${OCF_RESKEY_amqp_server_port_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the OpenStack Neutron DHCP Service (neutron-dhcp-agent) +May manage a neutron-dhcp-agent instance or a clone set that +creates a distributed neutron-dhcp-agent cluster. + +Manages the OpenStack DHCP Service (neutron-dhcp-agent) + + + + +Location of the OpenStack DHCP Server server binary (neutron-dhcp-agent) + +OpenStack DHCP Server server binary (neutron-dhcp-agent) + + + + + +Location of the OpenStack Neutron Service (neutron-server) configuration file + +OpenStack DHCP Server (neutron-server) config file + + + + + +Location of the OpenStack DHCP Service (neutron-dhcp-agent) configuration file + +OpenStack DHCP Server (neutron-dhcp-agent) config file + + + + + +User running OpenStack DHCP Service (neutron-dhcp-agent) + +OpenStack DHCP Service (neutron-dhcp-agent) user + + + + + +The pid file to use for this OpenStack DHCP Service (neutron-dhcp-agent) instance + +OpenStack DHCP Service (neutron-dhcp-agent) pid file + + + + + +The listening port number of the AMQP server. Mandatory to perform a monitor check + +AMQP listening port + + + + + + +Additional parameters to pass on to the OpenStack DHCP Service (neutron-dhcp-agent) + +Additional parameters for neutron-dhcp-agent + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +neutron_dhcp_agent_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary netstat + + # 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 +} + +neutron_dhcp_agent_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) 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 OpenStack DHCP Server (neutron-dhcp-agent) is not running" + return $OCF_NOT_RUNNING + fi +} + +neutron_dhcp_agent_monitor() { + local rc + local pid + local network_amqp_check + + neutron_dhcp_agent_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Check the connections according to the PID. + # We are sure to hit the scheduler process and not other Neutron process with the same connection behavior (for example neutron-server) + pid=`cat $OCF_RESKEY_pid` + # check the connections according to the PID + network_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_amqp_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"` + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "Neutron DHCP Server is not connected to the AMQP server : $rc" + return $OCF_NOT_RUNNING + fi + + ocf_log debug "OpenStack DHCP Server (neutron-dhcp-agent) monitor succeeded" + return $OCF_SUCCESS +} + +neutron_dhcp_agent_start() { + local rc + + neutron_dhcp_agent_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) already running" + return $OCF_SUCCESS + fi + + # run the actual neutron-dhcp-agent 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 \ + --config-file=$OCF_RESKEY_plugin_config --log-file=/var/log/neutron/dhcp-agent.log $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 + neutron_dhcp_agent_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "OpenStack DHCP Server (neutron-dhcp-agent) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) started" + return $OCF_SUCCESS +} + +neutron_dhcp_agent_stop() { + local rc + local pid + + neutron_dhcp_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) already stopped" + return $OCF_SUCCESS + fi + + # Try SIGTERM + pid=`cat $OCF_RESKEY_pid` + pid="$pid `ps ax | grep -v grep | grep 'dnsmasq' | cut -c1-5`" + ocf_run kill -s TERM $pid + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "OpenStack DHCP Server (neutron-dhcp-agent) couldn't be stopped" + 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 + neutron_dhcp_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "OpenStack DHCP Server (neutron-dhcp-agent) still hasn't stopped yet. Waiting ..." + done + + neutron_dhcp_agent_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + + ocf_log info "OpenStack DHCP Server (neutron-dhcp-agent) 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 +neutron_dhcp_agent_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) neutron_dhcp_agent_start;; + stop) neutron_dhcp_agent_stop;; + status) neutron_dhcp_agent_status;; + monitor) neutron_dhcp_agent_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac diff --git a/ocf/neutron-agent-l3 b/ocf/neutron-agent-l3 new file mode 100644 index 0000000..47115bd --- /dev/null +++ b/ocf/neutron-agent-l3 @@ -0,0 +1,338 @@ +#!/bin/sh +# +# +# OpenStack L3 Service (neutron-l3-agent) +# +# Description: Manages an OpenStack L3 Service (neutron-l3-agent) process as an HA resource +# +# Authors: Emilien Macchi +# Mainly inspired by the Nova Network resource agent written by Emilien Macchi & Sebastien Han +# +# Support: openstack@lists.launchpad.net +# License: Apache Software License (ASL) 2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_plugin_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_neutron_server_port +# 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="neutron-l3-agent" +OCF_RESKEY_config_default="/etc/neutron/neutron.conf" +OCF_RESKEY_plugin_config_default="/etc/neutron/l3_agent.ini" +OCF_RESKEY_user_default="neutron" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" +OCF_RESKEY_neutron_server_port_default="9696" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_plugin_config=${OCF_RESKEY_plugin_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} +: ${OCF_RESKEY_neutron_server_port=${OCF_RESKEY_neutron_server_port_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the OpenStack Neutron L3 Service (neutron-l3-agent) +May manage a neutron-l3-agent instance or a clone set that +creates a distributed neutron-l3-agent cluster. + +Manages the OpenStack L3 Service (neutron-l3-agent) + + + + +Location of the OpenStack L3 Server server binary (neutron-l3-agent) + +OpenStack L3 Server server binary (neutron-l3-agent) + + + + + +Location of the OpenStack Neutron Service (neutron-server) configuration file + +OpenStack L3 Server (neutron-server) config file + + + + + +Location of the OpenStack L3 Service (neutron-l3-agent) configuration file + +OpenStack L3 Server (neutron-l3-agent) config file + + + + + +User running OpenStack L3 Service (neutron-l3-agent) + +OpenStack L3 Service (neutron-l3-agent) user + + + + + +The pid file to use for this OpenStack L3 Service (neutron-l3-agent) instance + +OpenStack L3 Service (neutron-l3-agent) pid file + + + + + +The listening port number of the AMQP server. Mandatory to perform a monitor check + +AMQP listening port + + + + + + +Additional parameters to pass on to the OpenStack L3 Service (neutron-l3-agent) + +Additional parameters for neutron-l3-agent + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +neutron_l3_agent_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary netstat + + # 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 +} + +neutron_l3_agent_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "OpenStack L3 Server (neutron-l3-agent) 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 OpenStack L3 Server (neutron-l3-agent) is not running" + return $OCF_NOT_RUNNING + fi +} + +neutron_l3_agent_monitor() { + local rc + local pid + local network_amqp_check + + neutron_l3_agent_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Check the connections according to the PID. + # We are sure to hit the scheduler process and not other Neutron process with the same connection behavior (for example neutron-server) + pid=`cat $OCF_RESKEY_pid` + # check the connections according to the PID + network_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_neutron_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"` + rc=$? + if [ $rc -ne 0 ]; then + ocf_log err "Neutron L3 Server is not connected to the Neutron server: $rc" + return $OCF_NOT_RUNNING + fi + + ocf_log debug "OpenStack L3 Server (neutron-l3-agent) monitor succeeded" + return $OCF_SUCCESS +} + +neutron_l3_agent_start() { + local rc + + neutron_l3_agent_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "OpenStack L3 Server (neutron-l3-agent) already running" + return $OCF_SUCCESS + fi + + # run the actual neutron-l3-agent 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 \ + --config-file=$OCF_RESKEY_plugin_config --log-file=/var/log/neutron/l3-agent.log $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 + neutron_l3_agent_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "OpenStack L3 Server (neutron-l3-agent) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "OpenStack L3 Server (neutron-l3-agent) started" + return $OCF_SUCCESS +} + +neutron_l3_agent_stop() { + local rc + local pid + + neutron_l3_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "OpenStack L3 Server (neutron-l3-agent) already stopped" + 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 "OpenStack L3 Server (neutron-l3-agent) couldn't be stopped" + 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 + neutron_l3_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "OpenStack L3 Server (neutron-l3-agent) still hasn't stopped yet. Waiting ..." + done + + neutron_l3_agent_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "OpenStack L3 Server (neutron-l3-agent) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + + ocf_log info "OpenStack L3 Server (neutron-l3-agent) 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 +neutron_l3_agent_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) neutron_l3_agent_start;; + stop) neutron_l3_agent_stop;; + status) neutron_l3_agent_status;; + monitor) neutron_l3_agent_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac diff --git a/ocf/neutron-metadata-agent b/ocf/neutron-metadata-agent new file mode 100644 index 0000000..27c4aab --- /dev/null +++ b/ocf/neutron-metadata-agent @@ -0,0 +1,329 @@ +#!/bin/sh +# +# +# OpenStack Neutron Metadata Agent (neutron-metadata-agent) +# +# Description: Manages an OpenStack Volumes (neutron-metadata-agent) process as an HA resource +# +# Authors: Sébastien Han +# Mainly inspired by the Glance API resource agent written by Martin Gerhard Loschwitz from Hastexo: http://goo.gl/whLpr +# +# Support: openstack@lists.launchpad.net +# License: Apache Software License (ASL) 2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_agent_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="neutron-metadata-agent" +OCF_RESKEY_config_default="/etc/neutron/neutron.conf" +OCF_RESKEY_agent_config_default="/etc/neutron/metadata_agent.ini" +OCF_RESKEY_user_default="neutron" +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_agent_config=${OCF_RESKEY_agent_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the OpenStack Neutron Metadata Agent (neutron-metadata-agent) +May manage a neutron-metadata-agent instance or a clone set that +creates a distributed neutron-metadata-agent cluster. + +Manages the OpenStack Neutron Metadata Agent (neutron-metadata-agent) + + + + +Location of the OpenStack Neutron Metadata Agent server binary (neutron-metadata-agent) + +OpenStack Neutron Metadata Agent server binary (neutron-metadata-agent) + + + + + +Location of the OpenStack Neutron Metadata Agent (neutron-metadata-agent) configuration file + +OpenStack Neutron Metadata Agent (neutron-metadata-agent) config file + + + + + +User running OpenStack Neutron Metadata Agent (neutron-metadata-agent) + +OpenStack Neutron Metadata Agent (neutron-metadata-agent) user + + + + + +Location of the OpenStack Metadata agent configuration file + +OpenStack Metadata (neutron-metadata-agent) config file + + + + + +The pid file to use for this OpenStack Neutron Metadata Agent (neutron-metadata-agent) instance + +OpenStack Neutron Metadata Agent (neutron-metadata-agent) pid file + + + + + +The listening port number of the AMQP server. Mandatory to perform a monitor check + +AMQP listening port + + + + + + +Additional parameters to pass on to the OpenStack Neutron Metadata Agent (neutron-metadata-agent) + +Additional parameters for neutron-metadata-agent + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +neutron_metadata_agent_validate() { + local rc + + check_binary $OCF_RESKEY_binary + check_binary netstat + + # 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 +} + +neutron_metadata_agent_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) 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 OpenStack Neutron Metadata Agent (neutron-metadata-agent) is not running" + return $OCF_NOT_RUNNING + fi +} + +neutron_metadata_agent_monitor() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) 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 OpenStack Neutron Metadata Agent (neutron-metadata-agent) is not running" + return $OCF_NOT_RUNNING + fi +} + +neutron_metadata_agent_start() { + local rc + + neutron_metadata_agent_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) already running" + return $OCF_SUCCESS + fi + + # run the actual neutron-server daemon with correct configurations files (server + plugin) + # 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 \ + --config-file=$OCF_RESKEY_agent_config --log-file=/var/log/neutron/metadata.log $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 + neutron_metadata_agent_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "OpenStack Neutron Metadata Agent (neutron-metadata-agent) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) started" + return $OCF_SUCCESS +} + +neutron_metadata_agent_stop() { + local rc + local pid + + neutron_metadata_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) already stopped" + 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 "OpenStack Neutron Metadata Agent (neutron-metadata-agent) couldn't be stopped" + 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 + neutron_metadata_agent_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "OpenStack Neutron Metadata Agent (neutron-metadata-agent) still hasn't stopped yet. Waiting ..." + done + + neutron_metadata_agent_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + + ocf_log info "OpenStack Neutron Metadata Agent (neutron-metadata-agent) 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 +neutron_metadata_agent_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) neutron_metadata_agent_start;; + stop) neutron_metadata_agent_stop;; + status) neutron_metadata_agent_status;; + monitor) neutron_metadata_agent_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac diff --git a/ocf/neutron-server b/ocf/neutron-server new file mode 100644 index 0000000..1c58954 --- /dev/null +++ b/ocf/neutron-server @@ -0,0 +1,385 @@ +#!/bin/sh +# +# +# OpenStack Neutron Server (neutron-server) +# +# Description: Manages an OpenStack Neutron Server (neutron-server) process as an HA resource +# +# Authors: Emilien Macchi +# Mainly inspired by the Neutron API resource agent written by Sebastien Han : http://goo.gl/s8hOU +# Which is also inspired by the Glance API resource agent written by Martin Gerhard Loschwitz from Hastexo: http://goo.gl/whLpr +# +# Support: openstack@lists.launchpad.net +# License: Apache Software License (ASL) 2.0 +# +# +# See usage() function below for more details ... +# +# OCF instance parameters: +# OCF_RESKEY_binary +# OCF_RESKEY_config +# OCF_RESKEY_plugin_config +# OCF_RESKEY_user +# OCF_RESKEY_pid +# OCF_RESKEY_os_username +# OCF_RESKEY_os_password +# OCF_RESKEY_os_tenant_name +# OCF_RESKEY_keystone_get_token_url +# 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="neutron-server" +OCF_RESKEY_config_default="/etc/neutron/neutron.conf" +OCF_RESKEY_plugin_config_default="/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini" +OCF_RESKEY_user_default="neutron" +OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid" +OCF_RESKEY_url_default="http://127.0.0.1:9696" +OCF_RESKEY_keystone_get_token_url_default="http://127.0.0.1:5000/v2.0/tokens" + +: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}} +: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}} +: ${OCF_RESKEY_plugin_config=${OCF_RESKEY_plugin_config_default}} +: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}} +: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}} +: ${OCF_RESKEY_url=${OCF_RESKEY_url_default}} +: ${OCF_RESKEY_keystone_get_token_url=${OCF_RESKEY_keystone_get_token_url_default}} + +####################################################################### + +usage() { + cat < + + +1.0 + + +Resource agent for the OpenStack Neutron Server (neutron-server) +May manage a neutron-server instance or a clone set that +creates a distributed neutron-server cluster. + +Manages the OpenStack Neutron Server (neutron-server) + + + + +Location of the OpenStack Neutron Server server binary (neutron-server) + +OpenStack Neutron Server server binary (neutron-server) + + + + + +Location of the OpenStack Neutron Server (neutron-server) configuration file + +OpenStack Neutron Server (neutron-server) config file + + + + + +Location of the OpenStack Default Plugin (Open-vSwitch) configuration file + +OpenStack OVS (neutron-ovs) config file + + + + + +User running OpenStack Neutron Server (neutron-server) + +OpenStack Neutron Server (neutron-server) user + + + + + +The pid file to use for this OpenStack Neutron Server (neutron-server) instance + +OpenStack Neutron Server (neutron-server) pid file + + + + + +The default URL to use for monitoring this instance (neutron-server) via curl. Important note: the monitor function doesn't accept http return code different than 200, for instance redirection code will generate an error. Don't forget the '/' at the end of your url endpoint. For example http://127.0.0.1:9696/v1.1 won't work and http://127.0.0.1:9696/v1.1/ will. + +OpenStack Neutron API (neutron-server) monitor url + + + + + +The default URL to use to acquire a Neutron API (neutron-server) token for monitoring this instance +of OpenStack Neutron API (neutron-server) + +OpenStack Neutron API (neutron-server) url + + + + + +The username to use when connecting with Neutron API (neutron-server) for monitoring purposes + +Neutron API (neutron-server) monitoring login + + + + + +The password to use when connecting Neutron API (neutron-server) for monitoring purposes + +Neutron API (neutron-server) monitoring password + + + + + +The tenant to use when connecting Neutron API (neutron-server) for monitoring purposes + +Neutron API (neutron-server) monitoring tenant + + + + + +Additional parameters to pass on to the OpenStack Neutron Server (neutron-server) + +Additional parameters for neutron-server + + + + + + + + + + + + + + +END +} + +####################################################################### +# Functions invoked by resource manager actions + +neutron_server_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 +} + +neutron_server_status() { + local pid + local rc + + if [ ! -f $OCF_RESKEY_pid ]; then + ocf_log info "OpenStack Neutron Server (neutron-server) 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 OpenStack Neutron Server (neutron-server) is not running" + return $OCF_NOT_RUNNING + fi +} + +neutron_server_monitor() { + local rc + local token + local http_code + + neutron_server_status + rc=$? + + # If status returned anything but success, return that immediately + if [ $rc -ne $OCF_SUCCESS ]; then + return $rc + fi + + # Check detailed information about this specific version of the API. + if [ -n "$OCF_RESKEY_os_username" ] && [ -n "$OCF_RESKEY_os_password" ] \ + && [ -n "$OCF_RESKEY_os_tenant_name" ] && [ -n "$OCF_RESKEY_keystone_get_token_url" ]; then + token=`curl -s -d "{\"auth\":{\"passwordCredentials\": {\"username\": \"$OCF_RESKEY_os_username\", \ + \"password\": \"$OCF_RESKEY_os_password\"}, \"tenantName\": \"$OCF_RESKEY_os_tenant_name\"}}" \ + -H "Content-type: application/json" $OCF_RESKEY_keystone_get_token_url | tr ',' '\n' | grep '"id":' \ + | cut -d'"' -f4 | head --lines 1` + http_code=`curl --write-out %{http_code} --output /dev/null -sH "X-Auth-Token: $token" $OCF_RESKEY_url` + rc=$? + if [ $rc -ne 0 ] || [ $http_code -ne 200 ]; then + ocf_log err "Failed to connect to the OpenStack Neutron API (neutron-server): $rc and $http_code" + return $OCF_NOT_RUNNING + fi + fi + + ocf_log debug "OpenStack Neutron Server (neutron-server) monitor succeeded" + return $OCF_SUCCESS +} + +neutron_server_start() { + local rc + + neutron_server_status + rc=$? + if [ $rc -eq $OCF_SUCCESS ]; then + ocf_log info "OpenStack Neutron Server (neutron-server) already running" + return $OCF_SUCCESS + fi + + # run the actual neutron-server daemon with correct configurations files (server + plugin) + # 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 \ + --config-file=$OCF_RESKEY_plugin_config --log-file=/var/log/neutron/server.log $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 + neutron_server_monitor + rc=$? + [ $rc -eq $OCF_SUCCESS ] && break + if [ $rc -ne $OCF_NOT_RUNNING ]; then + ocf_log err "OpenStack Neutron Server (neutron-server) start failed" + exit $OCF_ERR_GENERIC + fi + sleep 1 + done + + ocf_log info "OpenStack Neutron Server (neutron-server) started" + return $OCF_SUCCESS +} + +neutron_server_stop() { + local rc + local pid + + neutron_server_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + ocf_log info "OpenStack Neutron Server (neutron-server) already stopped" + 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 "OpenStack Neutron Server (neutron-server) couldn't be stopped" + 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 + neutron_server_status + rc=$? + if [ $rc -eq $OCF_NOT_RUNNING ]; then + break + fi + count=`expr $count + 1` + sleep 1 + ocf_log debug "OpenStack Neutron Server (neutron-server) still hasn't stopped yet. Waiting ..." + done + + neutron_server_status + rc=$? + if [ $rc -ne $OCF_NOT_RUNNING ]; then + # SIGTERM didn't help either, try SIGKILL + ocf_log info "OpenStack Neutron Server (neutron-server) failed to stop after ${shutdown_timeout}s \ + using SIGTERM. Trying SIGKILL ..." + ocf_run kill -s KILL $pid + fi + + ocf_log info "OpenStack Neutron Server (neutron-server) 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 +neutron_server_validate || exit $? + +# What kind of method was invoked? +case "$1" in + start) neutron_server_start;; + stop) neutron_server_stop;; + status) neutron_server_status;; + monitor) neutron_server_monitor;; + validate-all) ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED;; +esac diff --git a/ocf/nova-network b/ocf/nova-network index d90c739..05da38b 100644 --- a/ocf/nova-network +++ b/ocf/nova-network @@ -1,7 +1,7 @@ #!/bin/sh # # -# OpenStack Network Service (nova-network) (replaced by Neutron in Folsom) +# OpenStack Network Service (nova-network) (replaced by Neutron in Havana) # # Description: Manages an OpenStack Network Service (nova-network) process as an HA resource #