
The dnsmasq instances are managed by the quantum-dhcp-agent so killing then make no sense and creates races in stop when both services are running on the same node.
339 lines
12 KiB
Bash
339 lines
12 KiB
Bash
#!/bin/sh
|
|
#
|
|
#
|
|
# OpenStack L3 Service (quantum-l3-agent)
|
|
#
|
|
# Description: Manages an OpenStack L3 Service (quantum-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_quantum_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="quantum-l3-agent"
|
|
OCF_RESKEY_config_default="/etc/quantum/quantum.conf"
|
|
OCF_RESKEY_plugin_config_default="/etc/quantum/l3_agent.ini"
|
|
OCF_RESKEY_user_default="quantum"
|
|
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
|
|
OCF_RESKEY_quantum_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_quantum_server_port=${OCF_RESKEY_quantum_server_port_default}}
|
|
|
|
#######################################################################
|
|
|
|
usage() {
|
|
cat <<UEND
|
|
usage: $0 (start|stop|validate-all|meta-data|status|monitor)
|
|
|
|
$0 manages an OpenStack L3 Service (quantum-l3-agent) process as an HA resource
|
|
|
|
The 'start' operation starts the networking service.
|
|
The 'stop' operation stops the networking service.
|
|
The 'validate-all' operation reports whether the parameters are valid
|
|
The 'meta-data' operation reports this RA's meta-data information
|
|
The 'status' operation reports whether the networking service is running
|
|
The 'monitor' operation reports whether the networking service seems to be working
|
|
|
|
UEND
|
|
}
|
|
|
|
meta_data() {
|
|
cat <<END
|
|
<?xml version="1.0"?>
|
|
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
<resource-agent name="quantum-l3-agent">
|
|
<version>1.0</version>
|
|
|
|
<longdesc lang="en">
|
|
Resource agent for the OpenStack Quantum L3 Service (quantum-l3-agent)
|
|
May manage a quantum-l3-agent instance or a clone set that
|
|
creates a distributed quantum-l3-agent cluster.
|
|
</longdesc>
|
|
<shortdesc lang="en">Manages the OpenStack L3 Service (quantum-l3-agent)</shortdesc>
|
|
<parameters>
|
|
|
|
<parameter name="binary" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
Location of the OpenStack L3 Server server binary (quantum-l3-agent)
|
|
</longdesc>
|
|
<shortdesc lang="en">OpenStack L3 Server server binary (quantum-l3-agent)</shortdesc>
|
|
<content type="string" default="${OCF_RESKEY_binary_default}" />
|
|
</parameter>
|
|
|
|
<parameter name="config" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
Location of the OpenStack Quantum Service (quantum-server) configuration file
|
|
</longdesc>
|
|
<shortdesc lang="en">OpenStack L3 Server (quantum-server) config file</shortdesc>
|
|
<content type="string" default="${OCF_RESKEY_config_default}" />
|
|
</parameter>
|
|
|
|
<parameter name="plugin config" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
Location of the OpenStack L3 Service (quantum-l3-agent) configuration file
|
|
</longdesc>
|
|
<shortdesc lang="en">OpenStack L3 Server (quantum-l3-agent) config file</shortdesc>
|
|
<content type="string" default="${OCF_RESKEY_plugin_config_default}" />
|
|
</parameter>
|
|
|
|
<parameter name="user" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
User running OpenStack L3 Service (quantum-l3-agent)
|
|
</longdesc>
|
|
<shortdesc lang="en">OpenStack L3 Service (quantum-l3-agent) user</shortdesc>
|
|
<content type="string" default="${OCF_RESKEY_user_default}" />
|
|
</parameter>
|
|
|
|
<parameter name="pid" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
The pid file to use for this OpenStack L3 Service (quantum-l3-agent) instance
|
|
</longdesc>
|
|
<shortdesc lang="en">OpenStack L3 Service (quantum-l3-agent) pid file</shortdesc>
|
|
<content type="string" default="${OCF_RESKEY_pid_default}" />
|
|
</parameter>
|
|
|
|
<parameter name="quantum_server_port" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
The listening port number of the AMQP server. Mandatory to perform a monitor check
|
|
</longdesc>
|
|
<shortdesc lang="en">AMQP listening port</shortdesc>
|
|
<content type="integer" default="${OCF_RESKEY_quantum_server_port_default}" />
|
|
</parameter>
|
|
|
|
|
|
<parameter name="additional_parameters" unique="0" required="0">
|
|
<longdesc lang="en">
|
|
Additional parameters to pass on to the OpenStack L3 Service (quantum-l3-agent)
|
|
</longdesc>
|
|
<shortdesc lang="en">Additional parameters for quantum-l3-agent</shortdesc>
|
|
<content type="string" />
|
|
</parameter>
|
|
|
|
</parameters>
|
|
|
|
<actions>
|
|
<action name="start" timeout="20" />
|
|
<action name="stop" timeout="20" />
|
|
<action name="status" timeout="20" />
|
|
<action name="monitor" timeout="30" interval="20" />
|
|
<action name="validate-all" timeout="5" />
|
|
<action name="meta-data" timeout="5" />
|
|
</actions>
|
|
</resource-agent>
|
|
END
|
|
}
|
|
|
|
#######################################################################
|
|
# Functions invoked by resource manager actions
|
|
|
|
quantum_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
|
|
}
|
|
|
|
quantum_l3_agent_status() {
|
|
local pid
|
|
local rc
|
|
|
|
if [ ! -f $OCF_RESKEY_pid ]; then
|
|
ocf_log info "OpenStack L3 Server (quantum-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 (quantum-l3-agent) is not running"
|
|
return $OCF_NOT_RUNNING
|
|
fi
|
|
}
|
|
|
|
quantum_l3_agent_monitor() {
|
|
local rc
|
|
local pid
|
|
local network_amqp_check
|
|
|
|
quantum_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 Quantum process with the same connection behavior (for example quantum-server)
|
|
pid=`cat $OCF_RESKEY_pid`
|
|
# check the connections according to the PID
|
|
network_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_quantum_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"`
|
|
rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
ocf_log err "Quantum L3 Server is not connected to the Quantum server: $rc"
|
|
return $OCF_NOT_RUNNING
|
|
fi
|
|
|
|
ocf_log debug "OpenStack L3 Server (quantum-l3-agent) monitor succeeded"
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
quantum_l3_agent_start() {
|
|
local rc
|
|
|
|
quantum_l3_agent_status
|
|
rc=$?
|
|
if [ $rc -eq $OCF_SUCCESS ]; then
|
|
ocf_log info "OpenStack L3 Server (quantum-l3-agent) already running"
|
|
return $OCF_SUCCESS
|
|
fi
|
|
|
|
# run the actual quantum-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/quantum/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
|
|
quantum_l3_agent_monitor
|
|
rc=$?
|
|
[ $rc -eq $OCF_SUCCESS ] && break
|
|
if [ $rc -ne $OCF_NOT_RUNNING ]; then
|
|
ocf_log err "OpenStack L3 Server (quantum-l3-agent) start failed"
|
|
exit $OCF_ERR_GENERIC
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
ocf_log info "OpenStack L3 Server (quantum-l3-agent) started"
|
|
return $OCF_SUCCESS
|
|
}
|
|
|
|
quantum_l3_agent_stop() {
|
|
local rc
|
|
local pid
|
|
|
|
quantum_l3_agent_status
|
|
rc=$?
|
|
if [ $rc -eq $OCF_NOT_RUNNING ]; then
|
|
ocf_log info "OpenStack L3 Server (quantum-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 (quantum-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
|
|
quantum_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 (quantum-l3-agent) still hasn't stopped yet. Waiting ..."
|
|
done
|
|
|
|
quantum_l3_agent_status
|
|
rc=$?
|
|
if [ $rc -ne $OCF_NOT_RUNNING ]; then
|
|
# SIGTERM didn't help either, try SIGKILL
|
|
ocf_log info "OpenStack L3 Server (quantum-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 (quantum-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
|
|
quantum_l3_agent_validate || exit $?
|
|
|
|
# What kind of method was invoked?
|
|
case "$1" in
|
|
start) quantum_l3_agent_start;;
|
|
stop) quantum_l3_agent_stop;;
|
|
status) quantum_l3_agent_status;;
|
|
monitor) quantum_l3_agent_monitor;;
|
|
validate-all) ;;
|
|
*) usage
|
|
exit $OCF_ERR_UNIMPLEMENTED;;
|
|
esac
|