Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package resource-agents for openSUSE:Factory
checked in at 2021-05-12 19:31:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/resource-agents (Old)
and /work/SRC/openSUSE:Factory/.resource-agents.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "resource-agents"
Wed May 12 19:31:40 2021 rev:107 rq:892020 version:4.8.0+git28.5c54175d
Changes:
--------
--- /work/SRC/openSUSE:Factory/resource-agents/resource-agents.changes
2021-04-18 21:44:58.428707978 +0200
+++
/work/SRC/openSUSE:Factory/.resource-agents.new.2988/resource-agents.changes
2021-05-12 19:32:04.403075667 +0200
@@ -1,0 +2,15 @@
+Mon May 10 10:48:36 UTC 2021 - [email protected]
+
+- Update to version 4.8.0+git28.5c54175d:
+ * LVM-activate: Disable VG autoactivation in system_id access_mode
+ * gcp-vpc-move-vip.in: Adds retries
+ * gcp-ilb: resource wrapping nc or socat to respond to health checks (#1541)
+ * azure-events: update api_version
+ * openstack-cinder-volume: CLI output parsing fixes, fetch of node ID
consistency, monitor action simplification, and proper use of osvol_validate.
+ * openstack-virtual-ip: New resource agent for virtual IP support in
OpenStack.
+ * openstack-floating-ip: Proper use of osflip_validate and small log message
fixes.
+ * configure: add /usr/local/share to fallback path to be scanned for docbook
path
+ * openstack-info: Use OSInfo_validate in start action. (#1639)
+ (bsc#1178680) HA-LVM systemid race condition introduces an error "active on
2 nodes"
+
+-------------------------------------------------------------------
@@ -113,0 +129,9 @@
+ (bsc#1183971) L3: azure-events puts both nodes in standby
+ (bsc#1177796) ethmonitor bloats journal with warnings for VLAN
+ (bsc#1180590) azure-events URLError fixed upstream
+ (bsc#1184607) gcp-vpc-move-route resource agent file_cache is unavailable
when using oauth2client
+ (bsc#1179977) L3: anything RA stop operation fails if /root/.profile has
unexpected content
+ (bsc#1178977) ocf.py does not handle probe actions
+ (bsc#1175435) Last commit of a galera cluster member is not saved into
grastate.dat
+ (bsc#1175101) GCP Resource Agents - Support for Multi Alias IP
+ (bsc#1170354) OCF version check for pacemaker is incompatible with the SUSE
version strings
Old:
----
resource-agents-4.8.0+git12.3068bf8b.tar.xz
New:
----
resource-agents-4.8.0+git28.5c54175d.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ resource-agents.spec ++++++
--- /var/tmp/diff_new_pack.od3X7V/_old 2021-05-12 19:32:04.959073447 +0200
+++ /var/tmp/diff_new_pack.od3X7V/_new 2021-05-12 19:32:04.963073431 +0200
@@ -17,7 +17,7 @@
Name: resource-agents
-Version: 4.8.0+git12.3068bf8b
+Version: 4.8.0+git28.5c54175d
Release: 0
Summary: HA Reusable Cluster Resource Scripts
License: GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.od3X7V/_old 2021-05-12 19:32:05.011073239 +0200
+++ /var/tmp/diff_new_pack.od3X7V/_new 2021-05-12 19:32:05.015073223 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">git://github.com/ClusterLabs/resource-agents.git</param>
-<param name="changesrevision">3068bf8b1dc47f69a22ab7785b0ffd6c28c97342</param>
+<param name="changesrevision">5c54175d39a81344535977a475b015f6ec6b123a</param>
</service>
</servicedata>
\ No newline at end of file
++++++ resource-agents-4.8.0+git12.3068bf8b.tar.xz ->
resource-agents-4.8.0+git28.5c54175d.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/resource-agents-4.8.0+git12.3068bf8b/configure.ac
new/resource-agents-4.8.0+git28.5c54175d/configure.ac
--- old/resource-agents-4.8.0+git12.3068bf8b/configure.ac 2021-04-14
13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/configure.ac 2021-04-30
16:27:24.000000000 +0200
@@ -580,7 +580,7 @@
if test x"${DIRS}" = x""; then
# when datadir is not standard OS path, we cannot find docbook.xsl
# use standard OS path as backup
- DIRS=$(find "/usr/share" -name $(basename $(dirname
${DOCBOOK_XSL_PATH})) \
+ DIRS=$(find "/usr/share" "/usr/local/share" -name $(basename
$(dirname ${DOCBOOK_XSL_PATH})) \
-type d | LC_ALL=C sort)
fi
XSLT=$(basename ${DOCBOOK_XSL_PATH})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/doc/man/Makefile.am
new/resource-agents-4.8.0+git28.5c54175d/doc/man/Makefile.am
--- old/resource-agents-4.8.0+git12.3068bf8b/doc/man/Makefile.am
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/doc/man/Makefile.am
2021-04-30 16:27:24.000000000 +0200
@@ -147,6 +147,7 @@
ocf_heartbeat_openstack-info.7 \
ocf_heartbeat_openstack-cinder-volume.7 \
ocf_heartbeat_openstack-floating-ip.7 \
+ ocf_heartbeat_openstack-virtual-ip.7 \
ocf_heartbeat_oraasm.7 \
ocf_heartbeat_oracle.7 \
ocf_heartbeat_oralsnr.7 \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/LVM-activate
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/LVM-activate
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/LVM-activate
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/LVM-activate
2021-04-30 16:27:24.000000000 +0200
@@ -115,6 +115,9 @@
the stop action of the lvmlockd agent may fail and the node may get fenced,
because some DLM lockspaces might be in use and cannot be closed automatically.
+3. The autoactivation property of volume group will be disabled when
vg_access_mode
+is set to system_id.
+
Option: OCF_CHECK_LEVEL
The standard monitor operation of depth 0 checks if the VG or LV is valid.
@@ -658,11 +661,20 @@
}
systemid_activate() {
+ set_autoactivation=0
cur_systemid=$(vgs --foreign --noheadings -o systemid ${VG} | tr -d
'[:blank:]')
# Put our system ID on the VG
vgchange -y --config "local/extra_system_ids=[\"${cur_systemid}\"]" \
--systemid ${SYSTEM_ID} ${VG}
+ vgchange --help | grep '\--setautoactivation' >/dev/null 2>&1 &&
set_autoactivation=1
+
+ if [ $set_autoactivation -ne 0 ]; then
+ if vgs -o autoactivation ${VG} | grep enabled >/dev/null 2>&1 ;
then
+ ocf_log info "disable the autoactivation property of
${VG}"
+ ocf_run vgchange --setautoactivation n ${VG}
+ fi
+ fi
do_activate "-ay"
if [ $? -ne $OCF_SUCCESS ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/Makefile.am
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/Makefile.am
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/Makefile.am
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/Makefile.am
2021-04-30 16:27:24.000000000 +0200
@@ -142,6 +142,7 @@
openstack-cinder-volume \
openstack-floating-ip \
openstack-info \
+ openstack-virtual-ip \
oraasm \
oracle \
oralsnr \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/azure-events.in
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/azure-events.in
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/azure-events.in
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/azure-events.in
2021-04-30 16:27:24.000000000 +0200
@@ -70,7 +70,7 @@
metadata_host = "http://169.254.169.254/metadata"
instance_api = "instance"
events_api = "scheduledevents"
- api_version = "2017-08-01"
+ api_version = "2019-08-01"
@staticmethod
def _sendMetadataRequest(endpoint, postData=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/gcp-ilb
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/gcp-ilb
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/gcp-ilb 1970-01-01
01:00:00.000000000 +0100
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/gcp-ilb 2021-04-30
16:27:24.000000000 +0200
@@ -0,0 +1,343 @@
+#!/bin/sh
+# ---------------------------------------------------------------------
+# # Copyright 2021 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# Authors: Fatima Silveira, Lucia Subatin
+# ---------------------------------------------------------------------
+# Description: Wrapper to respond to probe requests from health
+# check agents in Google Cloud Platform. Nothing is specific to Google
+# Cloud.
+# ---------------------------------------------------------------------
+
+
+# Initialization:
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
+
+# Defaults
+OCF_RESKEY_cat_default="socat"
+OCF_RESKEY_port_default="60000"
+OCF_RESKEY_log_enable_default="false"
+OCF_RESKEY_log_cmd_default="gcloud"
+OCF_RESKEY_log_params_default="logging write GCPILB"
+OCF_RESKEY_log_end_params_default=""
+
+
+if type "socat" > /dev/null 2>&1; then
+ OCF_RESKEY_cat_default="socat"
+else
+ OCF_RESKEY_cat_default="nc"
+fi;
+
+
+: ${OCF_RESKEY_cat=${OCF_RESKEY_cat_default}}
+: ${OCF_RESKEY_port=${OCF_RESKEY_port_default}}
+: ${OCF_RESKEY_log_enable=${OCF_RESKEY_log_enable_default}}
+: ${OCF_RESKEY_log_cmd=${OCF_RESKEY_log_cmd_default}}
+: ${OCF_RESKEY_log_params=${OCF_RESKEY_log_params_default}}
+: ${OCF_RESKEY_log_end_params=${OCF_RESKEY_log_end_params_default}}
+
+
+process="$OCF_RESOURCE_INSTANCE"
+pidfile="/var/run/$OCF_RESOURCE_INSTANCE.pid"
+
+
+#Validate command for logging
+if $OCF_RESKEY_log_enable = "true"; then
+ if type $OCF_RESKEY_log_cmd > /dev/null 2>&1; then
+ logging_cmd="$OCF_RESKEY_log_cmd $OCF_RESKEY_log_params"
+ ocf_log debug "Logging command is: \'$logging_cmd\' "
+ else
+ $OCF_RESKEY_log_enable = "false"
+ ocf_log err "\'$logging_cmd\' is invalid. External logging disabled."
+
+ fi;
+fi
+
+
+#######################################################################
+ilb_metadata() {
+cat <<END
+<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="gcp-lb">
+<version>1.0</version>
+<longdesc lang="en">
+ Resource Agent that wraps /usr/bin/nc or /usr/bin/socat to reply to health
checks in Google Cloud.
+ See https://cloud.google.com/load-balancing/docs/health-checks for more
information.
+</longdesc>
+
+<shortdesc lang="en">Replies to health checks from Google Cloud</shortdesc>
+
+<parameters>
+ <parameter name="port">
+ <longdesc lang="en">
+ Listening port for health-check probes. Default:
${OCF_RESKEY_port_default}
+ </longdesc>
+ <shortdesc lang="en">Listening port (def ${OCF_RESKEY_port_default})
</shortdesc>
+ <content type="string" default="${OCF_RESKEY_port_default}" />
+ </parameter>
+
+ <parameter name="cat">
+ <longdesc lang="en">
+ Location of netcat (default: /usr/bin/nc ) or socat (default:
/usr/bin/socat ). If present, is used /usr/bin/socat.
+ The recommended binary is socat, present in the following minimum
versions if the package resource-agents:
+ - SLES 12 SP4/SP5: resource-agents-4.3.018.a7fb5035-3.30.1.
+ - SLES 15/15 SP1: resource-agents-4.3.0184.6ee15eb2-4.13.1.
+ </longdesc>
+ <shortdesc lang="en">Path to nc / socat </shortdesc>
+ <content type="string" default="${OCF_RESKEY_cat_default}" />
+ </parameter>
+ <parameter name="log_enable">
+ <longdesc lang="en">
+ Logging with an external application is enabled (accepts "true" or
"false"). The defaults are configured to call "gcloud logging" (see:
https://cloud.google.com/sdk/gcloud/reference/logging).
+ </longdesc>
+ <shortdesc lang="en">Log enabled </shortdesc>
+ <content type="string" default="${OCF_RESKEY_log_enable_default}" />
+ </parameter>
+ <parameter name="log_cmd">
+ <longdesc lang="en">
+ External logging command. The defaults are configured to call
"gcloud logging" (see: https://cloud.google.com/sdk/gcloud/reference/logging).
+ This parameter should only have the binary that can be validated
(e.g., gcloud). The rest of the command is formed with the additional
parameters
+ and the message being logged as follows:
+ - log_cmd + log_params + "The message being logged" + log_end_params
+
+ Using the gcloud command for Stackdriver logging, the parameters
would be:
+ - log_cmd = gcloud
+ - log_params = logging write GCPILB
+ - "This is a message being sent by the app"
+ - log_end_params = (nothing in this case, this is reserved for use
with other tools)
+ Which would result in this valid command (where GCPILB is the name
of the log):
+ gcloud logging write GCPILB "This is a message being sent by the
app"
+
+ NOTE: Only the binary is validated for existence and no further
checks are performed. The assumption is that only administrators with root
access can configure this tool.
+ </longdesc>
+ <shortdesc lang="en">External log command </shortdesc>
+ <content type="string" default="${OCF_RESKEY_log_cmd_default}" />
+ </parameter>
+ <parameter name="log_params">
+ <longdesc lang="en">
+ Additional input for the logging application. See explanation for
log_cmd
+ </longdesc>
+ <shortdesc lang="en">Additional input 1 </shortdesc>
+ <content type="string" default="${OCF_RESKEY_log_params_default}" />
+ </parameter>
+ <parameter name="log_end_params">
+ <longdesc lang="en">
+ Additional input for the logging application. Placed after the
message being logged.
+ </longdesc>
+ <shortdesc lang="en">Additional input 1 </shortdesc>
+ <content type="string" default="${OCF_RESKEY_log_end_params_default}"
/>
+ </parameter>
+
+</parameters>
+
+<actions>
+ <action name="start" timeout="10s" />
+ <action name="stop" timeout="30s" />
+ <action name="monitor" depth="0" timeout="30s" interval="30s" />
+ <action name="validate-all" timeout="5s" />
+ <action name="meta-data" timeout="5s" />
+</actions>
+</resource-agent>
+END
+exit 0
+}
+
+#######################################################################
+
+log() {
+ lvl=$1
+ msg=$2
+ ocf_log $lvl "$0 - $process - $pid: $msg"
+ if ocf_is_true "${OCF_RESKEY_log_enable}" ; then
+ ( ${OCF_RESKEY_log_cmd} ${OCF_RESKEY_log_params} "L $lvl: $msg"
${OCF_RESKEY_log_end_params} )
+ fi
+}
+
+getpid() {
+ if ! [ -f "$pidfile" ] ; then
+ return
+ fi
+
+ cat $pidfile
+}
+
+ilb_usage() {
+ cat <<END
+usage: $0 {start|stop|monitor|status|meta-data|validate-all}
+
+Agent wrapping socat or nc to reply to health probes.
+END
+}
+
+
+
+
+ilb_monitor() {
+
+ pid=`getpid`
+ log debug "pid is $pid"
+
+ if [ -z "$pid" ] ; then
+ return $OCF_NOT_RUNNING
+ fi
+
+ if [ -n "$pid" ] && kill -s 0 $pid ; then
+ log debug "Process is currently running"
+ return $OCF_SUCCESS
+ else
+ log warn "The process is not running but has a pidfile.
Removing file"
+ rm -f $pidfile
+ return $OCF_NOT_RUNNING
+ fi
+
+}
+
+ilb_start() {
+
+ if ilb_monitor; then
+ log debug "Process is already running"
+ return $OCF_SUCCESS
+ fi
+
+ cmd="$OCF_RESKEY_cat -U
TCP-LISTEN:$OCF_RESKEY_port,backlog=10,fork,reuseaddr /dev/null"
+
+ if [ $( basename $OCF_RESKEY_cat ) = 'nc' ]; then
+ cmd="$OCF_RESKEY_cat -l -k $OCF_RESKEY_port"
+ fi
+
+ log debug "Starting with \'$cmd\'"
+ ( ${cmd} ) & pid="$!"
+ disown
+
+ if [ -n "$pid" ] ; then
+ log debug "$pid is started"
+ echo "$pid" > $pidfile
+ return $OCF_SUCCESS
+ else
+ log err "\'$cmd\' could not be started"
+ return $OCF_ERR_GENERIC
+ fi
+
+}
+
+ilb_stop() {
+
+ if ! ilb_monitor; then
+ rm -f $pidfile
+ return $OCF_SUCCESS
+ fi
+
+ if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
+ # Allow 2/3 of the action timeout for the orderly shutdown
+ # (The origin unit is ms, hence the conversion)
+ stop_timeout=$((OCF_RESKEY_CRM_meta_timeout/1500))
+ else
+ stop_timeout=10
+ fi
+
+
+ pid=`getpid`
+ kill $pid
+
+ i=0
+ while [ $i -lt $stop_timeout ]; do
+ if ! ilb_monitor; then
+ rm -f $pidfile
+ return $OCF_SUCCESS
+ fi
+ sleep 1
+ i=$((i+1))
+ done
+
+ log warn "Stop with SIGTERM failed/timed out, now sending SIGKILL."
+
+ i=0
+ while [ $i -lt $stop_timeout ]; do
+
+ kill -s 9 $pid
+
+ if ! ilb_monitor; then
+ log warn "SIGKILL did the job."
+ rm -f $pidfile
+ return $OCF_SUCCESS
+ fi
+ log info "The job still hasn't stopped yet. Re-trying
SIGKILL..."
+ sleep 2
+ i=$((i+2))
+ done
+
+ log err "The cat has more than 9 lives and could not be terminated."
+ return $OCF_ERR_GENERIC
+
+}
+
+ilb_validate() {
+ check_binary "$OCF_RESKEY_cat"
+ check_binary "$OCF_RESKEY_log_cmd"
+
+ if ! ocf_is_decimal "$OCF_RESKEY_port"; then
+ ocf_exit_reason "$OCF_RESKEY_port is not a valid port"
+ exit $OCF_ERR_CONFIGURED
+ fi
+
+ return $OCF_SUCCESS
+}
+
+###############################################################################
+#
+# MAIN
+#
+###############################################################################
+
+case $__OCF_ACTION in
+ meta-data)
+ ilb_metadata
+ exit $OCF_SUCCESS
+ ;;
+ usage|help)
+ ilb_usage
+ exit $OCF_SUCCESS
+ ;;
+esac
+
+if ! ocf_is_root; then
+ log err "You must be root for $__OCF_ACTION operation."
+ exit $OCF_ERR_PERM
+fi
+
+case $__OCF_ACTION in
+ start)
+ ilb_validate
+ ilb_start
+ ;;
+ stop)
+ ilb_stop
+ ;;
+ monitor)
+ ilb_monitor
+ ;;
+ validate-all)
+ ilb_validate
+ ;;
+ *)
+ ilb_usage
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+
+rc=$?
+log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION returned $rc"
+
+exit $rc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/gcp-vpc-move-vip.in
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/gcp-vpc-move-vip.in
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/gcp-vpc-move-vip.in
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/gcp-vpc-move-vip.in
2021-04-30 16:27:24.000000000 +0200
@@ -50,6 +50,8 @@
CONN = None
THIS_VM = None
ALIAS = None
+MAX_RETRIES = 3
+RETRY_BACKOFF_SECS = 1
METADATA_SERVER = 'http://metadata.google.internal/computeMetadata/v1/'
METADATA_HEADERS = {'Metadata-Flavor': 'Google'}
METADATA = \
@@ -111,18 +113,37 @@
Returns:
HTTP response from the GET request.
-
- Raises:
- urlerror.HTTPError: raises when the GET request fails.
"""
- timeout = timeout or 60
- metadata_url = os.path.join(METADATA_SERVER, metadata_key)
- params = urlparse.urlencode(params or {})
- url = '%s?%s' % (metadata_url, params)
- request = urlrequest.Request(url, headers=METADATA_HEADERS)
- request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({}))
- return request_opener.open(
- request, timeout=timeout * 1.1).read().decode("utf-8")
+ for i in range(MAX_RETRIES):
+ try:
+ timeout = timeout or 60
+ metadata_url = os.path.join(METADATA_SERVER, metadata_key)
+ params = urlparse.urlencode(params or {})
+ url = '%s?%s' % (metadata_url, params)
+ request = urlrequest.Request(url, headers=METADATA_HEADERS)
+ request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({}))
+ return request_opener.open(
+ request, timeout=timeout * 1.1).read().decode("utf-8")
+ except Exception as e:
+ logger.error('Couldn\'t get instance name, is this running inside GCE?: '
+ + str(e))
+ time.sleep(RETRY_BACKOFF_SECS * (i + 1))
+
+ # If the retries are exhausted we exit with a generic error.
+ sys.exit(OCF_ERR_GENERIC)
+
+
+def create_api_connection():
+ for i in range(MAX_RETRIES):
+ try:
+ return googleapiclient.discovery.build('compute', 'v1',
+ cache_discovery=False)
+ except Exception as e:
+ logger.error('Couldn\'t connect with google api: ' + str(e))
+ time.sleep(RETRY_BACKOFF_SECS * (i + 1))
+
+ # If the retries are exhausted we exit with a generic error.
+ sys.exit(OCF_ERR_GENERIC)
def get_instance(project, zone, instance):
@@ -358,24 +379,11 @@
def validate():
global ALIAS
- global CONN
global THIS_VM
+ global CONN
- # Populate global vars
- try:
- CONN = googleapiclient.discovery.build('compute', 'v1',
- cache_discovery=False)
- except Exception as e:
- logger.error('Couldn\'t connect with google api: ' + str(e))
- sys.exit(OCF_ERR_CONFIGURED)
-
- try:
- THIS_VM = get_metadata('instance/name')
- except Exception as e:
- logger.error('Couldn\'t get instance name, is this running inside GCE?: '
- + str(e))
- sys.exit(OCF_ERR_CONFIGURED)
-
+ CONN = create_api_connection()
+ THIS_VM = get_metadata('instance/name')
ALIAS = os.environ.get('OCF_RESKEY_alias_ip')
if not ALIAS:
logger.error('Missing alias_ip parameter')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-cinder-volume
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-cinder-volume
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-cinder-volume
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-cinder-volume
2021-04-30 16:27:24.000000000 +0200
@@ -27,6 +27,7 @@
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
+
#######################################################################
# Initialization:
@@ -35,13 +36,9 @@
# Defaults
OCF_RESKEY_openstackcli_default="/usr/bin/openstack"
-OCF_RESKEY_node_id_cache_file_default="${HA_RSCTMP}/node_id"
OCF_RESKEY_volume_local_check_default="true"
-export attached_server_id=""
-
: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}}
-: ${OCF_RESKEY_node_id_cache_file=${OCF_RESKEY_node_id_cache_file_default}}
: ${OCF_RESKEY_volume_local_check=${OCF_RESKEY_volume_local_check_default}}
#######################################################################
@@ -79,17 +76,6 @@
<content type="string" default="${OCF_RESKEY_openstackcli_default}" />
</parameter>
-<parameter name="node_id_cache_file">
-<longdesc lang="en">
-Path to Node ID cache file, used to avoid Openstack API calls:
-1. Is the local file written?
-2. Is openstack_id available as a node attribute?
-3. Can we get it from the API?
-</longdesc>
-<shortdesc lang="en">Path to Node ID cache file</shortdesc>
-<content type="string" default="${OCF_RESKEY_node_id_cache_file_default}" />
-</parameter>
-
<parameter name="volume_local_check">
<longdesc lang="en">
This option allows the cluster to monitor the cinder volume presence without
@@ -128,83 +114,19 @@
END
}
-#
-# This is used to get the node ID from different sources:
-# 1. Is the local file written?
-# 2. Is openstack_id available as a node attribute?
-# 3. Can we get it from the API?
-#
-# When the ID is retrieved, the local cache file is written.
-# This prevents the agent to call the API each time the agent is used.
-#
_get_node_id() {
- local crm_node
- local node
- local node_id
- local result
-
- crm_node=$(crm_node -n)
-
- #
- # Use local cache
- #
- if [ -f $OCF_RESKEY_node_id_cache_file ] ; then
- node_id=$(cat $OCF_RESKEY_node_id_cache_file)
-
- if [ ! -z "$node_id" ] ; then
- echo $node_id
- return
- fi
- fi
+ node_id=$(${HA_SBIN_DIR}/attrd_updater --query -n openstack_id -N
$(crm_node -n) |
+ awk -F= '{gsub("\"","");print $NF}')
- #
- # Query the attributes database
- #
- node_id=$(${HA_SBIN_DIR}/attrd_updater --query -n openstack_id -N
$crm_node \
- | tr ' ' '\n' \
- | awk -F= '/value=/ {gsub("\"","");print $NF}')
-
- if [ ! -z "$node_id" ] ; then
- echo $node_id | awk '{print $1}'
- echo $node_id | awk '{print $1}' >
$OCF_RESKEY_node_id_cache_file
- return
- fi
-
- #
- # Use the API
- #
- node=$(crm_node -n | awk -F. '{print $1}')
-
- result=$($OCF_RESKEY_openstackcli server list \
- --format value --column ID --column Name \
- | grep $node)
-
- if [ $? -eq 0 ] ; then
- echo $result | awk '{print $1}'
- echo $result | awk '{print $1}' > $OCF_RESKEY_node_id_cache_file
- return
+ if ! echo $node_id|grep -P
"^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$"; then
+ ocf_exit_reason "openstack_id attribute must be set for node
$crm_node"
+ exit $OCF_ERR_CONFIGURED
fi
-
- ocf_exit_reason "openstack_id attribute must be set for node $crm_node"
- return $OCF_ERR_CONFIGURED
}
osvol_validate() {
- local node_id
-
check_binary "$OCF_RESKEY_openstackcli"
- check_binary "awk"
- check_binary "tr"
- . $OCF_RESKEY_openrc
-
- node_id=$(_get_node_id)
-
- if [ -z "$node_id" ] ; then
- ocf_exit_reason "openstack_id attribute must be set for node
$crm_node"
- return $OCF_ERR_CONFIGURED
- fi
-
if [ -z "$OCF_RESKEY_openrc" ]; then
ocf_exit_reason "openrc parameter not set"
return $OCF_ERR_CONFIGURED
@@ -215,6 +137,19 @@
return $OCF_ERR_CONFIGURED
fi
+ . $OCF_RESKEY_openrc
+
+ if ! $OCF_RESKEY_openstackcli volume list|grep -q $OCF_RESKEY_volume_id
; then
+ ocf_exit_reason "volume-id $OCF_RESKEY_volume_id not found"
+ return $OCF_ERR_CONFIGURED
+ fi
+
+ ${HA_SBIN_DIR}/attrd_updater --query -n openstack_id -N $(crm_node -n)
> /dev/null 2>&1
+ if [ $? -ne 0 ] ; then
+ ocf_log warn "attr_updater failed to get openstack_id attribute
of node $OCF_RESOURCE_INSTANCE"
+ return $OCF_ERR_GENERIC
+ fi
+
return $OCF_SUCCESS
}
@@ -222,7 +157,8 @@
local result
local node_id
local short_volume_id
- local fdisk_command
+
+ node_id=$(_get_node_id)
if ocf_is_true $OCF_RESKEY_volume_local_check ; then
#
@@ -230,43 +166,38 @@
# We check the local devices
#
short_volume_id=$(echo $OCF_RESKEY_volume_id | awk '{print
substr($0, 0, 20)}')
- if uname | grep -q Linux ; then
- fdisk_command="fdisk -l"
- else
- fdisk_command="fdisk"
- fi
-
- $fdisk_command /dev/disk/by-id/virtio-$short_volume_id
1>/dev/null 2>&1
- if [ $? -eq 0 ] ; then
+ if lsblk /dev/disk/by-id/virtio-$short_volume_id 1>/dev/null
2>&1; then
return $OCF_SUCCESS
else
- ocf_log warn "$OCF_RESKEY_volume_id is not attached to
instance $(_get_node_id)"
+ ocf_log warn "$OCF_RESKEY_volume_id is not attached to
instance $node_id"
return $OCF_NOT_RUNNING
fi
- else
- #
- # Is the volue attached?
- # We use the API
- #
- result=$($OCF_RESKEY_openstackcli volume show \
- --column status \
- --column attachments \
- --format value \
- $OCF_RESKEY_volume_id)
+ fi
- if echo "$result" | grep -q available ; then
- ocf_log warn "$OCF_RESKEY_volume_id is not attached to
any instance"
- return $OCF_NOT_RUNNING
- else
- export attached_server_id=$(echo $result|head -n1|awk
-F "'" '{print $4}')
- ocf_log info "$OCF_RESKEY_volume_id is attached to
instance $attached_server_id"
+ #
+ # Is the volue attached?
+ # We use the API
+ #
+ result=$($OCF_RESKEY_openstackcli volume show \
+ --column status \
+ --column attachments \
+ --format value \
+ $OCF_RESKEY_volume_id)
+
+ if echo "$result" | grep -q available ; then
+ ocf_log warn "$OCF_RESKEY_volume_id is not attached to any
instance"
+ return $OCF_NOT_RUNNING
+ else
+ export attached_server_id=$(echo $result|head -n1|
+ grep -P -o "'server_id':
'[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}'"|
+ grep -P -o "[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}")
+ ocf_log info "$OCF_RESKEY_volume_id is attached to instance
$attached_server_id"
- # Compare node_id and the id of the node the volume is
attached to
- node_id=$(_get_node_id)
+ # Compare node_id and the id of the node the volume is attached
to
- if [ "$node_id" != "$attached_server_id" ] ; then
- return $OCF_NOT_RUNNING
- fi
+ if [ "$node_id" != "$attached_server_id" ] ; then
+ ocf_log warn "$OCF_RESKEY_volume_id is not attached to
this instance"
+ return $OCF_NOT_RUNNING
fi
fi
@@ -288,7 +219,7 @@
node_id=$(_get_node_id)
#
- # Unmout the volume
+ # Detach the volume
#
if ! $OCF_RESKEY_openstackcli server remove volume $node_id
$OCF_RESKEY_volume_id ; then
ocf_log error "Couldn't remove volume $OCF_RESKEY_volume_id
from instance $node_id"
@@ -312,7 +243,7 @@
fi
#
- # Unmout it from another node
+ # Detach it from another node
# TODO: make it optional in case multi-attachment is allowed by Cinder
#
if [ ! -z $attached_server_id ] ; then
@@ -360,19 +291,23 @@
exit $OCF_ERR_PERM
fi
-osvol_validate
-
case $__OCF_ACTION in
start)
+ osvol_validate || exit $?
osvol_start;;
stop)
+ osvol_validate || exit $?
osvol_stop;;
monitor|status)
+ osvol_validate || exit $?
osvol_monitor;;
validate-all)
- exit $?;;
+ osvol_validate
+ ;;
*)
echo $USAGE
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
+
+exit $?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-floating-ip
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-floating-ip
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-floating-ip
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-floating-ip
2021-04-30 16:27:24.000000000 +0200
@@ -147,10 +147,8 @@
local node_port_ids
local port
local buffer
- local crm_node
- crm_node=$(crm_node -n)
- node_port_ids=$(${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports
-N $crm_node \
+ node_port_ids=$(${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports
-N $(crm_node -n) \
| awk -F= '{gsub("\"","");print $NF}' \
| tr ',' ' ' \
| awk -F: '{print $NF}')
@@ -194,7 +192,7 @@
return $OCF_ERR_GENERIC
fi
- ocf_log info "Successfully brought unset $OCF_RESKEY_ip_id"
+ ocf_log info "Successfully brought down $OCF_RESKEY_ip_id"
return $OCF_SUCCESS
}
@@ -230,6 +228,7 @@
return $OCF_ERR_GENERIC
fi
+ ocf_log info "Successfully brought up $OCF_RESKEY_ip_id"
return $OCF_SUCCESS
}
@@ -255,19 +254,23 @@
exit $OCF_ERR_PERM
fi
-osflip_validate
-
case $__OCF_ACTION in
start)
+ osflip_validate || exit $?
osflip_start;;
stop)
+ osflip_validate || exit $?
osflip_stop;;
monitor)
+ osflip_validate || exit $?
osflip_monitor;;
validate-all)
- exit $?;;
+ osflip_validate
+ ;;
*)
echo $USAGE
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
+
+exit $?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-info.in
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-info.in
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-info.in
2021-04-14 13:16:57.000000000 +0200
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-info.in
2021-04-30 16:27:24.000000000 +0200
@@ -270,7 +270,8 @@
meta-data) meta_data
exit $OCF_SUCCESS
;;
-start) OSInfo_start
+start) OSInfo_validate || exit $?
+ OSInfo_start
;;
stop) OSInfo_stop
;;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-virtual-ip
new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-virtual-ip
--- old/resource-agents-4.8.0+git12.3068bf8b/heartbeat/openstack-virtual-ip
1970-01-01 01:00:00.000000000 +0100
+++ new/resource-agents-4.8.0+git28.5c54175d/heartbeat/openstack-virtual-ip
2021-04-30 16:27:24.000000000 +0200
@@ -0,0 +1,280 @@
+#!/bin/sh
+#
+#
+# OCF resource agent to move a virtual address in an Openstack tenant.
+#
+# Copyright (c) 2018 Mathieu GRZYBEK
+# Based on code of Markus Guertler
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of version 2 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Further, this software is distributed without any warranty that it is
+# free of the rightful claim of any third person regarding infringement
+# or the like. Any license provided herein, whether implied or
+# otherwise, applies only to this software file. Patent licenses, if
+# any, provided herein do not apply to combinations of this program with
+# other software, or any other product whatsoever.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+#
+
+
+#######################################################################
+# Initialization:
+
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
+
+# Defaults
+OCF_RESKEY_openstackcli_default="/usr/bin/openstack"
+
+: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}}
+
+#######################################################################
+
+
+USAGE="usage: $0 {start|stop|status|meta-data}";
+###############################################################################
+
+
+###############################################################################
+#
+# Functions
+#
+###############################################################################
+
+
+metadata() {
+cat <<END
+<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="openstack-virtual-ip">
+<version>2.0</version>
+<longdesc lang="en">
+Resource Agent to move a virtual IP address from an instance to another one
+by adding an allowed-address pair associated with an instance port.
+It relies on attributes given by openstack-info resource agent
(openstack_ports, openstack_id attributes).
+The attribute called "openstack_virtual_ip" is updated.
+</longdesc>
+<shortdesc lang="en">Move a virtual IP</shortdesc>
+
+<parameters>
+<parameter name="openstackcli">
+<longdesc lang="en">
+Path to command line tools for openstack.
+</longdesc>
+<shortdesc lang="en">Path to Openstack CLI tool</shortdesc>
+<content type="string" default="${OCF_RESKEY_openstackcli_default}" />
+</parameter>
+
+<parameter name="openrc" required="1">
+<longdesc lang="en">
+Valid Openstack credentials as openrc file from api_access/openrc.
+</longdesc>
+<shortdesc lang="en">openrc file</shortdesc>
+<content type="string" />
+</parameter>
+
+<parameter name="ip" required="1">
+<longdesc lang="en">
+Virtual IP Address.
+</longdesc>
+<shortdesc lang="en">IP Address</shortdesc>
+<content type="string" />
+</parameter>
+
+<parameter name="subnet_id" required="1">
+<longdesc lang="en">
+Subnet Identifier to use to attach the address.
+</longdesc>
+<shortdesc lang="en">Subnet ID</shortdesc>
+<content type="string" />
+</parameter>
+
+</parameters>
+
+<actions>
+<action name="start" timeout="180s" />
+<action name="stop" timeout="180s" />
+<action name="monitor" depth="0" timeout="30s" interval="60s" />
+<action name="validate-all" timeout="5s" />
+<action name="meta-data" timeout="5s" />
+</actions>
+</resource-agent>
+END
+}
+
+osvip_port_id() {
+ # Get port_id from subnet_id
+ node_port_ids=$(${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports
-N $(crm_node -n) \
+ | awk '{gsub("value=","") ; gsub("\"","") ; print $NF}')
+
+ node_port_id=$(echo $node_port_ids \
+ | tr ',' '\n' \
+ | awk -F: "/$OCF_RESKEY_subnet_id/ {print \$2}")
+
+ echo ${node_port_id}
+}
+
+osvip_validate() {
+ check_binary "$OCF_RESKEY_openstackcli"
+
+ if [ -z "$OCF_RESKEY_openrc" ]; then
+ ocf_exit_reason "openrc parameter not set"
+ return $OCF_ERR_CONFIGURED
+ fi
+
+ if [ ! -f "$OCF_RESKEY_openrc" ] ; then
+ ocf_exit_reason "openrc file not found"
+ return $OCF_ERR_CONFIGURED
+ fi
+
+ . $OCF_RESKEY_openrc
+
+ ${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports -N $(crm_node
-n) > /dev/null 2>&1
+ if [ $? -ne 0 ] ; then
+ ocf_log warn "attr_updater failed to get openstack_ports
attribute of node $OCF_RESOURCE_INSTANCE"
+ return $OCF_ERR_GENERIC
+ fi
+
+ return $OCF_SUCCESS
+}
+
+osvip_monitor() {
+ local result
+
+ node_port_id=$(osvip_port_id)
+
+ result=$($OCF_RESKEY_openstackcli port show \
+ --format value \
+ --column allowed_address_pairs \
+ ${node_port_id})
+ if echo $result | grep -q $OCF_RESKEY_ip ; then
+ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -S status -n
openstack_virtual_ip -v $OCF_RESKEY_ip
+
+ return $OCF_SUCCESS
+ fi
+
+ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -S state -n
openstack_virtual_ip
+ ocf_log warn "$OCF_RESKEY_ip is not attached to any fixed address"
+ return $OCF_NOT_RUNNING
+}
+
+osvip_stop() {
+ node_port_id=$(osvip_port_id)
+
+ ocf_log info "Bringing down IP address $OCF_RESKEY_ip"
+
+ osvip_monitor
+ if [ $? = $OCF_NOT_RUNNING ]; then
+ ocf_log info "Address $OCF_RESKEY_ip already down"
+ return $OCF_SUCCESS
+ fi
+
+ mac_address=$($OCF_RESKEY_openstackcli port show \
+ --format value \
+ --column mac_address \
+ $node_port_id)
+ echo ${mac_address} | grep -q -P "^([0-9a-f]{2}:){5}[0-9a-f]{2}$"
+ if [ $? -ne 0 ]; then
+ ocf_log error "MAC address '${mac_address}' is not valid."
+ return $OCF_ERR_GENERIC
+ fi
+
+ if ! $OCF_RESKEY_openstackcli port unset \
+ --allowed-address \
+ ip-address=$OCF_RESKEY_ip,mac-address=${mac_address} \
+ $node_port_id; then
+ return $OCF_ERR_GENERIC
+ fi
+
+ osvip_monitor
+ if [ $? != $OCF_NOT_RUNNING ]; then
+ ocf_log error "Couldn't unset IP address $OCF_RESKEY_ip."
+ return $OCF_ERR_GENERIC
+ fi
+
+ ocf_log info "Successfully brought down $OCF_RESKEY_ip"
+ return $OCF_SUCCESS
+}
+
+osvip_start() {
+ node_port_id=$(osvip_port_id)
+
+ osvip_monitor
+ if [ $? = $OCF_SUCCESS ]; then
+ ocf_log info "$OCF_RESKEY_ip already started"
+ return $OCF_SUCCESS
+ fi
+
+ ocf_log info "Moving IP address $OCF_RESKEY_ip to port ID $node_port_id"
+
+ $OCF_RESKEY_openstackcli port set \
+ --allowed-address ip-address=$OCF_RESKEY_ip \
+ $node_port_id
+ if [ $? != $OCF_SUCCESS ]; then
+ ocf_log error "$OCF_RESKEY_ip Cannot be set to port
$node_port_id"
+ return $OCF_ERR_GENERIC
+ fi
+
+ osvip_monitor
+ if [ $? != $OCF_SUCCESS ]; then
+ ocf_log error "$OCF_RESKEY_ip Cannot be set to port
$node_port_id"
+ return $OCF_ERR_GENERIC
+ fi
+
+ ocf_log info "Successfully brought up $OCF_RESKEY_ip"
+ return $OCF_SUCCESS
+}
+
+###############################################################################
+#
+# MAIN
+#
+###############################################################################
+
+case $__OCF_ACTION in
+ meta-data)
+ metadata
+ exit $OCF_SUCCESS
+ ;;
+ usage|help)
+ echo $USAGE
+ exit $OCF_SUCCESS
+ ;;
+esac
+
+if ! ocf_is_root; then
+ ocf_log err "You must be root for $__OCF_ACTION operation."
+ exit $OCF_ERR_PERM
+fi
+
+case $__OCF_ACTION in
+ start)
+ osvip_validate || exit $?
+ osvip_start;;
+ stop)
+ osvip_validate || exit $?
+ osvip_stop;;
+ monitor)
+ osvip_validate || exit $?
+ osvip_monitor;;
+ validate-all)
+ osvip_validate
+ ;;
+ *)
+ echo $USAGE
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+
+exit $?