-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Modify nova-network title for Havana support
Signed-off-by: Emilien Macchi <emilien.macchi@enovance.com>
- Loading branch information
Emilien Macchi
committed
Aug 28, 2013
1 parent
b4d0fa6
commit 1760115
Showing
5 changed files
with
1,392 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <<UEND | ||
usage: $0 (start|stop|validate-all|meta-data|status|monitor) | ||
$0 manages an OpenStack DHCP Service (neutron-dhcp-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="neutron-dhcp-agent"> | ||
<version>1.0</version> | ||
<longdesc lang="en"> | ||
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. | ||
</longdesc> | ||
<shortdesc lang="en">Manages the OpenStack DHCP Service (neutron-dhcp-agent)</shortdesc> | ||
<parameters> | ||
<parameter name="binary" unique="0" required="0"> | ||
<longdesc lang="en"> | ||
Location of the OpenStack DHCP Server server binary (neutron-dhcp-agent) | ||
</longdesc> | ||
<shortdesc lang="en">OpenStack DHCP Server server binary (neutron-dhcp-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 Neutron Service (neutron-server) configuration file | ||
</longdesc> | ||
<shortdesc lang="en">OpenStack DHCP Server (neutron-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 DHCP Service (neutron-dhcp-agent) configuration file | ||
</longdesc> | ||
<shortdesc lang="en">OpenStack DHCP Server (neutron-dhcp-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 DHCP Service (neutron-dhcp-agent) | ||
</longdesc> | ||
<shortdesc lang="en">OpenStack DHCP Service (neutron-dhcp-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 DHCP Service (neutron-dhcp-agent) instance | ||
</longdesc> | ||
<shortdesc lang="en">OpenStack DHCP Service (neutron-dhcp-agent) pid file</shortdesc> | ||
<content type="string" default="${OCF_RESKEY_pid_default}" /> | ||
</parameter> | ||
<parameter name="amqp_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_amqp_server_port_default}" /> | ||
</parameter> | ||
<parameter name="additional_parameters" unique="0" required="0"> | ||
<longdesc lang="en"> | ||
Additional parameters to pass on to the OpenStack DHCP Service (neutron-dhcp-agent) | ||
</longdesc> | ||
<shortdesc lang="en">Additional parameters for neutron-dhcp-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 | ||
|
||
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 |
Oops, something went wrong.