heartbeat: import pacemaker scripts (closes: #4527)
This commit is contained in:
		
							
								
								
									
										3
									
								
								files/heartbeat/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								files/heartbeat/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | # Pacemaker High Availability resource agents for OpenStack | ||||||
|  |  | ||||||
|  | https://github.com/madkiss/openstack-resource-agents | ||||||
							
								
								
									
										345
									
								
								files/heartbeat/ceilometer-agent-central
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								files/heartbeat/ceilometer-agent-central
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,345 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | # | ||||||
|  | # | ||||||
|  | # OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) | ||||||
|  | # | ||||||
|  | # Description: Manages an OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) process as an HA resource | ||||||
|  | # | ||||||
|  | # Authors: Emilien Macchi | ||||||
|  | # Mainly inspired by the Nova Scheduler resource agent written by 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_user | ||||||
|  | # OCF_RESKEY_pid | ||||||
|  | # OCF_RESKEY_monitor_binary | ||||||
|  | # 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="ceilometer-agent-central" | ||||||
|  | OCF_RESKEY_config_default="/etc/ceilometer/ceilometer.conf" | ||||||
|  | OCF_RESKEY_user_default="ceilometer" | ||||||
|  | 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_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 Ceilometer Central Agent Service (ceilometer-agent-central) process as an HA resource | ||||||
|  |  | ||||||
|  |         The 'start' operation starts the scheduler service. | ||||||
|  |         The 'stop' operation stops the scheduler 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 scheduler service is running | ||||||
|  |         The 'monitor' operation reports whether the scheduler 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="ceilometer-agent-central"> | ||||||
|  | <version>1.0</version> | ||||||
|  |  | ||||||
|  | <longdesc lang="en"> | ||||||
|  | Resource agent for the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) | ||||||
|  | May manage a ceilometer-agent-central instance or a clone set that | ||||||
|  | creates a distributed ceilometer-agent-central cluster. | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">Manages the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)</shortdesc> | ||||||
|  | <parameters> | ||||||
|  |  | ||||||
|  | <parameter name="binary" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | Location of the OpenStack Ceilometer Central Agent server binary (ceilometer-agent-central) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Ceilometer Central Agent server binary (ceilometer-agent-central)</shortdesc> | ||||||
|  | <content type="string" default="${OCF_RESKEY_binary_default}" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | <parameter name="config" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | Location of the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) configuration file | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Ceilometer Central Agent (ceilometer-agent-central registry) config file</shortdesc> | ||||||
|  | <content type="string" default="${OCF_RESKEY_config_default}" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | <parameter name="user" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | User running OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) 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 Ceilometer Central Agent Service (ceilometer-agent-central) instance | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) 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. Use for monitoring purposes | ||||||
|  | </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 Ceilometer Central Agent Service (ceilometer-agent-central) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">Additional parameters for ceilometer-agent-central</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 | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_check_port() { | ||||||
|  | # This function has been taken from the squid RA and improved a bit | ||||||
|  | # The length of the integer must be 4 | ||||||
|  | # Examples of valid port: "1080", "0080" | ||||||
|  | # Examples of invalid port: "1080bad", "0", "0000", "" | ||||||
|  |  | ||||||
|  |     local int | ||||||
|  |     local cnt | ||||||
|  |      | ||||||
|  |     int="$1" | ||||||
|  |     cnt=${#int} | ||||||
|  |     echo $int |egrep -qx '[0-9]+(:[0-9]+)?(,[0-9]+(:[0-9]+)?)*' | ||||||
|  |  | ||||||
|  |     if [ $? -ne 0 ] || [ $cnt -ne 4 ]; then | ||||||
|  |         ocf_log err "Invalid port number: $1" | ||||||
|  |         exit $OCF_ERR_CONFIGURED | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_validate() { | ||||||
|  |     local rc | ||||||
|  |  | ||||||
|  |     check_binary $OCF_RESKEY_binary | ||||||
|  |     check_binary netstat | ||||||
|  |     ceilometer_agent_central_check_port $OCF_RESKEY_amqp_server_port | ||||||
|  |      | ||||||
|  |     # 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_status() { | ||||||
|  |     local pid | ||||||
|  |     local rc | ||||||
|  |  | ||||||
|  |     if [ ! -f $OCF_RESKEY_pid ]; then | ||||||
|  |         ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) 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 Ceilometer Central Agent (ceilometer-agent-central) is not running" | ||||||
|  |         return $OCF_NOT_RUNNING | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_monitor() { | ||||||
|  |     local rc | ||||||
|  |     local pid | ||||||
|  |     local scheduler_amqp_check | ||||||
|  |  | ||||||
|  |     ceilometer_agent_central_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 Cinder process with the same connection behavior (for example cinder-api) | ||||||
|  |         pid=`cat $OCF_RESKEY_pid` | ||||||
|  |         scheduler_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 "Central Agent is not connected to the AMQP server : $rc" | ||||||
|  |         return $OCF_NOT_RUNNING | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |     ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) monitor succeeded" | ||||||
|  |     return $OCF_SUCCESS | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_start() { | ||||||
|  |     local rc | ||||||
|  |  | ||||||
|  |     ceilometer_agent_central_status | ||||||
|  |     rc=$? | ||||||
|  |     if [ $rc -eq $OCF_SUCCESS ]; then | ||||||
|  |         ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) already running" | ||||||
|  |         return $OCF_SUCCESS | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     # run the actual ceilometer-agent-central 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. | ||||||
|  |     while true; do | ||||||
|  |     ceilometer_agent_central_monitor | ||||||
|  |     rc=$? | ||||||
|  |     [ $rc -eq $OCF_SUCCESS ] && break | ||||||
|  |     if [ $rc -ne $OCF_NOT_RUNNING ]; then | ||||||
|  |         ocf_log err "OpenStack Ceilometer Central Agent (ceilometer-agent-central) start failed" | ||||||
|  |         exit $OCF_ERR_GENERIC | ||||||
|  |     fi | ||||||
|  |     sleep 1 | ||||||
|  |     done | ||||||
|  |  | ||||||
|  |     ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) started" | ||||||
|  |     return $OCF_SUCCESS | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ceilometer_agent_central_stop() { | ||||||
|  |     local rc | ||||||
|  |     local pid | ||||||
|  |  | ||||||
|  |     ceilometer_agent_central_status | ||||||
|  |     rc=$? | ||||||
|  |     if [ $rc -eq $OCF_NOT_RUNNING ]; then | ||||||
|  |         ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) 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 Ceilometer Central Agent (ceilometer-agent-central) 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 | ||||||
|  |         ceilometer_agent_central_status | ||||||
|  |         rc=$? | ||||||
|  |         if [ $rc -eq $OCF_NOT_RUNNING ]; then | ||||||
|  |             break | ||||||
|  |         fi | ||||||
|  |         count=`expr $count + 1` | ||||||
|  |         sleep 1 | ||||||
|  |         ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) still hasn't stopped yet. Waiting ..." | ||||||
|  |     done | ||||||
|  |  | ||||||
|  |     ceilometer_agent_central_status | ||||||
|  |     rc=$? | ||||||
|  |     if [ $rc -ne $OCF_NOT_RUNNING ]; then | ||||||
|  |         # SIGTERM didn't help either, try SIGKILL | ||||||
|  |         ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) failed to stop after ${shutdown_timeout}s \ | ||||||
|  |           using SIGTERM. Trying SIGKILL ..." | ||||||
|  |         ocf_run kill -s KILL $pid | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) 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 | ||||||
|  | ceilometer_agent_central_validate || exit $? | ||||||
|  |  | ||||||
|  | # What kind of method was invoked? | ||||||
|  | case "$1" in | ||||||
|  |   start) ceilometer_agent_central_start;; | ||||||
|  |   stop) ceilometer_agent_central_stop;; | ||||||
|  |   status) ceilometer_agent_central_status;; | ||||||
|  |   monitor) ceilometer_agent_central_monitor;; | ||||||
|  |   validate-all) ;; | ||||||
|  |   *) usage | ||||||
|  |                 exit $OCF_ERR_UNIMPLEMENTED;; | ||||||
|  | esac | ||||||
							
								
								
									
										952
									
								
								files/heartbeat/heat-engine
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										952
									
								
								files/heartbeat/heat-engine
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										329
									
								
								files/heartbeat/neutron-metadata-agent
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								files/heartbeat/neutron-metadata-agent
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <<UEND | ||||||
|  |         usage: $0 (start|stop|validate-all|meta-data|status|monitor) | ||||||
|  |  | ||||||
|  |         $0 manages an OpenStack Neutron Metadata Agent (neutron-metadata-agent) process as an HA resource | ||||||
|  |  | ||||||
|  |         The 'start' operation starts the volume service. | ||||||
|  |         The 'stop' operation stops the volume 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 volume service is running | ||||||
|  |         The 'monitor' operation reports whether the volume 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-metadata-agent"> | ||||||
|  | <version>1.0</version> | ||||||
|  |  | ||||||
|  | <longdesc lang="en"> | ||||||
|  | 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. | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">Manages the OpenStack Neutron Metadata Agent (neutron-metadata-agent)</shortdesc> | ||||||
|  | <parameters> | ||||||
|  |  | ||||||
|  | <parameter name="binary" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | Location of the OpenStack Neutron Metadata Agent server binary (neutron-metadata-agent) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Neutron Metadata Agent server binary (neutron-metadata-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 Metadata Agent (neutron-metadata-agent) configuration file | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Neutron Metadata Agent (neutron-metadata-agent) config file</shortdesc> | ||||||
|  | <content type="string" default="${OCF_RESKEY_config_default}" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | <parameter name="user" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | User running OpenStack Neutron Metadata Agent (neutron-metadata-agent) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Neutron Metadata Agent (neutron-metadata-agent) user</shortdesc> | ||||||
|  | <content type="string" default="${OCF_RESKEY_user_default}" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | <parameter name="agent_config" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | Location of the OpenStack Metadata agent configuration file | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Metadata (neutron-metadata-agent) config file</shortdesc> | ||||||
|  | <content type="string" default="${OCF_RESKEY_agent_config_default}" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | <parameter name="pid" unique="0" required="0"> | ||||||
|  | <longdesc lang="en"> | ||||||
|  | The pid file to use for this OpenStack Neutron Metadata Agent (neutron-metadata-agent) instance | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">OpenStack Neutron Metadata Agent (neutron-metadata-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 Neutron Metadata Agent (neutron-metadata-agent) | ||||||
|  | </longdesc> | ||||||
|  | <shortdesc lang="en">Additional parameters for neutron-metadata-agent</shortdesc> | ||||||
|  | <content type="string" /> | ||||||
|  | </parameter> | ||||||
|  |  | ||||||
|  | </parameters> | ||||||
|  |  | ||||||
|  | <actions> | ||||||
|  | <action name="start" timeout="10" /> | ||||||
|  | <action name="stop" timeout="10" /> | ||||||
|  | <action name="status" timeout="10" /> | ||||||
|  | <action name="monitor" timeout="5" interval="10" /> | ||||||
|  | <action name="validate-all" timeout="5" /> | ||||||
|  | <action name="meta-data" timeout="5" /> | ||||||
|  | </actions> | ||||||
|  | </resource-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 | ||||||
| @@ -41,16 +41,11 @@ class privatecloud::spof( | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   # Resources managed by Corosync as Active / Passive |   # Resources managed by Corosync as Active / Passive | ||||||
|   vcsrepo { '/usr/lib/ocf/resource.d/openstack/': |   # https://github.com/madkiss/openstack-resource-agents | ||||||
|     ensure   => latest, |  | ||||||
|     provider => git, |  | ||||||
|     source   => 'https://github.com/madkiss/openstack-resource-agents', |  | ||||||
|     revision => 'master', |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   Package['corosync'] -> |   Package['corosync'] -> | ||||||
|   file { '/usr/lib/ocf/resource.d/heartbeat/ceilometer-agent-central': |   file { '/usr/lib/ocf/resource.d/heartbeat/ceilometer-agent-central': | ||||||
|     source  => '/usr/lib/ocf/resource.d/openstack/ceilometer-agent-central', |     source  => 'puppet:///privatecloud/heartbeat/ceilometer-agent-central', | ||||||
|     mode    => '0755', |     mode    => '0755', | ||||||
|     owner   => 'root', |     owner   => 'root', | ||||||
|     group   => 'root', |     group   => 'root', | ||||||
| @@ -74,7 +69,7 @@ class privatecloud::spof( | |||||||
|  |  | ||||||
|   Package['corosync'] -> |   Package['corosync'] -> | ||||||
|   file { '/usr/lib/ocf/resource.d/heartbeat/neutron-metadata-agent': |   file { '/usr/lib/ocf/resource.d/heartbeat/neutron-metadata-agent': | ||||||
|     source  => '/usr/lib/ocf/resource.d/openstack/neutron-metadata-agent', |     source  => 'puppet:///privatecloud/heartbeat/neutron-metadata-agent', | ||||||
|     mode    => '0755', |     mode    => '0755', | ||||||
|     owner   => 'root', |     owner   => 'root', | ||||||
|     group   => 'root', |     group   => 'root', | ||||||
| @@ -98,7 +93,7 @@ class privatecloud::spof( | |||||||
|  |  | ||||||
|   Package['corosync'] -> |   Package['corosync'] -> | ||||||
|   file { '/usr/lib/ocf/resource.d/heartbeat/heat-engine': |   file { '/usr/lib/ocf/resource.d/heartbeat/heat-engine': | ||||||
|     source  => '/usr/lib/ocf/resource.d/openstack/heat-engine', |     source  => 'puppet:///privatecloud/heartbeat/heat-engine', | ||||||
|     mode    => '0755', |     mode    => '0755', | ||||||
|     owner   => 'root', |     owner   => 'root', | ||||||
|     group   => 'root', |     group   => 'root', | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sebastien Badia
					Sebastien Badia