From f065e80dd194617de7629007591f84adc8c0ed1a Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 08 2022 06:31:11 +0000 Subject: import resource-agents-4.9.0-29.el8 --- diff --git a/.gitignore b/.gitignore index 777a610..0be9218 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,7 @@ SOURCES/aliyun-python-sdk-ecs-4.9.3.tar.gz SOURCES/aliyun-python-sdk-vpc-3.0.2.tar.gz SOURCES/colorama-0.3.3.tar.gz SOURCES/google-cloud-sdk-360.0.0-linux-x86_64.tar.gz +SOURCES/httplib2-0.20.4.tar.gz SOURCES/pycryptodome-3.6.4.tar.gz +SOURCES/pyparsing-2.4.7-py2.py3-none-any.whl SOURCES/pyroute2-0.4.13.tar.gz diff --git a/.resource-agents.metadata b/.resource-agents.metadata index d0d8224..72a2f70 100644 --- a/.resource-agents.metadata +++ b/.resource-agents.metadata @@ -5,5 +5,7 @@ c2a98b9a1562d223a76514f05028488ca000c395 SOURCES/aliyun-python-sdk-ecs-4.9.3.tar f14647a4d37a9a254c4e711b95a7654fc418e41e SOURCES/aliyun-python-sdk-vpc-3.0.2.tar.gz 0fe5bd8bca54dd71223778a1e0bcca9af324abb1 SOURCES/colorama-0.3.3.tar.gz 81f039cf075e9c8b70d5af99c189296a9e031de3 SOURCES/google-cloud-sdk-360.0.0-linux-x86_64.tar.gz +7caf4412d9473bf17352316249a8133fa70b7e37 SOURCES/httplib2-0.20.4.tar.gz 326a73f58a62ebee00c11a12cfdd838b196e0e8e SOURCES/pycryptodome-3.6.4.tar.gz +c8307f47e3b75a2d02af72982a2dfefa3f56e407 SOURCES/pyparsing-2.4.7-py2.py3-none-any.whl 147149db11104c06d405fd077dcd2aa1c345f109 SOURCES/pyroute2-0.4.13.tar.gz diff --git a/SOURCES/7-gcp-bundled.patch b/SOURCES/7-gcp-bundled.patch index b341dac..4e983ef 100644 --- a/SOURCES/7-gcp-bundled.patch +++ b/SOURCES/7-gcp-bundled.patch @@ -1,6 +1,6 @@ -diff -uNr a/heartbeat/gcp-vpc-move-ip.in b/heartbeat/gcp-vpc-move-ip.in ---- a/heartbeat/gcp-vpc-move-ip.in 2019-04-05 09:20:26.164739897 +0200 -+++ b/heartbeat/gcp-vpc-move-ip.in 2019-04-05 09:21:01.331139742 +0200 +diff --color -uNr a/heartbeat/gcp-vpc-move-ip.in b/heartbeat/gcp-vpc-move-ip.in +--- a/heartbeat/gcp-vpc-move-ip.in 2022-06-16 09:45:21.419090782 +0200 ++++ b/heartbeat/gcp-vpc-move-ip.in 2022-06-16 10:11:22.978648598 +0200 @@ -36,7 +36,7 @@ . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs @@ -10,9 +10,9 @@ diff -uNr a/heartbeat/gcp-vpc-move-ip.in b/heartbeat/gcp-vpc-move-ip.in OCF_RESKEY_configuration_default="default" OCF_RESKEY_vpc_network_default="default" OCF_RESKEY_interface_default="eth0" -diff -uNr a/heartbeat/gcp-vpc-move-route.in b/heartbeat/gcp-vpc-move-route.in ---- a/heartbeat/gcp-vpc-move-route.in 2019-04-05 09:20:26.180739624 +0200 -+++ b/heartbeat/gcp-vpc-move-route.in 2019-04-05 09:22:28.648649593 +0200 +diff --color -uNr a/heartbeat/gcp-vpc-move-route.in b/heartbeat/gcp-vpc-move-route.in +--- a/heartbeat/gcp-vpc-move-route.in 2022-06-16 09:45:21.420090788 +0200 ++++ b/heartbeat/gcp-vpc-move-route.in 2022-06-16 10:11:22.978648598 +0200 @@ -45,6 +45,7 @@ from ocf import * @@ -20,4 +20,15 @@ diff -uNr a/heartbeat/gcp-vpc-move-route.in b/heartbeat/gcp-vpc-move-route.in + sys.path.insert(0, '/usr/lib/resource-agents/bundled/gcp') import googleapiclient.discovery import pyroute2 - except ImportError: + try: +diff --color -uNr a/heartbeat/gcp-vpc-move-vip.in b/heartbeat/gcp-vpc-move-vip.in +--- a/heartbeat/gcp-vpc-move-vip.in 2022-06-16 09:45:21.420090788 +0200 ++++ b/heartbeat/gcp-vpc-move-vip.in 2022-06-16 10:11:22.979648603 +0200 +@@ -29,6 +29,7 @@ + from ocf import * + + try: ++ sys.path.insert(0, '/usr/lib/resource-agents/bundled/gcp') + import googleapiclient.discovery + try: + from google.oauth2.service_account import Credentials as ServiceAccountCredentials diff --git a/SOURCES/bz1654862-1-IPsrcaddr-dhcp-warning.patch b/SOURCES/bz1654862-1-IPsrcaddr-dhcp-warning.patch deleted file mode 100644 index 34bad14..0000000 --- a/SOURCES/bz1654862-1-IPsrcaddr-dhcp-warning.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 6d2ed7615614ede093f097189876d0f08553a43e Mon Sep 17 00:00:00 2001 -From: Reid Wahl -Date: Mon, 14 Feb 2022 22:23:39 -0800 -Subject: [PATCH] IPsrcaddr: Add warning about DHCP - -If DHCP is enabled for the interface that serves OCF_RESKEY_ipaddress, -then NetworkManager (and possibly dhclient in systems without NM; -unsure) may later re-add a route that the IPsrcaddr resource replaced. -This may cause the resource to fail or cause other unexpected behavior. - -So far this has been observed with a default route, albeit with an edge -case of a configuration (OCF_RESKEY_ipaddress on a different subnet) -that may not be totally valid. There are likely to be other situations -as well where DHCP can cause conflicts with IPsrcaddr's manual updates -via iproute. The safest option is to use only static configuration for -the involved interface. - -Resolves: RHBZ#1654862 - -Signed-off-by: Reid Wahl ---- - heartbeat/IPsrcaddr | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index ec868409f..fd7b6f68d 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -99,6 +99,12 @@ meta_data() { - - Resource script for IPsrcaddr. It manages the preferred source address - modification. -+ -+Note: DHCP should not be enabled for the interface serving the preferred -+source address. Enabling DHCP may result in unexpected behavior, such as -+the automatic addition of duplicate or conflicting routes. This may -+cause the IPsrcaddr resource to fail, or it may produce undesired -+behavior while the resource continues to run. - - Manages the preferred source address for outgoing IP packets - diff --git a/SOURCES/bz1654862-2-IPsrcaddr-error-message-route-not-found.patch b/SOURCES/bz1654862-2-IPsrcaddr-error-message-route-not-found.patch deleted file mode 100644 index 8a4a6fc..0000000 --- a/SOURCES/bz1654862-2-IPsrcaddr-error-message-route-not-found.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 5a65f66ff803ad7ed15af958cc1efdde4d53dcb7 Mon Sep 17 00:00:00 2001 -From: Reid Wahl -Date: Thu, 17 Feb 2022 03:53:21 -0800 -Subject: [PATCH] IPsrcaddr: Better error message when no matching route found - -If OCF_RESKEY_destination is not explicitly set and `ip route list` -can't find a route matching the specifications, the NETWORK variable -doesn't get set. This causes a certain failure of the start operation, -because there is no PREFIX argument to `ip route replace` (syntax -error). It may also cause unexpected behavior for stop operations (but -not in all cases). During a monitor, this event can only happen if -something has changed outside the cluster's control, and so is cause -for warning there. - -Exit OCF_ERR_ARGS for start, log debug for probe, log warning for all -other ops. - -Resolves: RHBZ#1654862 - -Signed-off-by: Reid Wahl ---- - heartbeat/IPsrcaddr | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index fd7b6f68d..f0216722d 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -549,6 +549,20 @@ rc=$? - INTERFACE=`echo $findif_out | awk '{print $1}'` - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then - NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` -+ -+ if [ -z "$NETWORK" ]; then -+ err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" -+ err_str="$err_str match $ipaddress' failed to find a matching route" -+ -+ if [ "$__OCF_ACTION" = "start" ]; then -+ ocf_exit_reason "$err_str" -+ exit $OCF_ERR_ARGS -+ elif ! ocf_is_probe; then -+ ocf_log warn "$err_str" -+ else -+ ocf_log debug "$err_str" -+ fi -+ fi - else - NETWORK="$OCF_RESKEY_destination" - fi diff --git a/SOURCES/bz1654862-3-IPsrcaddr-fix-indentation.patch b/SOURCES/bz1654862-3-IPsrcaddr-fix-indentation.patch deleted file mode 100644 index 337943d..0000000 --- a/SOURCES/bz1654862-3-IPsrcaddr-fix-indentation.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 0a197f1cd227e768837dff778a0c56fc1085d434 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Mon, 21 Feb 2022 13:54:04 +0100 -Subject: [PATCH] IPsrcaddr: fix indentation in better error message code - ---- - heartbeat/IPsrcaddr | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index f0216722d..c82adc0e9 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -542,27 +542,27 @@ fi - findif_out=`$FINDIF -C` - rc=$? - [ $rc -ne 0 ] && { -- ocf_exit_reason "[$FINDIF -C] failed" -- exit $rc -+ ocf_exit_reason "[$FINDIF -C] failed" -+ exit $rc - } - - INTERFACE=`echo $findif_out | awk '{print $1}'` - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then - NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` - -- if [ -z "$NETWORK" ]; then -- err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" -- err_str="$err_str match $ipaddress' failed to find a matching route" -- -- if [ "$__OCF_ACTION" = "start" ]; then -- ocf_exit_reason "$err_str" -- exit $OCF_ERR_ARGS -- elif ! ocf_is_probe; then -- ocf_log warn "$err_str" -- else -- ocf_log debug "$err_str" -- fi -- fi -+ if [ -z "$NETWORK" ]; then -+ err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" -+ err_str="$err_str match $ipaddress' failed to find a matching route" -+ -+ if [ "$__OCF_ACTION" = "start" ]; then -+ ocf_exit_reason "$err_str" -+ exit $OCF_ERR_ARGS -+ elif ! ocf_is_probe; then -+ ocf_log warn "$err_str" -+ else -+ ocf_log debug "$err_str" -+ fi -+ fi - else - NETWORK="$OCF_RESKEY_destination" - fi diff --git a/SOURCES/bz1654862-4-IPsrcaddr-fixes.patch b/SOURCES/bz1654862-4-IPsrcaddr-fixes.patch deleted file mode 100644 index c099fa5..0000000 --- a/SOURCES/bz1654862-4-IPsrcaddr-fixes.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 50a596bfb977b18902dc62b99145bbd1a087690a Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Tue, 1 Mar 2022 11:06:07 +0100 -Subject: [PATCH] IPsrcaddr: fixes - -- use findif.sh to detect secondary interfaces -- get metric and proto to update the correct route/update it correctly -- match route using interface to fail when trying to update secondary - interfaces without specifying destination (would update default route - before) -- also use PRIMARY_IP/OPTS during stop-action for default routes (to get - back to the exact routes we started with) -- dont fail during stop-action if route doesnt exist -- use [[:blank:]] for WS to follow POSIX standard (suggested by nrwahl) ---- - heartbeat/IPsrcaddr | 35 +++++++++++++++++++---------------- - 1 file changed, 19 insertions(+), 16 deletions(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index c82adc0e9..7dbf65ff5 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -52,6 +52,7 @@ - # Initialization: - : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} - . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs -+. ${OCF_FUNCTIONS_DIR}/findif.sh - - # Defaults - OCF_RESKEY_ipaddress_default="" -@@ -181,19 +182,21 @@ errorexit() { - # - # where the src clause "src Y.Y.Y.Y" may or may not be present - --WS="[`echo -en ' \t'`]" -+WS="[[:blank:]]" - OCTET="[0-9]\{1,3\}" - IPADDR="\($OCTET\.\)\{3\}$OCTET" - SRCCLAUSE="src$WS$WS*\($IPADDR\)" - MATCHROUTE="\(.*${WS}\)\($SRCCLAUSE\)\($WS.*\|$\)" --FINDIF=$HA_BIN/findif -+METRICCLAUSE=".*\(metric$WS[^ ]\+\)" -+PROTOCLAUSE=".*\(proto$WS[^ ]\+\)" -+FINDIF=findif - - # findif needs that to be set - export OCF_RESKEY_ip=$OCF_RESKEY_ipaddress - - srca_read() { - # Capture matching route - doublequotes prevent word splitting... -- ROUTE="`$CMDSHOW 2> /dev/null`" || errorexit "command '$CMDSHOW' failed" -+ ROUTE="`$CMDSHOW dev $INTERFACE 2> /dev/null`" || errorexit "command '$CMDSHOW' failed" - - # ... so we can make sure there is only 1 matching route - [ 1 -eq `echo "$ROUTE" | wc -l` ] || \ -@@ -201,7 +204,7 @@ srca_read() { - - # But there might still be no matching route - [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] && [ -z "$ROUTE" ] && \ -- ! ocf_is_probe && errorexit "no matching route exists" -+ ! ocf_is_probe && [ "$__OCF_ACTION" != stop ] && errorexit "no matching route exists" - - # Sed out the source ip address if it exists - SRCIP=`echo $ROUTE | sed -n "s/$MATCHROUTE/\3/p"` -@@ -232,8 +235,8 @@ srca_start() { - rc=$OCF_SUCCESS - ocf_log info "The ip route has been already set.($NETWORK, $INTERFACE, $ROUTE_WO_SRC)" - else -- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE src $1 || \ -- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE src $1' failed" -+ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC || \ -+ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC' failed" - - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then - $CMDCHANGE $ROUTE_WO_SRC src $1 || \ -@@ -266,14 +269,11 @@ srca_stop() { - - [ $rc = 2 ] && errorexit "The address you specified to stop does not match the preferred source address" - -- OPTS="" -- if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ] ;then -- PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" -- OPTS="proto kernel scope host src $PRIMARY_IP" -- fi -+ PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" -+ OPTS="proto kernel scope link src $PRIMARY_IP" - -- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS || \ -- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS' failed" -+ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC || \ -+ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC' failed" - - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then - $CMDCHANGE $ROUTE_WO_SRC || \ -@@ -539,16 +539,19 @@ if [ $rc -ne $OCF_SUCCESS ]; then - esac - fi - --findif_out=`$FINDIF -C` -+findif_out=`$FINDIF` - rc=$? - [ $rc -ne 0 ] && { -- ocf_exit_reason "[$FINDIF -C] failed" -+ ocf_exit_reason "[$FINDIF] failed" - exit $rc - } - - INTERFACE=`echo $findif_out | awk '{print $1}'` -+LISTROUTE=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress` -+METRIC=`echo $LISTROUTE | sed -n "s/$METRICCLAUSE/\1/p"` -+[ -z "$PROTO" ] && PROTO=`echo $LISTROUTE | sed -n "s/$PROTOCLAUSE/\1/p"` - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then -- NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` -+ NETWORK=`echo $LISTROUTE | grep -m 1 -o '^[^ ]*'` - - if [ -z "$NETWORK" ]; then - err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" diff --git a/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-set-domain-parameters-default.patch b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-set-domain-parameters-default.patch new file mode 100644 index 0000000..8ee70e5 --- /dev/null +++ b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-set-domain-parameters-default.patch @@ -0,0 +1,55 @@ +From bb5cfa172ca58cd8adcedcaca92bde54d0645661 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 14 Jul 2022 10:55:19 +0200 +Subject: [PATCH] openstack-agents: set domain parameter's default to Default + and fix missing parameter name in ocf_exit_reason + +--- + heartbeat/openstack-common.sh | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/heartbeat/openstack-common.sh b/heartbeat/openstack-common.sh +index b6eec09c..14d290bd 100644 +--- a/heartbeat/openstack-common.sh ++++ b/heartbeat/openstack-common.sh +@@ -1,6 +1,10 @@ ++OCF_RESKEY_user_domain_name_default="Default" ++OCF_RESKEY_project_domain_name_default="Default" + OCF_RESKEY_openstackcli_default="/usr/bin/openstack" + OCF_RESKEY_insecure_default="false" + ++: ${OCF_RESKEY_user_domain_name=${OCF_RESKEY_user_domain_name_default}} ++: ${OCF_RESKEY_project_domain_name=${OCF_RESKEY_project_domain_name_default}} + : ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} + : ${OCF_RESKEY_insecure=${OCF_RESKEY_insecure_default}} + +@@ -64,7 +68,7 @@ Keystone Project. + Keystone User Domain Name. + + Keystone User Domain Name +- ++ + + + +@@ -72,7 +76,7 @@ Keystone User Domain Name. + Keystone Project Domain Name. + + Keystone Project Domain Name +- ++ + + + +@@ -133,7 +137,7 @@ get_config() { + exit $OCF_ERR_CONFIGURED + fi + if [ -z "$OCF_RESKEY_project_domain_name" ]; then +- ocf_exit_reason " not set" ++ ocf_exit_reason "project_domain_name not set" + exit $OCF_ERR_CONFIGURED + fi + +-- +2.36.1 + diff --git a/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-warn-when-openstackcli-slow.patch b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-warn-when-openstackcli-slow.patch new file mode 100644 index 0000000..3f8bf0c --- /dev/null +++ b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-warn-when-openstackcli-slow.patch @@ -0,0 +1,282 @@ +From ebea4c3620261c529cad908c0e52064df84b0c61 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 11 Jul 2022 10:28:11 +0200 +Subject: [PATCH] openstack-agents: warn when openstackcli is slow + +--- + heartbeat/openstack-cinder-volume | 19 +++++++++++-------- + heartbeat/openstack-common.sh | 22 ++++++++++++++++++++++ + heartbeat/openstack-floating-ip | 17 ++++++++++------- + heartbeat/openstack-info.in | 20 ++++++++++---------- + heartbeat/openstack-virtual-ip | 20 ++++++++++---------- + 5 files changed, 63 insertions(+), 35 deletions(-) + +diff --git a/heartbeat/openstack-cinder-volume b/heartbeat/openstack-cinder-volume +index 19bf04faf..116442c41 100755 +--- a/heartbeat/openstack-cinder-volume ++++ b/heartbeat/openstack-cinder-volume +@@ -113,11 +113,14 @@ _get_node_id() { + } + + osvol_validate() { ++ local result ++ + check_binary "$OCF_RESKEY_openstackcli" + + get_config + +- if ! $OCF_RESKEY_openstackcli volume list|grep -q $OCF_RESKEY_volume_id ; then ++ result=$(run_openstackcli "volume list") ++ if ! echo "$result" | grep -q $OCF_RESKEY_volume_id; then + ocf_exit_reason "volume-id $OCF_RESKEY_volume_id not found" + return $OCF_ERR_CONFIGURED + fi +@@ -156,17 +159,17 @@ osvol_monitor() { + # Is the volue attached? + # We use the API + # +- result=$($OCF_RESKEY_openstackcli volume show \ ++ result=$(run_openstackcli "volume show \ + --column status \ + --column attachments \ + --format value \ +- $OCF_RESKEY_volume_id) ++ $OCF_RESKEY_volume_id") + +- if echo "$result" | grep -q available ; then ++ 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| ++ 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" +@@ -199,7 +202,7 @@ osvol_stop() { + # + # Detach the volume + # +- if ! $OCF_RESKEY_openstackcli server remove volume $node_id $OCF_RESKEY_volume_id ; then ++ if ! run_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" + return $OCF_ERR_GENERIC + fi +@@ -225,7 +228,7 @@ osvol_start() { + # TODO: make it optional in case multi-attachment is allowed by Cinder + # + if [ ! -z $attached_server_id ] ; then +- if ! $OCF_RESKEY_openstackcli server remove volume $attached_server_id $OCF_RESKEY_volume_id ; then ++ if ! run_openstackcli "server remove volume $attached_server_id $OCF_RESKEY_volume_id"; then + ocf_log error "Couldn't remove volume $OCF_RESKEY_volume_id from instance $attached_server_id" + return $OCF_ERR_GENERIC + fi +@@ -238,7 +241,7 @@ osvol_start() { + # + # Attach the volume + # +- $OCF_RESKEY_openstackcli server add volume $node_id $OCF_RESKEY_volume_id ++ run_openstackcli "server add volume $node_id $OCF_RESKEY_volume_id" + if [ $? != $OCF_SUCCESS ]; then + ocf_log error "Couldn't add volume $OCF_RESKEY_volume_id to instance $node_id" + return $OCF_ERR_GENERIC +diff --git a/heartbeat/openstack-common.sh b/heartbeat/openstack-common.sh +index 4763c90db..b6eec09c2 100644 +--- a/heartbeat/openstack-common.sh ++++ b/heartbeat/openstack-common.sh +@@ -145,3 +145,25 @@ get_config() { + OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-project-domain-name $OCF_RESKEY_project_domain_name" + fi + } ++ ++run_openstackcli() { ++ local cmd="${OCF_RESKEY_openstackcli} $1" ++ local result ++ local rc ++ local start_time=$(date +%s) ++ local end_time ++ local elapsed_time ++ ++ result=$($cmd) ++ rc=$? ++ end_time=$(date +%s) ++ elapsed_time=$(expr $end_time - $start_time) ++ ++ if [ $elapsed_time -gt 20 ]; then ++ ocf_log warn "$cmd took ${elapsed_time}s to complete" ++ fi ++ ++ echo "$result" ++ ++ return $rc ++} +diff --git a/heartbeat/openstack-floating-ip b/heartbeat/openstack-floating-ip +index 6e2895654..7317f19a8 100755 +--- a/heartbeat/openstack-floating-ip ++++ b/heartbeat/openstack-floating-ip +@@ -101,11 +101,14 @@ END + } + + osflip_validate() { ++ local result ++ + check_binary "$OCF_RESKEY_openstackcli" + + get_config + +- if ! $OCF_RESKEY_openstackcli floating ip list|grep -q $OCF_RESKEY_ip_id ; then ++ result=$(run_openstackcli "floating ip list") ++ if ! echo "$result" | grep -q $OCF_RESKEY_ip_id; then + ocf_exit_reason "ip-id $OCF_RESKEY_ip_id not found" + return $OCF_ERR_CONFIGURED + fi +@@ -132,14 +135,14 @@ osflip_monitor() { + | awk '{gsub("[^ ]*:", "");print}') + + # Is the IP active and attached? +- result=$($OCF_RESKEY_openstackcli floating ip show \ ++ result=$(run_openstackcli "floating ip show \ + --column port_id --column floating_ip_address \ + --format yaml \ +- $OCF_RESKEY_ip_id) ++ $OCF_RESKEY_ip_id") + + for port in $node_port_ids ; do +- if echo $result | grep -q $port ; then +- floating_ip=$(echo $result | awk '/floating_ip_address/ {print $2}') ++ if echo "$result" | grep -q $port ; then ++ floating_ip=$(echo "$result" | awk '/floating_ip_address/ {print $2}') + ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -S status -n openstack_floating_ip -v $floating_ip + + return $OCF_SUCCESS +@@ -160,7 +163,7 @@ osflip_stop() { + return $OCF_SUCCESS + fi + +- if ! $OCF_RESKEY_openstackcli floating ip unset --port $OCF_RESKEY_ip_id ; then ++ if ! run_openstackcli "floating ip unset --port $OCF_RESKEY_ip_id"; then + return $OCF_ERR_GENERIC + fi + +@@ -194,7 +197,7 @@ osflip_start() { + + ocf_log info "Moving IP address $OCF_RESKEY_ip_id to port ID $node_port_id" + +- $OCF_RESKEY_openstackcli floating ip set --port $node_port_id $OCF_RESKEY_ip_id ++ run_openstackcli "floating ip set --port $node_port_id $OCF_RESKEY_ip_id" + if [ $? != $OCF_SUCCESS ]; then + ocf_log error "$OCF_RESKEY_ip_id Cannot be set to port $node_port_id" + return $OCF_ERR_GENERIC +diff --git a/heartbeat/openstack-info.in b/heartbeat/openstack-info.in +index f3a59fc7a..6502f1df1 100755 +--- a/heartbeat/openstack-info.in ++++ b/heartbeat/openstack-info.in +@@ -119,9 +119,7 @@ END + ####################################################################### + + OSInfoStats() { +- local result + local value +- local node + local node_id + + get_config +@@ -141,31 +139,33 @@ OSInfoStats() { + ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_id -v "$node_id" + + # Nova data: flavor +- value=$($OCF_RESKEY_openstackcli server show \ ++ value=$(run_openstackcli "server show \ + --format value \ + --column flavor \ +- $node_id) ++ $node_id") + + ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_flavor -v "$value" + + # Nova data: availability zone +- value=$($OCF_RESKEY_openstackcli server show \ ++ value=$(run_openstackcli "server show \ + --format value \ + --column OS-EXT-AZ:availability_zone \ +- $node_id) ++ $node_id") + + ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_az -v "$value" + + # Network data: ports + value="" +- for port_id in $($OCF_RESKEY_openstackcli port list \ ++ for port_id in $(run_openstackcli "port list \ + --format value \ + --column id \ +- --server $node_id); do +- subnet_id=$($OCF_RESKEY_openstackcli port show \ ++ --server $node_id"); do ++ subnet_result=$(run_openstackcli "port show \ + --format json \ + --column fixed_ips \ +- ${port_id} | grep -P '\"subnet_id\": \".*\",$' | ++ ${port_id}") ++ subnet_id=$(echo "$subnet_result" | ++ grep -P '\"subnet_id\": \".*\",$' | + grep -P -o '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}') + value="${value}${subnet_id}:${port_id}," + done +diff --git a/heartbeat/openstack-virtual-ip b/heartbeat/openstack-virtual-ip +index c654d980a..361357d55 100755 +--- a/heartbeat/openstack-virtual-ip ++++ b/heartbeat/openstack-virtual-ip +@@ -132,11 +132,11 @@ osvip_monitor() { + + node_port_id=$(osvip_port_id) + +- result=$($OCF_RESKEY_openstackcli port show \ ++ result=$(run_openstackcli "port show \ + --format value \ + --column allowed_address_pairs \ +- ${node_port_id}) +- if echo $result | grep -q "$OCF_RESKEY_ip"; then ++ ${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 +@@ -158,20 +158,20 @@ osvip_stop() { + return $OCF_SUCCESS + fi + +- mac_address=$($OCF_RESKEY_openstackcli port show \ ++ mac_address=$(run_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}$" ++ $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 \ ++ if ! run_openstackcli "port unset \ + --allowed-address \ + ip-address=$OCF_RESKEY_ip,mac-address=${mac_address} \ +- $node_port_id; then ++ $node_port_id"; then + return $OCF_ERR_GENERIC + fi + +@@ -196,9 +196,9 @@ osvip_start() { + + ocf_log info "Moving IP address $OCF_RESKEY_ip to port ID $node_port_id" + +- $OCF_RESKEY_openstackcli port set \ ++ run_openstackcli "port set \ + --allowed-address ip-address=$OCF_RESKEY_ip \ +- $node_port_id ++ $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 diff --git a/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-update-openstack-agents.patch b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-update-openstack-agents.patch new file mode 100644 index 0000000..7b1a6e8 --- /dev/null +++ b/SOURCES/bz1908146-bz1908147-bz1908148-bz1949114-update-openstack-agents.patch @@ -0,0 +1,770 @@ +diff --color -uNr a/heartbeat/Makefile.am b/heartbeat/Makefile.am +--- a/heartbeat/Makefile.am 2022-03-15 16:14:29.355209012 +0100 ++++ b/heartbeat/Makefile.am 2022-03-15 16:18:35.917048467 +0100 +@@ -217,6 +217,7 @@ + lvm-clvm.sh \ + lvm-plain.sh \ + lvm-tag.sh \ ++ openstack-common.sh \ + ora-common.sh \ + mysql-common.sh \ + nfsserver-redhat.sh \ +diff --color -uNr a/heartbeat/openstack-cinder-volume b/heartbeat/openstack-cinder-volume +--- a/heartbeat/openstack-cinder-volume 2022-03-15 16:14:29.370209063 +0100 ++++ b/heartbeat/openstack-cinder-volume 2022-03-15 16:17:36.231840008 +0100 +@@ -34,11 +34,11 @@ + : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} + . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + ++. ${OCF_FUNCTIONS_DIR}/openstack-common.sh ++ + # Defaults +-OCF_RESKEY_openstackcli_default="/usr/bin/openstack" + OCF_RESKEY_volume_local_check_default="true" + +-: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} + : ${OCF_RESKEY_volume_local_check=${OCF_RESKEY_volume_local_check_default}} + + ####################################################################### +@@ -68,14 +68,11 @@ + Attach a cinder volume + + +- +- +-Path to command line tools for openstack. +- +-Path to Openstack CLI tool +- +- ++END + ++common_meta_data ++ ++cat < + + This option allows the cluster to monitor the cinder volume presence without +@@ -85,28 +82,19 @@ + + + +- +- +-Valid Openstack credentials as openrc file from api_access/openrc. +- +-openrc file +- +- +- + + +-Cinder volume identifier to use to attach the bloc storage. ++Cinder volume identifier to use to attach the block storage. + + Volume ID + + +- + + + + + +- ++ + + + +@@ -127,17 +115,7 @@ + osvol_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 ++ get_config + + if ! $OCF_RESKEY_openstackcli volume list|grep -q $OCF_RESKEY_volume_id ; then + ocf_exit_reason "volume-id $OCF_RESKEY_volume_id not found" +diff --color -uNr a/heartbeat/openstack-common.sh b/heartbeat/openstack-common.sh +--- a/heartbeat/openstack-common.sh 1970-01-01 01:00:00.000000000 +0100 ++++ b/heartbeat/openstack-common.sh 2022-03-15 16:17:36.232840011 +0100 +@@ -0,0 +1,147 @@ ++OCF_RESKEY_openstackcli_default="/usr/bin/openstack" ++OCF_RESKEY_insecure_default="false" ++ ++: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} ++: ${OCF_RESKEY_insecure=${OCF_RESKEY_insecure_default}} ++ ++if ocf_is_true "${OCF_RESKEY_insecure}"; then ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --insecure" ++fi ++ ++common_meta_data() { ++ cat < ++ ++Openstack cloud (from ~/.config/openstack/clouds.yaml or /etc/openstack/clouds.yaml). ++ ++Cloud from clouds.yaml ++ ++ ++ ++ ++ ++Openstack credentials as openrc file from api_access/openrc. ++ ++openrc file ++ ++ ++ ++ ++ ++Keystone Auth URL ++ ++Keystone Auth URL ++ ++ ++ ++ ++ ++Username. ++ ++Username ++ ++ ++ ++ ++ ++Password. ++ ++Password ++ ++ ++ ++ ++ ++Keystone Project. ++ ++Keystone Project ++ ++ ++ ++ ++ ++Keystone User Domain Name. ++ ++Keystone User Domain Name ++ ++ ++ ++ ++ ++Keystone Project Domain Name. ++ ++Keystone Project Domain Name ++ ++ ++ ++ ++ ++Path to command line tools for openstack. ++ ++Path to Openstack CLI tool ++ ++ ++ ++ ++ ++Allow insecure connections ++ ++Allow insecure connections ++ ++ ++END ++} ++ ++get_config() { ++ if [ -n "$OCF_RESKEY_cloud" ]; then ++ TILDE=$(echo ~) ++ clouds_yaml="$TILDE/.config/openstack/clouds.yaml" ++ if [ ! -f "$clouds_yaml" ]; then ++ clouds_yaml="/etc/openstack/clouds.yaml" ++ fi ++ if [ ! -f "$clouds_yaml" ]; then ++ ocf_exit_reason "~/.config/openstack/clouds.yaml and /etc/openstack/clouds.yaml does not exist" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-cloud $OCF_RESKEY_cloud" ++ elif [ -n "$OCF_RESKEY_openrc" ]; then ++ if [ ! -f "$OCF_RESKEY_openrc" ]; then ++ ocf_exit_reason "$OCF_RESKEY_openrc does not exist" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ . $OCF_RESKEY_openrc ++ else ++ if [ -z "$OCF_RESKEY_auth_url" ]; then ++ ocf_exit_reason "auth_url not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ if [ -z "$OCF_RESKEY_username" ]; then ++ ocf_exit_reason "username not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ if [ -z "$OCF_RESKEY_password" ]; then ++ ocf_exit_reason "password not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ if [ -z "$OCF_RESKEY_project_name" ]; then ++ ocf_exit_reason "project_name not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ if [ -z "$OCF_RESKEY_user_domain_name" ]; then ++ ocf_exit_reason "user_domain_name not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ if [ -z "$OCF_RESKEY_project_domain_name" ]; then ++ ocf_exit_reason " not set" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-auth-url $OCF_RESKEY_auth_url" ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-username $OCF_RESKEY_username" ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-password $OCF_RESKEY_password" ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-project-name $OCF_RESKEY_project_name" ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-user-domain-name $OCF_RESKEY_user_domain_name" ++ OCF_RESKEY_openstackcli="${OCF_RESKEY_openstackcli} --os-project-domain-name $OCF_RESKEY_project_domain_name" ++ fi ++} +diff --color -uNr a/heartbeat/openstack-floating-ip b/heartbeat/openstack-floating-ip +--- a/heartbeat/openstack-floating-ip 2022-03-15 16:14:29.370209063 +0100 ++++ b/heartbeat/openstack-floating-ip 2022-03-15 16:17:36.233840014 +0100 +@@ -34,10 +34,9 @@ + : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} + . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +-# Defaults +-OCF_RESKEY_openstackcli_default="/usr/bin/openstack" ++. ${OCF_FUNCTIONS_DIR}/openstack-common.sh + +-: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} ++# Defaults + + ####################################################################### + +@@ -67,22 +66,11 @@ + Move a floating IP + + +- +- +-Path to command line tools for openstack. +- +-Path to Openstack CLI tool +- +- ++END + +- +- +-Valid Openstack credentials as openrc file from api_access/openrc. +- +-openrc file +- +- ++common_meta_data + ++cat < + + Floating IP Identifier. +@@ -104,7 +92,7 @@ + + + +- ++ + + + +@@ -115,17 +103,7 @@ + osflip_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 ++ get_config + + if ! $OCF_RESKEY_openstackcli floating ip list|grep -q $OCF_RESKEY_ip_id ; then + ocf_exit_reason "ip-id $OCF_RESKEY_ip_id not found" +diff --color -uNr a/heartbeat/openstack-info b/heartbeat/openstack-info +--- a/heartbeat/openstack-info 1970-01-01 01:00:00.000000000 +0100 ++++ b/heartbeat/openstack-info 2022-03-15 16:17:36.234840018 +0100 +@@ -0,0 +1,270 @@ ++#!/bin/sh ++# ++# ++# OCF resource agent to set attributes from Openstack instance details. ++# It records (in the CIB) various attributes of a node ++# ++# Copyright (c) 2018 Mathieu Grzybek ++# 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 ++ ++. ${OCF_FUNCTIONS_DIR}/openstack-common.sh ++ ++# Defaults ++OCF_RESKEY_pidfile_default="$HA_RSCTMP/OSInfo-${OCF_RESOURCE_HOSTNAME}" ++OCF_RESKEY_delay_default="0" ++OCF_RESKEY_clone_default="0" ++OCF_RESKEY_curlcli_default="/usr/bin/curl" ++OCF_RESKEY_pythoncli_default="/usr/bin/python" ++ ++: ${OCF_RESKEY_curlcli=${OCF_RESKEY_curlcli_default}} ++: ${OCF_RESKEY_pythoncli=${OCF_RESKEY_pythoncli_default}} ++: ${OCF_RESKEY_pidfile=${OCF_RESKEY_pidfile_default}} ++: ${OCF_RESKEY_delay=${OCF_RESKEY_delay_default}} ++: ${OCF_RESKEY_clone=${OCF_RESKEY_clone_default}} ++ ++####################################################################### ++ ++meta_data() { ++ cat < ++ ++ ++1.0 ++ ++ ++OCF resource agent to set attributes from Openstack instance details. ++It records (in the CIB) various attributes of a node. ++Sample output: ++ openstack_az : nova ++ openstack_flavor : c1.small ++ openstack_id : 60ac4343-5828-49b1-8aac-7c69b1417f31 ++ openstack_ports : 7960d889-9750-4160-bf41-c69a41ad72d9:96530d18-57a3-4718-af32-30f2a74c22a2,b0e55a06-bd75-468d-8baa-22cfeb65799f:a55ae917-8016-4b1e-8ffa-04311b9dc7d6 ++ ++The layout of openstack_ports is a comma-separated list of tuples "subnet_id:port_id". ++ ++Records various node attributes in the CIB ++ ++ ++END ++ ++common_meta_data ++ ++ cat < ++PID file ++PID file ++ ++ ++ ++ ++Interval to allow values to stabilize ++Dampening Delay ++ ++ ++ ++ ++ ++Path to command line cURL binary. ++ ++Path to cURL binary ++ ++ ++ ++ ++ ++Path to command line Python interpreter. ++ ++Path to Python interpreter ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++END ++} ++ ++####################################################################### ++ ++OSInfoStats() { ++ local result ++ local value ++ local node ++ local node_id ++ ++ get_config ++ ++ # Nova data: server ID ++ node_id=$($OCF_RESKEY_curlcli \ ++ -s http://169.254.169.254/openstack/latest/meta_data.json | ++ $OCF_RESKEY_pythoncli -m json.tool | ++ grep -P '\"uuid\": \".*\",$' | ++ grep -P -o '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}') ++ ++ if [ $? -ne 0 ] ; then ++ ocf_exit_reason "Cannot find server ID" ++ exit $OCF_ERR_GENERIC ++ fi ++ ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_id -v "$node_id" ++ ++ # Nova data: flavor ++ value=$($OCF_RESKEY_openstackcli server show \ ++ --format value \ ++ --column flavor \ ++ $node_id) ++ ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_flavor -v "$value" ++ ++ # Nova data: availability zone ++ value=$($OCF_RESKEY_openstackcli server show \ ++ --format value \ ++ --column OS-EXT-AZ:availability_zone \ ++ $node_id) ++ ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_az -v "$value" ++ ++ # Network data: ports ++ value="" ++ for port_id in $($OCF_RESKEY_openstackcli port list \ ++ --format value \ ++ --column id \ ++ --server $node_id); do ++ subnet_id=$($OCF_RESKEY_openstackcli port show \ ++ --format json \ ++ --column fixed_ips \ ++ ${port_id} | grep -P '\"subnet_id\": \".*\",$' | ++ grep -P -o '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}') ++ value+="${subnet_id}:${port_id}," ++ done ++ value=$(echo ${value} | sed -e 's/,$//g') ++ ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_ports -v "$value" ++ ++ if [ ! -z "$OS_REGION_NAME" ] ; then ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_region -v "$OS_REGION_NAME" ++ fi ++ ++ if [ ! -z "$OS_TENANT_ID" ] ; then ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_tenant_id -v "$OS_TENANT_ID" ++ ++ if [ ! -z "$OS_TENANT_NAME" ] ; then ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_tenant_name -v "$OS_TENANT_NAME" ++ fi ++ else ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_project_id -v "$OS_PROJECT_ID" ++ ++ if [ ! -z "$OS_PROJECT_NAME" ] ; then ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_project_name -v "$OS_PROJECT_NAME" ++ fi ++ fi ++ ++} ++ ++OSInfo_usage() { ++ cat < $OCF_RESKEY_pidfile ++ OSInfoStats ++ exit $OCF_SUCCESS ++} ++ ++OSInfo_stop() { ++ rm -f $OCF_RESKEY_pidfile ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_id ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_flavor ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_az ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_ports ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_region ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_tenant_id ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_tenant_name ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_project_id ++ ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -D -n openstack_project_name ++ exit $OCF_SUCCESS ++} ++ ++OSInfo_monitor() { ++ if [ -f "$OCF_RESKEY_pidfile" ] ; then ++ OSInfoStats ++ exit $OCF_RUNNING ++ fi ++ exit $OCF_NOT_RUNNING ++} ++ ++OSInfo_validate() { ++ check_binary "$OCF_RESKEY_curlcli" ++ check_binary "$OCF_RESKEY_openstackcli" ++ check_binary "$OCF_RESKEY_pythoncli" ++ ++ return $OCF_SUCCESS ++} ++ ++if [ $# -ne 1 ]; then ++ OSInfo_usage ++ exit $OCF_ERR_ARGS ++fi ++ ++if [ x != x${OCF_RESKEY_delay} ]; then ++ OCF_RESKEY_delay="-d ${OCF_RESKEY_delay}" ++fi ++ ++case $__OCF_ACTION in ++meta-data) meta_data ++ exit $OCF_SUCCESS ++ ;; ++start) OSInfo_validate || exit $? ++ OSInfo_start ++ ;; ++stop) OSInfo_stop ++ ;; ++monitor) OSInfo_monitor ++ ;; ++validate-all) OSInfo_validate ++ ;; ++usage|help) OSInfo_usage ++ exit $OCF_SUCCESS ++ ;; ++*) OSInfo_usage ++ exit $OCF_ERR_UNIMPLEMENTED ++ ;; ++esac ++ ++exit $? +diff --color -uNr a/heartbeat/openstack-info.in b/heartbeat/openstack-info.in +--- a/heartbeat/openstack-info.in 2022-03-15 16:14:29.370209063 +0100 ++++ b/heartbeat/openstack-info.in 2022-03-15 16:17:36.234840018 +0100 +@@ -32,16 +32,16 @@ + : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} + . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + ++. ${OCF_FUNCTIONS_DIR}/openstack-common.sh ++ + # Defaults + OCF_RESKEY_pidfile_default="$HA_RSCTMP/OSInfo-${OCF_RESOURCE_HOSTNAME}" + OCF_RESKEY_delay_default="0" + OCF_RESKEY_clone_default="0" + OCF_RESKEY_curlcli_default="/usr/bin/curl" +-OCF_RESKEY_openstackcli_default="/usr/bin/openstack" + OCF_RESKEY_pythoncli_default="@PYTHON@" + + : ${OCF_RESKEY_curlcli=${OCF_RESKEY_curlcli_default}} +-: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} + : ${OCF_RESKEY_pythoncli=${OCF_RESKEY_pythoncli_default}} + : ${OCF_RESKEY_pidfile=${OCF_RESKEY_pidfile_default}} + : ${OCF_RESKEY_delay=${OCF_RESKEY_delay_default}} +@@ -70,25 +70,23 @@ + Records various node attributes in the CIB + + ++END ++ ++common_meta_data ++ ++ cat < + PID file + PID file + + ++ + + Interval to allow values to stabilize + Dampening Delay + + + +- +- +-Valid Openstack credentials as openrc file from api_access/openrc. +- +-openrc file +- +- +- + + + Path to command line cURL binary. +@@ -97,14 +95,6 @@ + + + +- +- +-Path to command line tools for openstack. +- +-Path to Openstack CLI tool +- +- +- + + + Path to command line Python interpreter. +@@ -116,9 +106,9 @@ + + + +- +- +- ++ ++ ++ + + + +@@ -134,7 +124,7 @@ + local node + local node_id + +- . $OCF_RESKEY_openrc ++ get_config + + # Nova data: server ID + node_id=$($OCF_RESKEY_curlcli \ +@@ -244,16 +234,6 @@ + check_binary "$OCF_RESKEY_openstackcli" + check_binary "$OCF_RESKEY_pythoncli" + +- 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 +- + return $OCF_SUCCESS + } + +diff --color -uNr a/heartbeat/openstack-virtual-ip b/heartbeat/openstack-virtual-ip +--- a/heartbeat/openstack-virtual-ip 2022-03-15 16:14:29.370209063 +0100 ++++ b/heartbeat/openstack-virtual-ip 2022-03-15 16:17:36.235840021 +0100 +@@ -34,10 +34,9 @@ + : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} + . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +-# Defaults +-OCF_RESKEY_openstackcli_default="/usr/bin/openstack" ++. ${OCF_FUNCTIONS_DIR}/openstack-common.sh + +-: ${OCF_RESKEY_openstackcli=${OCF_RESKEY_openstackcli_default}} ++# Defaults + + ####################################################################### + +@@ -68,22 +67,11 @@ + Move a virtual IP + + +- +- +-Path to command line tools for openstack. +- +-Path to Openstack CLI tool +- +- ++END + +- +- +-Valid Openstack credentials as openrc file from api_access/openrc. +- +-openrc file +- +- ++common_meta_data + ++cat < + + Virtual IP Address. +@@ -105,7 +93,7 @@ + + + +- ++ + + + +@@ -128,17 +116,7 @@ + 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 ++ get_config + + ${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports -N $(crm_node -n) > /dev/null 2>&1 + if [ $? -ne 0 ] ; then diff --git a/SOURCES/bz1908146-bz1908147-bz1949114-openstack-agents-fixes.patch b/SOURCES/bz1908146-bz1908147-bz1949114-openstack-agents-fixes.patch new file mode 100644 index 0000000..451fba7 --- /dev/null +++ b/SOURCES/bz1908146-bz1908147-bz1949114-openstack-agents-fixes.patch @@ -0,0 +1,72 @@ +From 64f434014bc198055478a139532c7cc133967c5d Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Fri, 8 Jul 2022 15:41:34 +0200 +Subject: [PATCH] openstack-agents: fixes + +- openstack-cinder-volume: dont do volume_local_check during start/stop-action +- openstack-floating-ip/openstack-virtual-ip: dont fail in validate() + during probe-calls +- openstack-floating-ip: fix awk only catching last id for node_port_ids +--- + heartbeat/openstack-cinder-volume | 2 +- + heartbeat/openstack-floating-ip | 4 ++-- + heartbeat/openstack-virtual-ip | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/heartbeat/openstack-cinder-volume b/heartbeat/openstack-cinder-volume +index cc12e58ae..19bf04faf 100755 +--- a/heartbeat/openstack-cinder-volume ++++ b/heartbeat/openstack-cinder-volume +@@ -138,7 +138,7 @@ osvol_monitor() { + + node_id=$(_get_node_id) + +- if ocf_is_true $OCF_RESKEY_volume_local_check ; then ++ if [ "$__OCF_ACTION" = "monitor" ] && ocf_is_true $OCF_RESKEY_volume_local_check ; then + # + # Is the volue attached? + # We check the local devices +diff --git a/heartbeat/openstack-floating-ip b/heartbeat/openstack-floating-ip +index 8c135cc24..6e2895654 100755 +--- a/heartbeat/openstack-floating-ip ++++ b/heartbeat/openstack-floating-ip +@@ -111,7 +111,7 @@ osflip_validate() { + fi + + ${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports -N $(crm_node -n) > /dev/null 2>&1 +- if [ $? -ne 0 ] ; then ++ if [ $? -ne 0 ] && ! ocf_is_probe; then + ocf_log warn "attr_updater failed to get openstack_ports attribute of node $OCF_RESOURCE_INSTANCE" + return $OCF_ERR_GENERIC + fi +@@ -129,7 +129,7 @@ osflip_monitor() { + 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}') ++ | awk '{gsub("[^ ]*:", "");print}') + + # Is the IP active and attached? + result=$($OCF_RESKEY_openstackcli floating ip show \ +diff --git a/heartbeat/openstack-virtual-ip b/heartbeat/openstack-virtual-ip +index a1084c420..c654d980a 100755 +--- a/heartbeat/openstack-virtual-ip ++++ b/heartbeat/openstack-virtual-ip +@@ -119,7 +119,7 @@ osvip_validate() { + get_config + + ${HA_SBIN_DIR}/attrd_updater --query -n openstack_ports -N $(crm_node -n) > /dev/null 2>&1 +- if [ $? -ne 0 ] ; then ++ if [ $? -ne 0 ] && ! ocf_is_probe; then + ocf_log warn "attr_updater failed to get openstack_ports attribute of node $OCF_RESOURCE_INSTANCE" + return $OCF_ERR_GENERIC + fi +@@ -136,7 +136,7 @@ osvip_monitor() { + --format value \ + --column allowed_address_pairs \ + ${node_port_id}) +- if echo $result | grep -q $OCF_RESKEY_ip ; then ++ 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 diff --git a/SOURCES/bz1908148-openstack-info-fix-bashism.patch b/SOURCES/bz1908148-openstack-info-fix-bashism.patch new file mode 100644 index 0000000..4f78d54 --- /dev/null +++ b/SOURCES/bz1908148-openstack-info-fix-bashism.patch @@ -0,0 +1,26 @@ +From 8b1d3257e5176a2f50a843a21888c4b4f51f370b Mon Sep 17 00:00:00 2001 +From: Valentin Vidic +Date: Sun, 3 Apr 2022 20:31:50 +0200 +Subject: [PATCH] openstack-info: fix bashism + +Also simplify striping of trailing comma. +--- + heartbeat/openstack-info.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heartbeat/openstack-info.in b/heartbeat/openstack-info.in +index f6dc1ee4d..f3a59fc7a 100755 +--- a/heartbeat/openstack-info.in ++++ b/heartbeat/openstack-info.in +@@ -167,9 +167,9 @@ OSInfoStats() { + --column fixed_ips \ + ${port_id} | grep -P '\"subnet_id\": \".*\",$' | + grep -P -o '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}') +- value+="${subnet_id}:${port_id}," ++ value="${value}${subnet_id}:${port_id}," + done +- value=$(echo ${value} | sed -e 's/,$//g') ++ value=${value%,} + + ${HA_SBIN_DIR}/attrd_updater ${OCF_RESKEY_delay} -n openstack_ports -v "$value" + diff --git a/SOURCES/bz2049414-Filesystem-1-fix-uuid-label-device-whitespace.patch b/SOURCES/bz2049414-Filesystem-1-fix-uuid-label-device-whitespace.patch new file mode 100644 index 0000000..09960f0 --- /dev/null +++ b/SOURCES/bz2049414-Filesystem-1-fix-uuid-label-device-whitespace.patch @@ -0,0 +1,44 @@ +From 26de0ad2f0f975166fe79ef72ab08e2c03519eea Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 28 Mar 2022 13:25:35 +0200 +Subject: [PATCH] Filesystem: fix logic for UUID/label devices with space + between parameter and UUID/label + +--- + heartbeat/Filesystem | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index 1a90d6a42..72a1b8623 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -596,11 +596,11 @@ Filesystem_start() + flushbufs "$DEVICE" + # Mount the filesystem. + case "$FSTYPE" in +- none) $MOUNT $options "$DEVICE" "$MOUNTPOINT" && ++ none) $MOUNT $options $device_opt "$DEVICE" "$MOUNTPOINT" && + bind_mount + ;; +- "") $MOUNT $options "$DEVICE" "$MOUNTPOINT" ;; +- *) $MOUNT -t "$FSTYPE" $options "$DEVICE" "$MOUNTPOINT" ;; ++ "") $MOUNT $options $device_opt "$DEVICE" "$MOUNTPOINT" ;; ++ *) $MOUNT -t "$FSTYPE" $options $device_opt "$DEVICE" "$MOUNTPOINT" ;; + esac + + if [ $? -ne 0 ]; then +@@ -902,7 +902,13 @@ set_blockdevice_var() { + fi + + case "$DEVICE" in +- -*) # Oh... An option to mount instead... Typically -U or -L ++ --*) # Typically --uuid or --label ++ device_opt=$(echo $DEVICE | sed -E "s/([[:blank:]]|=).*//") ++ DEVICE=$(echo $DEVICE | sed -E "s/$device_opt([[:blank:]]*|=)//") ++ ;; ++ -*) # Oh... An option to mount instead... Typically -U or -L ++ device_opt=$(echo $DEVICE | cut -c1-2) ++ DEVICE=$(echo $DEVICE | sed "s/$device_opt[[:blank:]]*//") + ;; + /dev/null) # Special case for BSC + blockdevice=yes diff --git a/SOURCES/bz2049414-Filesystem-2-improve-uuid-label-device-logic.patch b/SOURCES/bz2049414-Filesystem-2-improve-uuid-label-device-logic.patch new file mode 100644 index 0000000..844772a --- /dev/null +++ b/SOURCES/bz2049414-Filesystem-2-improve-uuid-label-device-logic.patch @@ -0,0 +1,38 @@ +From d9b46474fc19d9c57e2cfb752d60319017da8410 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Wed, 6 Apr 2022 14:14:19 +0200 +Subject: [PATCH] Filesystem: improve logic for UUID/label and add note that + /dev/disk/by-{uuid,label}/ are preferred on Linux + +--- + heartbeat/Filesystem | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index 72a1b8623..44270ad98 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -163,6 +163,8 @@ directory where the status file is to be placed. + + + The name of block device for the filesystem, or -U, -L options for mount, or NFS mount specification. ++ ++NOTE: On Linux /dev/disk/by-{uuid,label}/ are preferred to -U/-L. + + block device + +@@ -902,11 +904,11 @@ set_blockdevice_var() { + fi + + case "$DEVICE" in +- --*) # Typically --uuid or --label +- device_opt=$(echo $DEVICE | sed -E "s/([[:blank:]]|=).*//") ++ --uuid=*|--uuid\ *|--label=*|--label\ *) ++ device_opt=$(echo $DEVICE | sed "s/\([[:blank:]]\|=\).*//") + DEVICE=$(echo $DEVICE | sed -E "s/$device_opt([[:blank:]]*|=)//") + ;; +- -*) # Oh... An option to mount instead... Typically -U or -L ++ -U*|-L*) # short versions of --uuid/--label + device_opt=$(echo $DEVICE | cut -c1-2) + DEVICE=$(echo $DEVICE | sed "s/$device_opt[[:blank:]]*//") + ;; diff --git a/SOURCES/bz2064342-1-IPsrcaddr-dhcp-warning.patch b/SOURCES/bz2064342-1-IPsrcaddr-dhcp-warning.patch new file mode 100644 index 0000000..34bad14 --- /dev/null +++ b/SOURCES/bz2064342-1-IPsrcaddr-dhcp-warning.patch @@ -0,0 +1,41 @@ +From 6d2ed7615614ede093f097189876d0f08553a43e Mon Sep 17 00:00:00 2001 +From: Reid Wahl +Date: Mon, 14 Feb 2022 22:23:39 -0800 +Subject: [PATCH] IPsrcaddr: Add warning about DHCP + +If DHCP is enabled for the interface that serves OCF_RESKEY_ipaddress, +then NetworkManager (and possibly dhclient in systems without NM; +unsure) may later re-add a route that the IPsrcaddr resource replaced. +This may cause the resource to fail or cause other unexpected behavior. + +So far this has been observed with a default route, albeit with an edge +case of a configuration (OCF_RESKEY_ipaddress on a different subnet) +that may not be totally valid. There are likely to be other situations +as well where DHCP can cause conflicts with IPsrcaddr's manual updates +via iproute. The safest option is to use only static configuration for +the involved interface. + +Resolves: RHBZ#1654862 + +Signed-off-by: Reid Wahl +--- + heartbeat/IPsrcaddr | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index ec868409f..fd7b6f68d 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -99,6 +99,12 @@ meta_data() { + + Resource script for IPsrcaddr. It manages the preferred source address + modification. ++ ++Note: DHCP should not be enabled for the interface serving the preferred ++source address. Enabling DHCP may result in unexpected behavior, such as ++the automatic addition of duplicate or conflicting routes. This may ++cause the IPsrcaddr resource to fail, or it may produce undesired ++behavior while the resource continues to run. + + Manages the preferred source address for outgoing IP packets + diff --git a/SOURCES/bz2064342-2-IPsrcaddr-error-message-route-not-found.patch b/SOURCES/bz2064342-2-IPsrcaddr-error-message-route-not-found.patch new file mode 100644 index 0000000..8a4a6fc --- /dev/null +++ b/SOURCES/bz2064342-2-IPsrcaddr-error-message-route-not-found.patch @@ -0,0 +1,49 @@ +From 5a65f66ff803ad7ed15af958cc1efdde4d53dcb7 Mon Sep 17 00:00:00 2001 +From: Reid Wahl +Date: Thu, 17 Feb 2022 03:53:21 -0800 +Subject: [PATCH] IPsrcaddr: Better error message when no matching route found + +If OCF_RESKEY_destination is not explicitly set and `ip route list` +can't find a route matching the specifications, the NETWORK variable +doesn't get set. This causes a certain failure of the start operation, +because there is no PREFIX argument to `ip route replace` (syntax +error). It may also cause unexpected behavior for stop operations (but +not in all cases). During a monitor, this event can only happen if +something has changed outside the cluster's control, and so is cause +for warning there. + +Exit OCF_ERR_ARGS for start, log debug for probe, log warning for all +other ops. + +Resolves: RHBZ#1654862 + +Signed-off-by: Reid Wahl +--- + heartbeat/IPsrcaddr | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index fd7b6f68d..f0216722d 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -549,6 +549,20 @@ rc=$? + INTERFACE=`echo $findif_out | awk '{print $1}'` + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then + NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` ++ ++ if [ -z "$NETWORK" ]; then ++ err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" ++ err_str="$err_str match $ipaddress' failed to find a matching route" ++ ++ if [ "$__OCF_ACTION" = "start" ]; then ++ ocf_exit_reason "$err_str" ++ exit $OCF_ERR_ARGS ++ elif ! ocf_is_probe; then ++ ocf_log warn "$err_str" ++ else ++ ocf_log debug "$err_str" ++ fi ++ fi + else + NETWORK="$OCF_RESKEY_destination" + fi diff --git a/SOURCES/bz2064342-3-IPsrcaddr-fix-indentation.patch b/SOURCES/bz2064342-3-IPsrcaddr-fix-indentation.patch new file mode 100644 index 0000000..337943d --- /dev/null +++ b/SOURCES/bz2064342-3-IPsrcaddr-fix-indentation.patch @@ -0,0 +1,56 @@ +From 0a197f1cd227e768837dff778a0c56fc1085d434 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 21 Feb 2022 13:54:04 +0100 +Subject: [PATCH] IPsrcaddr: fix indentation in better error message code + +--- + heartbeat/IPsrcaddr | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index f0216722d..c82adc0e9 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -542,27 +542,27 @@ fi + findif_out=`$FINDIF -C` + rc=$? + [ $rc -ne 0 ] && { +- ocf_exit_reason "[$FINDIF -C] failed" +- exit $rc ++ ocf_exit_reason "[$FINDIF -C] failed" ++ exit $rc + } + + INTERFACE=`echo $findif_out | awk '{print $1}'` + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then + NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` + +- if [ -z "$NETWORK" ]; then +- err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" +- err_str="$err_str match $ipaddress' failed to find a matching route" +- +- if [ "$__OCF_ACTION" = "start" ]; then +- ocf_exit_reason "$err_str" +- exit $OCF_ERR_ARGS +- elif ! ocf_is_probe; then +- ocf_log warn "$err_str" +- else +- ocf_log debug "$err_str" +- fi +- fi ++ if [ -z "$NETWORK" ]; then ++ err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" ++ err_str="$err_str match $ipaddress' failed to find a matching route" ++ ++ if [ "$__OCF_ACTION" = "start" ]; then ++ ocf_exit_reason "$err_str" ++ exit $OCF_ERR_ARGS ++ elif ! ocf_is_probe; then ++ ocf_log warn "$err_str" ++ else ++ ocf_log debug "$err_str" ++ fi ++ fi + else + NETWORK="$OCF_RESKEY_destination" + fi diff --git a/SOURCES/bz2064342-4-IPsrcaddr-fixes.patch b/SOURCES/bz2064342-4-IPsrcaddr-fixes.patch new file mode 100644 index 0000000..c099fa5 --- /dev/null +++ b/SOURCES/bz2064342-4-IPsrcaddr-fixes.patch @@ -0,0 +1,117 @@ +From 50a596bfb977b18902dc62b99145bbd1a087690a Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 1 Mar 2022 11:06:07 +0100 +Subject: [PATCH] IPsrcaddr: fixes + +- use findif.sh to detect secondary interfaces +- get metric and proto to update the correct route/update it correctly +- match route using interface to fail when trying to update secondary + interfaces without specifying destination (would update default route + before) +- also use PRIMARY_IP/OPTS during stop-action for default routes (to get + back to the exact routes we started with) +- dont fail during stop-action if route doesnt exist +- use [[:blank:]] for WS to follow POSIX standard (suggested by nrwahl) +--- + heartbeat/IPsrcaddr | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index c82adc0e9..7dbf65ff5 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -52,6 +52,7 @@ + # Initialization: + : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} + . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs ++. ${OCF_FUNCTIONS_DIR}/findif.sh + + # Defaults + OCF_RESKEY_ipaddress_default="" +@@ -181,19 +182,21 @@ errorexit() { + # + # where the src clause "src Y.Y.Y.Y" may or may not be present + +-WS="[`echo -en ' \t'`]" ++WS="[[:blank:]]" + OCTET="[0-9]\{1,3\}" + IPADDR="\($OCTET\.\)\{3\}$OCTET" + SRCCLAUSE="src$WS$WS*\($IPADDR\)" + MATCHROUTE="\(.*${WS}\)\($SRCCLAUSE\)\($WS.*\|$\)" +-FINDIF=$HA_BIN/findif ++METRICCLAUSE=".*\(metric$WS[^ ]\+\)" ++PROTOCLAUSE=".*\(proto$WS[^ ]\+\)" ++FINDIF=findif + + # findif needs that to be set + export OCF_RESKEY_ip=$OCF_RESKEY_ipaddress + + srca_read() { + # Capture matching route - doublequotes prevent word splitting... +- ROUTE="`$CMDSHOW 2> /dev/null`" || errorexit "command '$CMDSHOW' failed" ++ ROUTE="`$CMDSHOW dev $INTERFACE 2> /dev/null`" || errorexit "command '$CMDSHOW' failed" + + # ... so we can make sure there is only 1 matching route + [ 1 -eq `echo "$ROUTE" | wc -l` ] || \ +@@ -201,7 +204,7 @@ srca_read() { + + # But there might still be no matching route + [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] && [ -z "$ROUTE" ] && \ +- ! ocf_is_probe && errorexit "no matching route exists" ++ ! ocf_is_probe && [ "$__OCF_ACTION" != stop ] && errorexit "no matching route exists" + + # Sed out the source ip address if it exists + SRCIP=`echo $ROUTE | sed -n "s/$MATCHROUTE/\3/p"` +@@ -232,8 +235,8 @@ srca_start() { + rc=$OCF_SUCCESS + ocf_log info "The ip route has been already set.($NETWORK, $INTERFACE, $ROUTE_WO_SRC)" + else +- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE src $1 || \ +- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE src $1' failed" ++ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC || \ ++ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC' failed" + + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then + $CMDCHANGE $ROUTE_WO_SRC src $1 || \ +@@ -266,14 +269,11 @@ srca_stop() { + + [ $rc = 2 ] && errorexit "The address you specified to stop does not match the preferred source address" + +- OPTS="" +- if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ] ;then +- PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" +- OPTS="proto kernel scope host src $PRIMARY_IP" +- fi ++ PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" ++ OPTS="proto kernel scope link src $PRIMARY_IP" + +- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS || \ +- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS' failed" ++ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC || \ ++ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC' failed" + + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then + $CMDCHANGE $ROUTE_WO_SRC || \ +@@ -539,16 +539,19 @@ if [ $rc -ne $OCF_SUCCESS ]; then + esac + fi + +-findif_out=`$FINDIF -C` ++findif_out=`$FINDIF` + rc=$? + [ $rc -ne 0 ] && { +- ocf_exit_reason "[$FINDIF -C] failed" ++ ocf_exit_reason "[$FINDIF] failed" + exit $rc + } + + INTERFACE=`echo $findif_out | awk '{print $1}'` ++LISTROUTE=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress` ++METRIC=`echo $LISTROUTE | sed -n "s/$METRICCLAUSE/\1/p"` ++[ -z "$PROTO" ] && PROTO=`echo $LISTROUTE | sed -n "s/$PROTOCLAUSE/\1/p"` + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then +- NETWORK=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress|grep -m 1 -o '^[^ ]*'` ++ NETWORK=`echo $LISTROUTE | grep -m 1 -o '^[^ ]*'` + + if [ -z "$NETWORK" ]; then + err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" diff --git a/SOURCES/bz2072043-LVM-activate-fix-fence-issue.patch b/SOURCES/bz2072043-LVM-activate-fix-fence-issue.patch new file mode 100644 index 0000000..03727c8 --- /dev/null +++ b/SOURCES/bz2072043-LVM-activate-fix-fence-issue.patch @@ -0,0 +1,102 @@ +From e651576c1b5c1ffbe0fd1b78f209be9a3f9764e7 Mon Sep 17 00:00:00 2001 +From: XingWei-Liu +Date: Thu, 10 Mar 2022 10:38:11 +0800 +Subject: [PATCH 1/4] change lvm_status return value from ocf_not_running to + ocf_err_generic + +--- + heartbeat/LVM-activate | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/heartbeat/LVM-activate b/heartbeat/LVM-activate +index aed672ea3..0aef76706 100755 +--- a/heartbeat/LVM-activate ++++ b/heartbeat/LVM-activate +@@ -790,7 +790,7 @@ lvm_status() { + fi + + if [ $dm_count -eq 0 ]; then +- return $OCF_NOT_RUNNING ++ return $OCF_ERR_GENERIC + fi + + case "$OCF_CHECK_LEVEL" in + +From 540ae56436a4f9547bb17aa206fe0e8c7a7fea87 Mon Sep 17 00:00:00 2001 +From: XingWei-Liu +Date: Thu, 10 Mar 2022 16:44:25 +0800 +Subject: [PATCH 2/4] add if ocf_is_probe in monitor func + +--- + heartbeat/LVM-activate | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/heartbeat/LVM-activate b/heartbeat/LVM-activate +index 0aef76706..c86606637 100755 +--- a/heartbeat/LVM-activate ++++ b/heartbeat/LVM-activate +@@ -790,7 +790,11 @@ lvm_status() { + fi + + if [ $dm_count -eq 0 ]; then +- return $OCF_ERR_GENERIC ++ if ocf_is_probe ;then ++ return $OCF_NOT_RUNNING ++ else ++ return $OCF_ERR_GENERIC ++ fi + fi + + case "$OCF_CHECK_LEVEL" in + +From ae3f35d4f671f3288034a257c6dd8eff9a83447a Mon Sep 17 00:00:00 2001 +From: XingWei-Liu +Date: Thu, 10 Mar 2022 16:50:04 +0800 +Subject: [PATCH 3/4] add if ocf_is_probe in monitor func + +--- + heartbeat/LVM-activate | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heartbeat/LVM-activate b/heartbeat/LVM-activate +index c86606637..f345f73a9 100755 +--- a/heartbeat/LVM-activate ++++ b/heartbeat/LVM-activate +@@ -791,9 +791,9 @@ lvm_status() { + + if [ $dm_count -eq 0 ]; then + if ocf_is_probe ;then +- return $OCF_NOT_RUNNING +- else + return $OCF_ERR_GENERIC ++ else ++ return $OCF_NOT_RUNNING + fi + fi + + +From 1072c0490ef936a1a7dfd8411da434dce1569457 Mon Sep 17 00:00:00 2001 +From: XingWei-Liu +Date: Thu, 10 Mar 2022 18:10:21 +0800 +Subject: [PATCH 4/4] reverse return value in monitor func + +--- + heartbeat/LVM-activate | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heartbeat/LVM-activate b/heartbeat/LVM-activate +index f345f73a9..c86606637 100755 +--- a/heartbeat/LVM-activate ++++ b/heartbeat/LVM-activate +@@ -791,9 +791,9 @@ lvm_status() { + + if [ $dm_count -eq 0 ]; then + if ocf_is_probe ;then +- return $OCF_ERR_GENERIC +- else + return $OCF_NOT_RUNNING ++ else ++ return $OCF_ERR_GENERIC + fi + fi + diff --git a/SOURCES/bz2086889-lvmlockd-fail-when-use_lvmlockd-not-set.patch b/SOURCES/bz2086889-lvmlockd-fail-when-use_lvmlockd-not-set.patch new file mode 100644 index 0000000..8400437 --- /dev/null +++ b/SOURCES/bz2086889-lvmlockd-fail-when-use_lvmlockd-not-set.patch @@ -0,0 +1,25 @@ +From b3885f7d95fe390371f806c7f3debb3ec8ad012d Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 7 Jun 2022 15:20:11 +0200 +Subject: [PATCH] lvmlockd: fail when use_lvmlockd has not been set + +--- + heartbeat/lvmlockd | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/heartbeat/lvmlockd b/heartbeat/lvmlockd +index 05bb0a2e5..dc7bd2d7e 100755 +--- a/heartbeat/lvmlockd ++++ b/heartbeat/lvmlockd +@@ -179,6 +179,11 @@ setup_lvm_config() + out=$(lvmconfig 'global/locking_type' 2> /dev/null) + lock_type=$(echo "$out" | cut -d'=' -f2) + ++ if [ -z "$use_lvmlockd" ]; then ++ ocf_exit_reason "\"use_lvmlockd\" not set in /etc/lvm/lvm.conf ..." ++ exit $OCF_ERR_CONFIGURED ++ fi ++ + if [ -n "$use_lvmlockd" ] && [ "$use_lvmlockd" != 1 ] ; then + ocf_log info "setting \"use_lvmlockd=1\" in /etc/lvm/lvm.conf ..." + sed -i 's,^[[:blank:]]*use_lvmlockd[[:blank:]]*=.*,\ \ \ \ use_lvmlockd = 1,g' /etc/lvm/lvm.conf diff --git a/SOURCES/bz2090370-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch b/SOURCES/bz2090370-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch new file mode 100644 index 0000000..7f0c7ef --- /dev/null +++ b/SOURCES/bz2090370-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch @@ -0,0 +1,47 @@ +From 99c4f2af92a10155cf072198c72deffaed3883a5 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Wed, 3 Aug 2022 17:20:31 +0200 +Subject: [PATCH] CTDB: move process to root cgroup if realtime scheduling is + enabled + +--- + heartbeat/CTDB.in | 2 ++ + heartbeat/ocf-shellfuncs.in | 12 ++++++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/heartbeat/CTDB.in b/heartbeat/CTDB.in +index d25d026ca..46f56cfac 100755 +--- a/heartbeat/CTDB.in ++++ b/heartbeat/CTDB.in +@@ -709,6 +709,8 @@ EOF + invoke_ctdbd() { + local vers="$1" + ++ ocf_move_to_root_cgroup_if_rt_enabled ++ + ocf_version_cmp "$vers" "4.9.0" + if [ "$?" -ne "0" ]; then + # With 4.9+, all ctdbd binary parameters are provided as +diff --git a/heartbeat/ocf-shellfuncs.in b/heartbeat/ocf-shellfuncs.in +index 6be4e4e30..2c53a967a 100644 +--- a/heartbeat/ocf-shellfuncs.in ++++ b/heartbeat/ocf-shellfuncs.in +@@ -672,6 +672,18 @@ EOF + systemctl daemon-reload + } + ++# move process to root cgroup if realtime scheduling is enabled ++ocf_move_to_root_cgroup_if_rt_enabled() ++{ ++ if [ -e "/sys/fs/cgroup/cpu/cpu.rt_runtime_us" ]; then ++ echo $$ >> /sys/fs/cgroup/cpu/tasks ++ ++ if [ "$?" -ne "0" ]; then ++ ocf_log warn "Unable to move PID $$ to the root cgroup" ++ fi ++ fi ++} ++ + # usage: crm_mon_no_validation args... + # run crm_mon without any cib schema validation + # This is useful when an agent runs in a bundle to avoid potential diff --git a/SOURCES/bz2092262-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch b/SOURCES/bz2092262-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch deleted file mode 100644 index 7f0c7ef..0000000 --- a/SOURCES/bz2092262-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 99c4f2af92a10155cf072198c72deffaed3883a5 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Wed, 3 Aug 2022 17:20:31 +0200 -Subject: [PATCH] CTDB: move process to root cgroup if realtime scheduling is - enabled - ---- - heartbeat/CTDB.in | 2 ++ - heartbeat/ocf-shellfuncs.in | 12 ++++++++++++ - 2 files changed, 14 insertions(+) - -diff --git a/heartbeat/CTDB.in b/heartbeat/CTDB.in -index d25d026ca..46f56cfac 100755 ---- a/heartbeat/CTDB.in -+++ b/heartbeat/CTDB.in -@@ -709,6 +709,8 @@ EOF - invoke_ctdbd() { - local vers="$1" - -+ ocf_move_to_root_cgroup_if_rt_enabled -+ - ocf_version_cmp "$vers" "4.9.0" - if [ "$?" -ne "0" ]; then - # With 4.9+, all ctdbd binary parameters are provided as -diff --git a/heartbeat/ocf-shellfuncs.in b/heartbeat/ocf-shellfuncs.in -index 6be4e4e30..2c53a967a 100644 ---- a/heartbeat/ocf-shellfuncs.in -+++ b/heartbeat/ocf-shellfuncs.in -@@ -672,6 +672,18 @@ EOF - systemctl daemon-reload - } - -+# move process to root cgroup if realtime scheduling is enabled -+ocf_move_to_root_cgroup_if_rt_enabled() -+{ -+ if [ -e "/sys/fs/cgroup/cpu/cpu.rt_runtime_us" ]; then -+ echo $$ >> /sys/fs/cgroup/cpu/tasks -+ -+ if [ "$?" -ne "0" ]; then -+ ocf_log warn "Unable to move PID $$ to the root cgroup" -+ fi -+ fi -+} -+ - # usage: crm_mon_no_validation args... - # run crm_mon without any cib schema validation - # This is useful when an agent runs in a bundle to avoid potential diff --git a/SOURCES/bz2093214-aws-vpc-move-ip-add-interface-label-support.patch b/SOURCES/bz2093214-aws-vpc-move-ip-add-interface-label-support.patch new file mode 100644 index 0000000..d1a611c --- /dev/null +++ b/SOURCES/bz2093214-aws-vpc-move-ip-add-interface-label-support.patch @@ -0,0 +1,82 @@ +From 4420ef84f3172c67fc7b8b6ae41ea173de017bf4 Mon Sep 17 00:00:00 2001 +From: Petr Pavlu +Date: Wed, 25 May 2022 15:12:33 +0200 +Subject: [PATCH] aws-vpc-move-ip: Allow to set the interface label + +Add a parameter to specify an interface label to distinguish the IP +address managed by aws-vpc-move-ip, similarly as can be done with +IPaddr2. This allows to easily recognize the address from other +addresses assigned to a given interface. +--- + heartbeat/aws-vpc-move-ip | 30 +++++++++++++++++++++++++++++- + 1 file changed, 29 insertions(+), 1 deletion(-) + +diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip +index 5d5204080..dee040300 100755 +--- a/heartbeat/aws-vpc-move-ip ++++ b/heartbeat/aws-vpc-move-ip +@@ -43,6 +43,7 @@ OCF_RESKEY_address_default="" + OCF_RESKEY_routing_table_default="" + OCF_RESKEY_routing_table_role_default="" + OCF_RESKEY_interface_default="eth0" ++OCF_RESKEY_iflabel_default="" + OCF_RESKEY_monapi_default="false" + OCF_RESKEY_lookup_type_default="InstanceId" + +@@ -54,6 +55,7 @@ OCF_RESKEY_lookup_type_default="InstanceId" + : ${OCF_RESKEY_routing_table=${OCF_RESKEY_routing_table_default}} + : ${OCF_RESKEY_routing_table_role=${OCF_RESKEY_routing_table_role_default}} + : ${OCF_RESKEY_interface=${OCF_RESKEY_interface_default}} ++: ${OCF_RESKEY_iflabel=${OCF_RESKEY_iflabel_default}} + : ${OCF_RESKEY_monapi=${OCF_RESKEY_monapi_default}} + : ${OCF_RESKEY_lookup_type=${OCF_RESKEY_lookup_type_default}} + +@@ -149,6 +151,18 @@ Name of the network interface, i.e. eth0 + + + ++ ++ ++You can specify an additional label for your IP address here. ++This label is appended to your interface name. ++ ++The kernel allows alphanumeric labels up to a maximum length of 15 ++characters including the interface name and colon (e.g. eth0:foobar1234) ++ ++Interface label ++ ++ ++ + + + Enable enhanced monitoring using AWS API calls to check route table entry +@@ -215,6 +229,14 @@ ec2ip_validate() { + return $OCF_ERR_CONFIGURED + fi + ++ if [ -n "$OCF_RESKEY_iflabel" ]; then ++ label=${OCF_RESKEY_interface}:${OFC_RESKEY_iflabel} ++ if [ ${#label} -gt 15 ]; then ++ ocf_exit_reason "Interface label [$label] exceeds maximum character limit of 15" ++ exit $OCF_ERR_CONFIGURED ++ fi ++ fi ++ + TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") + EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN") + +@@ -363,7 +385,13 @@ ec2ip_get_and_configure() { + + # Reconfigure the local ip address + ec2ip_drop +- cmd="ip addr add ${OCF_RESKEY_ip}/32 dev $OCF_RESKEY_interface" ++ ++ extra_opts="" ++ if [ -n "$OCF_RESKEY_iflabel" ]; then ++ extra_opts="$extra_opts label $OCF_RESKEY_interface:$OCF_RESKEY_iflabel" ++ fi ++ ++ cmd="ip addr add ${OCF_RESKEY_ip}/32 dev $OCF_RESKEY_interface $extra_opts" + ocf_log debug "executing command: $cmd" + $cmd + rc=$? diff --git a/SOURCES/bz2103370-ocf-tester-1-update.patch b/SOURCES/bz2103370-ocf-tester-1-update.patch new file mode 100644 index 0000000..0e32ed2 --- /dev/null +++ b/SOURCES/bz2103370-ocf-tester-1-update.patch @@ -0,0 +1,39 @@ +From 46e8d346ca4803245f51a157591c4df1126d3b49 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 12 Jul 2022 12:45:52 +0200 +Subject: [PATCH] ocf-tester: use promotable terms + +--- + tools/ocf-tester.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/tools/ocf-tester.in b/tools/ocf-tester.in +index 10822a5a06..f1703ba1b7 100755 +--- a/tools/ocf-tester.in ++++ b/tools/ocf-tester.in +@@ -295,10 +295,10 @@ if [ $rc -eq 3 ]; then + + elif [ $rc -eq 8 ]; then + test_command demote "Cleanup, demote" +- assert $? 0 "Your agent was a master and could not be demoted" 1 ++ assert $? 0 "Your agent was promoted and could not be demoted" 1 + + test_command stop "Cleanup, stop" +- assert $? 0 "Your agent was a master and could not be stopped" 1 ++ assert $? 0 "Your agent was promoted and could not be stopped" 1 + + elif [ $rc -ne 7 ]; then + test_command stop +@@ -370,10 +370,10 @@ if [ $has_promote -eq 1 -a $has_demote -eq 1 ]; then + assert $? 0 "Demote failed" 1 + + elif [ $has_promote -eq 0 -a $has_demote -eq 0 ]; then +- info "* Your agent does not support master/slave (optional)" ++ info "* Your agent does not support promotable clones (optional)" + + else +- echo "* Your agent partially supports master/slave" ++ echo "* Your agent partially supports promotable clones" + num_errors=`expr $num_errors + 1` + fi + diff --git a/SOURCES/bz2103370-ocf-tester-2-remove-deprecated-lrmd-lrmadmin-code.patch b/SOURCES/bz2103370-ocf-tester-2-remove-deprecated-lrmd-lrmadmin-code.patch new file mode 100644 index 0000000..a932397 --- /dev/null +++ b/SOURCES/bz2103370-ocf-tester-2-remove-deprecated-lrmd-lrmadmin-code.patch @@ -0,0 +1,166 @@ +From 687aa646852d5fd5d4e811b2ec562ebffa15e23d Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 14 Jul 2022 14:52:07 +0200 +Subject: [PATCH] ocf-tester: remove deprecated lrmd/lrmadmin code that hasnt + worked since pre-pacemaker days + +--- + tools/ocf-tester.8 | 12 ++----- + tools/ocf-tester.in | 81 --------------------------------------------- + 2 files changed, 2 insertions(+), 91 deletions(-) + +diff --git a/tools/ocf-tester.8 b/tools/ocf-tester.8 +index 850ec0be04..3f398282d2 100644 +--- a/tools/ocf-tester.8 ++++ b/tools/ocf-tester.8 +@@ -1,9 +1,9 @@ +-.TH OCF-TESTER "8" "January 2012" "Tool for testing if a cluster resource is OCF compliant" "System Administration Utilities" ++.TH OCF-TESTER "8" "July 2022" "Tool for testing if a cluster resource is OCF compliant" "System Administration Utilities" + .SH NAME + ocf-tester \- Part of the Linux-HA project + .SH SYNOPSIS + .B ocf-tester +-[\fI-LhvqdX\fR] \fI-n resource_name \fR[\fI-o name=value\fR]\fI* /full/path/to/resource/agent\fR ++[\fI-hvqdX\fR] \fI-n resource_name \fR[\fI-o name=value\fR]\fI* /full/path/to/resource/agent\fR + .SH DESCRIPTION + Tool for testing if a cluster resource is OCF compliant + .SH OPTIONS +@@ -26,11 +26,6 @@ Name of the resource + \fB\-o\fR name=value + Name and value of any parameters required by the agent + .TP +-\fB\-L\fR +-Use lrmadmin/lrmd for tests +-.PP +-Usage: ocf\-tester [\-Lh] \fB\-n\fR resource_name [\-o name=value]* /full/path/to/resource/agent +-.TP + \fB\-h\fR + This text + .TP +@@ -51,6 +46,3 @@ Name of the resource + .TP + \fB\-o\fR name=value + Name and value of any parameters required by the agent +-.TP +-\fB\-L\fR +-Use lrmadmin/lrmd for tests +diff --git a/tools/ocf-tester.in b/tools/ocf-tester.in +index 10822a5a06..15b14e51ea 100755 +--- a/tools/ocf-tester.in ++++ b/tools/ocf-tester.in +@@ -25,8 +25,6 @@ + # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + # + +-LRMD=@libdir@/heartbeat/lrmd +-LRMADMIN=@sbindir@/lrmadmin + DATADIR=@datadir@ + METADATA_LINT="xmllint --noout --valid -" + +@@ -61,7 +59,6 @@ usage() { + echo " -X Turn on RA tracing (expect large output)" + echo " -n name Name of the resource" + echo " -o name=value Name and value of any parameters required by the agent" +- echo " -L Use lrmadmin/lrmd for tests" + exit $1 + } + +@@ -104,7 +101,6 @@ while test "$done" = "0"; do + -o) name=${2%%=*}; value=${2#*=}; + lrm_ra_args="$lrm_ra_args $2"; + ra_args="$ra_args OCF_RESKEY_$name='$value'"; shift; shift;; +- -L) use_lrmd=1; shift;; + -v) verbose=1; shift;; + -d) export HA_debug=1; shift;; + -X) export OCF_TRACE_RA=1; verbose=1; shift;; +@@ -140,79 +136,6 @@ stopped_rc=7 + has_demote=1 + has_promote=1 + +-start_lrmd() { +- lrmd_timeout=0 +- lrmd_interval=0 +- lrmd_target_rc=EVERYTIME +- lrmd_started="" +- $LRMD -s 2>/dev/null +- rc=$? +- if [ $rc -eq 3 ]; then +- lrmd_started=1 +- $LRMD & +- sleep 1 +- $LRMD -s 2>/dev/null +- else +- return $rc +- fi +-} +-add_resource() { +- $LRMADMIN -A $OCF_RESOURCE_INSTANCE \ +- ocf \ +- `basename $agent` \ +- $(basename `dirname $agent`) \ +- $lrm_ra_args > /dev/null +-} +-del_resource() { +- $LRMADMIN -D $OCF_RESOURCE_INSTANCE +-} +-parse_lrmadmin_output() { +- awk ' +-BEGIN{ rc=1; } +-/Waiting for lrmd to callback.../ { n=1; next; } +-n==1 && /----------------operation--------------/ { n++; next; } +-n==2 && /return code:/ { rc=$0; sub("return code: *","",rc); next } +-n==2 && /---------------------------------------/ { +- n++; +- next; +-} +-END{ +- if( n!=3 ) exit 1; +- else exit rc; +-} +-' +-} +-exec_resource() { +- op="$1" +- args="$2" +- $LRMADMIN -E $OCF_RESOURCE_INSTANCE \ +- $op $lrmd_timeout $lrmd_interval \ +- $lrmd_target_rc \ +- $args | parse_lrmadmin_output +-} +- +-if [ "$use_lrmd" = 1 ]; then +- echo "Using lrmd/lrmadmin for all tests" +- start_lrmd || { +- echo "could not start lrmd" >&2 +- exit 1 +- } +- trap ' +- [ "$lrmd_started" = 1 ] && $LRMD -k +- ' EXIT +- add_resource || { +- echo "failed to add resource to lrmd" >&2 +- exit 1 +- } +-fi +- +-lrm_test_command() { +- action="$1" +- msg="$2" +- debug "$msg" +- exec_resource $action "$lrm_ra_args" +-} +- + test_permissions() { + action=meta-data + debug ${1:-"Testing permissions with uid nobody"} +@@ -233,10 +156,6 @@ test_command() { + action=$1; shift + export __OCF_ACTION=$action + msg=${1:-"Testing: $action"} +- if [ "$use_lrmd" = 1 ]; then +- lrm_test_command $action "$msg" +- return $? +- fi + #echo Running: "export $ra_args; $agent $action 2>&1 > /dev/null" + if [ $verbose -eq 0 ]; then + command_output=`$agent $action 2>&1` diff --git a/SOURCES/bz2116941-ethmonitor-ovsmonitor-pgsql-fix-attrd_updater-q.patch b/SOURCES/bz2116941-ethmonitor-ovsmonitor-pgsql-fix-attrd_updater-q.patch new file mode 100644 index 0000000..f4c46f8 --- /dev/null +++ b/SOURCES/bz2116941-ethmonitor-ovsmonitor-pgsql-fix-attrd_updater-q.patch @@ -0,0 +1,75 @@ +From 0063164d72bbaca68f12a2f0a7dbae9ccb41fa39 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 26 Jul 2022 09:08:26 +0200 +Subject: [PATCH] ethmonitor/ovsmonitor/pgsql: remove ignored attrd_updater + "-q" parameter + +attrd_updater in 2.1.3 no longer ignores the -q parameter, which makes +these agents break. It never did anything in attrd_updater, and is +probably left-over from copy/paste crm_attribute code that got changed +to attrd_updater. +--- + heartbeat/ethmonitor | 2 +- + heartbeat/ovsmonitor | 2 +- + heartbeat/pgsql | 8 ++++---- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/heartbeat/ethmonitor b/heartbeat/ethmonitor +index ba8574131..451738a0b 100755 +--- a/heartbeat/ethmonitor ++++ b/heartbeat/ethmonitor +@@ -464,7 +464,7 @@ END + + set_cib_value() { + local score=`expr $1 \* $OCF_RESKEY_multiplier` +- attrd_updater -n $ATTRNAME -v $score -q ++ attrd_updater -n $ATTRNAME -v $score + local rc=$? + case $rc in + 0) ocf_log debug "attrd_updater: Updated $ATTRNAME = $score" ;; +diff --git a/heartbeat/ovsmonitor b/heartbeat/ovsmonitor +index 872ce86eb..6765da4b9 100755 +--- a/heartbeat/ovsmonitor ++++ b/heartbeat/ovsmonitor +@@ -355,7 +355,7 @@ END + + set_cib_value() { + local score=`expr $1 \* $OCF_RESKEY_multiplier` +- attrd_updater -n $ATTRNAME -v $score -q ++ attrd_updater -n $ATTRNAME -v $score + local rc=$? + case $rc in + 0) ocf_log debug "attrd_updater: Updated $ATTRNAME = $score" ;; +diff --git a/heartbeat/pgsql b/heartbeat/pgsql +index 94aceb324..e93d66855 100755 +--- a/heartbeat/pgsql ++++ b/heartbeat/pgsql +@@ -808,7 +808,7 @@ pgsql_real_stop() { + local stop_escalate + + if ocf_is_true ${OCF_RESKEY_check_wal_receiver}; then +- attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -D -q ++ attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -D + fi + + if ! pgsql_status +@@ -937,16 +937,16 @@ pgsql_wal_receiver_status() { + receiver_parent_pids=`ps -ef | tr -s " " | grep "[w]al\s*receiver" | cut -d " " -f 3` + + if echo "$receiver_parent_pids" | grep -q -w "$PID" ; then +- attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "normal" -q ++ attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "normal" + return 0 + fi + + if [ $pgsql_real_monitor_status -eq "$OCF_RUNNING_MASTER" ]; then +- attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "normal (master)" -q ++ attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "normal (master)" + return 0 + fi + +- attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "ERROR" -q ++ attrd_updater -n "$PGSQL_WAL_RECEIVER_STATUS_ATTR" -v "ERROR" + ocf_log warn "wal receiver process is not running" + return 1 + } diff --git a/SOURCES/bz2134539-IPsrcaddr-proto-metric-scope-default-route-fixes.patch b/SOURCES/bz2134539-IPsrcaddr-proto-metric-scope-default-route-fixes.patch deleted file mode 100644 index 8722395..0000000 --- a/SOURCES/bz2134539-IPsrcaddr-proto-metric-scope-default-route-fixes.patch +++ /dev/null @@ -1,147 +0,0 @@ -From 237d55120a7c8d761f839c96651e722b3bb3bc88 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Wed, 12 Oct 2022 13:57:30 +0200 -Subject: [PATCH 1/4] IPsrcaddr: fix PROTO regex - ---- - heartbeat/IPsrcaddr | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index 7dbf65ff5..24406d296 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -188,7 +188,7 @@ IPADDR="\($OCTET\.\)\{3\}$OCTET" - SRCCLAUSE="src$WS$WS*\($IPADDR\)" - MATCHROUTE="\(.*${WS}\)\($SRCCLAUSE\)\($WS.*\|$\)" - METRICCLAUSE=".*\(metric$WS[^ ]\+\)" --PROTOCLAUSE=".*\(proto$WS[^ ]\+\)" -+PROTOCLAUSE=".*\(proto$WS[^ ]\+\).*" - FINDIF=findif - - # findif needs that to be set - -From c70ba457851a401cb201cb87d23bdbc5f4fcd2b3 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Wed, 12 Oct 2022 14:00:30 +0200 -Subject: [PATCH 2/4] IPsrcaddr: detect metric for main table only, and allow - specifying metric if necessary - ---- - heartbeat/IPsrcaddr | 18 +++++++++++++++++- - 1 file changed, 17 insertions(+), 1 deletion(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index 24406d296..4745eb8a7 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -59,12 +59,14 @@ OCF_RESKEY_ipaddress_default="" - OCF_RESKEY_cidr_netmask_default="" - OCF_RESKEY_destination_default="0.0.0.0/0" - OCF_RESKEY_proto_default="" -+OCF_RESKEY_metric_default="" - OCF_RESKEY_table_default="" - - : ${OCF_RESKEY_ipaddress=${OCF_RESKEY_ipaddress_default}} - : ${OCF_RESKEY_cidr_netmask=${OCF_RESKEY_cidr_netmask_default}} - : ${OCF_RESKEY_destination=${OCF_RESKEY_destination_default}} - : ${OCF_RESKEY_proto=${OCF_RESKEY_proto_default}} -+: ${OCF_RESKEY_metric=${OCF_RESKEY_metric_default}} - : ${OCF_RESKEY_table=${OCF_RESKEY_table_default}} - ####################################################################### - -@@ -143,6 +145,14 @@ Proto to match when finding network. E.g. "kernel". - - - -+ -+ -+Metric. Only needed if incorrect metric value is used. -+ -+Metric -+ -+ -+ - - - Table to modify. E.g. "local". -@@ -548,8 +558,14 @@ rc=$? - - INTERFACE=`echo $findif_out | awk '{print $1}'` - LISTROUTE=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress` --METRIC=`echo $LISTROUTE | sed -n "s/$METRICCLAUSE/\1/p"` - [ -z "$PROTO" ] && PROTO=`echo $LISTROUTE | sed -n "s/$PROTOCLAUSE/\1/p"` -+if [ -n "$OCF_RESKEY_metric" ]; then -+ METRIC="metric $OCF_RESKEY_metric" -+elif [ -z "$TABLE" ] || [ "${TABLE#table }" = "main" ]; then -+ METRIC=`echo $LISTROUTE | sed -n "s/$METRICCLAUSE/\1/p"` -+else -+ METRIC="" -+fi - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then - NETWORK=`echo $LISTROUTE | grep -m 1 -o '^[^ ]*'` - - -From c514f12f7a19440f475938f2a4659e5e9667fa25 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Wed, 12 Oct 2022 14:01:26 +0200 -Subject: [PATCH 3/4] IPsrcaddr: use scope host when using non-main tables - ---- - heartbeat/IPsrcaddr | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index 4745eb8a7..926246008 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -279,8 +279,14 @@ srca_stop() { - - [ $rc = 2 ] && errorexit "The address you specified to stop does not match the preferred source address" - -+ if [ -z "$TABLE" ] || [ "${TABLE#table }" = "main" ]; then -+ SCOPE="link" -+ else -+ SCOPE="host" -+ fi -+ - PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" -- OPTS="proto kernel scope link src $PRIMARY_IP" -+ OPTS="proto kernel scope $SCOPE src $PRIMARY_IP" - - $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC || \ - errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC' failed" - -From 1f387ac8017b3eee23b41eadafd58ce21a29eb21 Mon Sep 17 00:00:00 2001 -From: Oyvind Albrigtsen -Date: Thu, 13 Oct 2022 13:11:28 +0200 -Subject: [PATCH 4/4] IPsrcaddr: fix monitor/status for default route not being - equal to src IP before start, and change route src correctly in stop-action - ---- - heartbeat/IPsrcaddr | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr -index 926246008..1bd41a930 100755 ---- a/heartbeat/IPsrcaddr -+++ b/heartbeat/IPsrcaddr -@@ -229,6 +229,7 @@ srca_read() { - - [ -z "$SRCIP" ] && return 1 - [ $SRCIP = $1 ] && return 0 -+ [ "$__OCF_ACTION" = "monitor" ] || [ "$__OCF_ACTION" = "status" ] && [ "${ROUTE%% *}" = "default" ] && return 1 - return 2 - } - -@@ -292,8 +293,8 @@ srca_stop() { - errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC' failed" - - if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then -- $CMDCHANGE $ROUTE_WO_SRC || \ -- errorexit "command '$CMDCHANGE $ROUTE_WO_SRC' failed" -+ $CMDCHANGE $ROUTE_WO_SRC src $PRIMARY_IP || \ -+ errorexit "command '$CMDCHANGE $ROUTE_WO_SRC src $PRIMARY_IP' failed" - fi - - return $? diff --git a/SPECS/resource-agents.spec b/SPECS/resource-agents.spec index b3d0200..c9b4e82 100644 --- a/SPECS/resource-agents.spec +++ b/SPECS/resource-agents.spec @@ -33,6 +33,9 @@ %global pyroute2 pyroute2 %global pyroute2_version 0.4.13 %global pyroute2_dir %{bundled_lib_dir}/gcp/%{pyroute2} +# python-httplib2 bundle +%global httplib2 httplib2 +%global httplib2_version 0.20.4 ## alibaba cloud # python-colorama bundle %global colorama colorama @@ -66,7 +69,7 @@ Name: resource-agents Summary: Open Source HA Reusable Cluster Resource Scripts Version: 4.9.0 -Release: 16%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist}.5 +Release: 29%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist} License: GPLv2+ and LGPLv2+ URL: https://github.com/ClusterLabs/resource-agents %if 0%{?fedora} || 0%{?centos_version} || 0%{?rhel} @@ -77,12 +80,14 @@ Group: Productivity/Clustering/HA Source0: %{upstream_prefix}-%{upstream_version}.tar.gz Source1: %{googlecloudsdk}-%{googlecloudsdk_version}-linux-x86_64.tar.gz Source2: %{pyroute2}-%{pyroute2_version}.tar.gz -Source3: %{colorama}-%{colorama_version}.tar.gz -Source4: %{pycryptodome}-%{pycryptodome_version}.tar.gz -Source5: %{aliyunsdkcore}-%{aliyunsdkcore_version}.tar.gz -Source6: %{aliyunsdkecs}-%{aliyunsdkecs_version}.tar.gz -Source7: %{aliyunsdkvpc}-%{aliyunsdkvpc_version}.tar.gz -Source8: %{aliyuncli}-%{aliyuncli_version}.tar.gz +Source3: pyparsing-2.4.7-py2.py3-none-any.whl +Source4: %{httplib2}-%{httplib2_version}.tar.gz +Source5: %{colorama}-%{colorama_version}.tar.gz +Source6: %{pycryptodome}-%{pycryptodome_version}.tar.gz +Source7: %{aliyunsdkcore}-%{aliyunsdkcore_version}.tar.gz +Source8: %{aliyunsdkecs}-%{aliyunsdkecs_version}.tar.gz +Source9: %{aliyunsdkvpc}-%{aliyunsdkvpc_version}.tar.gz +Source10: %{aliyuncli}-%{aliyuncli_version}.tar.gz Patch0: nova-compute-wait-NovaEvacuate.patch Patch1: bz1872754-pgsqlms-new-ra.patch Patch2: bz1995178-storage-mon-fix-typo.patch @@ -97,12 +102,24 @@ Patch10: bz2012057-Route-return-OCF_NOT_RUNNING-missing-route.patch Patch11: bz2029706-1-db2-crm_attribute-use-forever.patch Patch12: bz2029706-2-db2-fixes.patch Patch13: bz1992661-mysql-use-ssl-mode.patch -Patch14: bz1654862-1-IPsrcaddr-dhcp-warning.patch -Patch15: bz1654862-2-IPsrcaddr-error-message-route-not-found.patch -Patch16: bz1654862-3-IPsrcaddr-fix-indentation.patch -Patch17: bz1654862-4-IPsrcaddr-fixes.patch -Patch18: bz2092262-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch -Patch19: bz2134539-IPsrcaddr-proto-metric-scope-default-route-fixes.patch +Patch14: bz2064342-1-IPsrcaddr-dhcp-warning.patch +Patch15: bz2064342-2-IPsrcaddr-error-message-route-not-found.patch +Patch16: bz2064342-3-IPsrcaddr-fix-indentation.patch +Patch17: bz2064342-4-IPsrcaddr-fixes.patch +Patch18: bz1908146-bz1908147-bz1908148-bz1949114-update-openstack-agents.patch +Patch19: bz2072043-LVM-activate-fix-fence-issue.patch +Patch20: bz2049414-Filesystem-1-fix-uuid-label-device-whitespace.patch +Patch21: bz2049414-Filesystem-2-improve-uuid-label-device-logic.patch +Patch22: bz2086889-lvmlockd-fail-when-use_lvmlockd-not-set.patch +Patch23: bz2093214-aws-vpc-move-ip-add-interface-label-support.patch +Patch24: bz1908148-openstack-info-fix-bashism.patch +Patch25: bz1908146-bz1908147-bz1949114-openstack-agents-fixes.patch +Patch26: bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-warn-when-openstackcli-slow.patch +Patch27: bz2103370-ocf-tester-1-update.patch +Patch28: bz2103370-ocf-tester-2-remove-deprecated-lrmd-lrmadmin-code.patch +Patch29: bz1908146-bz1908147-bz1908148-bz1949114-openstack-agents-set-domain-parameters-default.patch +Patch30: bz2090370-CTDB-move-process-to-root-cgroup-if-rt-enabled.patch +Patch31: bz2116941-ethmonitor-ovsmonitor-pgsql-fix-attrd_updater-q.patch # bundle patches Patch1000: 7-gcp-bundled.patch @@ -126,6 +143,10 @@ BuildRequires: libxslt glib2-devel BuildRequires: systemd BuildRequires: which +%ifarch x86_64 +BuildRequires: python3-pip +%endif + %if 0%{?fedora} || 0%{?centos_version} || 0%{?rhel} #BuildRequires: cluster-glue-libs-devel BuildRequires: docbook-style-xsl docbook-dtds @@ -249,6 +270,8 @@ Provides: bundled(python-websocket) = 0.47.0 Provides: bundled(python-yaml) = 3.12 # python-pyroute2 bundle Provides: bundled(%{pyroute2}) = %{pyroute2_version} +# python-httplib2 bundle +Provides: bundled(%{httplib2}) = %{httplib2_version} %description gcp The Google Cloud Platform resource agents allows Google Cloud @@ -296,6 +319,18 @@ exit 1 %patch17 -p1 %patch18 -p1 %patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch30 -p1 +%patch31 -p1 chmod 755 heartbeat/nova-compute-wait chmod 755 heartbeat/NovaEvacuate @@ -309,7 +344,7 @@ mkdir -p %{bundled_lib_dir}/aliyun %ifarch x86_64 tar -xzf %SOURCE1 -C %{bundled_lib_dir}/gcp # gcp*: append bundled-directory to search path, gcloud-ra -%patch1000 -p1 -F2 +%patch1000 -p1 # replace python-rsa with python-cryptography %patch1001 -p1 # gcloud support info @@ -387,7 +422,7 @@ cp %{pyroute2_dir}/LICENSE.Apache.v2 %{pyroute2}_LICENSE.Apache.v2 cp %{pyroute2_dir}/LICENSE.GPL.v2 %{pyroute2}_LICENSE.GPL.v2 # python-colorama bundle -tar -xzf %SOURCE3 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE5 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{colorama}-%{colorama_version} %{colorama_dir} cp %{colorama_dir}/LICENSE.txt %{colorama}_LICENSE.txt cp %{colorama_dir}/README.rst %{colorama}_README.rst @@ -398,28 +433,28 @@ rm -rf *.egg-info popd # python-pycryptodome bundle -tar -xzf %SOURCE4 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE6 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{pycryptodome}-%{pycryptodome_version} %{pycryptodome_dir} cp %{pycryptodome_dir}/README.rst %{pycryptodome}_README.rst cp %{pycryptodome_dir}/LICENSE.rst %{pycryptodome}_LICENSE.rst # python-aliyun-sdk-core bundle -tar -xzf %SOURCE5 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE7 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{aliyunsdkcore}-%{aliyunsdkcore_version} %{aliyunsdkcore_dir} cp %{aliyunsdkcore_dir}/README.rst %{aliyunsdkcore}_README.rst # python-aliyun-sdk-ecs bundle -tar -xzf %SOURCE6 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE8 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{aliyunsdkecs}-%{aliyunsdkecs_version} %{aliyunsdkecs_dir} cp %{aliyunsdkecs_dir}/README.rst %{aliyunsdkecs}_README.rst # python-aliyun-sdk-vpc bundle -tar -xzf %SOURCE7 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE9 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{aliyunsdkvpc}-%{aliyunsdkvpc_version} %{aliyunsdkvpc_dir} cp %{aliyunsdkvpc_dir}/README.rst %{aliyunsdkvpc}_README.rst # aliyuncli bundle -tar -xzf %SOURCE8 -C %{bundled_lib_dir}/aliyun +tar -xzf %SOURCE10 -C %{bundled_lib_dir}/aliyun mv %{bundled_lib_dir}/aliyun/%{aliyuncli}-%{aliyuncli_version} %{aliyuncli_dir} cp %{aliyuncli_dir}/README.rst %{aliyuncli}_README.rst cp %{aliyuncli_dir}/LICENSE %{aliyuncli}_LICENSE @@ -541,6 +576,10 @@ pushd %{pyroute2_dir} %{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/gcp popd +# python-httplib2 bundle +%{__python3} -m pip install --user --no-index --find-links %{_sourcedir} pyparsing +%{__python3} -m pip install --target %{buildroot}/usr/lib/%{name}/%{bundled_lib_dir}/gcp --no-index --find-links %{_sourcedir} %{httplib2} + # python-colorama bundle pushd %{colorama_dir} %{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/aliyun @@ -636,6 +675,7 @@ rm -rf %{buildroot} %exclude %{_datadir}/%{name}/ocft/runocft %exclude %{_datadir}/%{name}/ocft/runocft.prereq +%{_sbindir}/ocf-tester %{_sbindir}/ocft %{_includedir}/heartbeat @@ -647,6 +687,7 @@ rm -rf %{buildroot} %endif %{_mandir}/man7/*.7* +%{_mandir}/man8/ocf-tester.8* ### # Supported, but in another sub package @@ -718,10 +759,6 @@ rm -rf %{buildroot} %exclude %{_usr}/lib/ocf/resource.d/heartbeat/mpathpersist %exclude %{_usr}/lib/ocf/resource.d/heartbeat/mysql-proxy %exclude %{_usr}/lib/ocf/resource.d/heartbeat/nvmet-* -%exclude %{_usr}/lib/ocf/resource.d/heartbeat/openstack-cinder-volume -%exclude %{_usr}/lib/ocf/resource.d/heartbeat/openstack-floating-ip -%exclude %{_usr}/lib/ocf/resource.d/heartbeat/openstack-info -%exclude %{_usr}/lib/ocf/resource.d/heartbeat/openstack-virtual-ip %exclude %{_usr}/lib/ocf/resource.d/heartbeat/ovsmonitor %exclude %{_usr}/lib/ocf/resource.d/heartbeat/pgagent %exclude %{_usr}/lib/ocf/resource.d/heartbeat/pingd @@ -786,10 +823,6 @@ rm -rf %{buildroot} %exclude %{_mandir}/man7/ocf_heartbeat_mpathpersist.7.gz %exclude %{_mandir}/man7/ocf_heartbeat_mysql-proxy.7.gz %exclude %{_mandir}/man7/ocf_heartbeat_nvmet-*.7.gz -%exclude %{_mandir}/man7/ocf_heartbeat_openstack-cinder-volume.7.gz -%exclude %{_mandir}/man7/ocf_heartbeat_openstack-floating-ip.7.gz -%exclude %{_mandir}/man7/ocf_heartbeat_openstack-info.7.gz -%exclude %{_mandir}/man7/ocf_heartbeat_openstack-virtual-ip.7.gz %exclude %{_mandir}/man7/ocf_heartbeat_ovsmonitor.7.gz %exclude %{_mandir}/man7/ocf_heartbeat_pgagent.7.gz %exclude %{_mandir}/man7/ocf_heartbeat_pingd.7.gz @@ -810,9 +843,6 @@ rm -rf %{buildroot} ### # Other excluded files. ### -# This tool has to be updated for the new pacemaker lrmd. -%exclude %{_sbindir}/ocf-tester -%exclude %{_mandir}/man8/ocf-tester.8* # ldirectord is not supported %exclude /etc/ha.d/resource.d/ldirectord %exclude /etc/init.d/ldirectord @@ -876,21 +906,60 @@ ccs_update_schema > /dev/null 2>&1 ||: %{_usr}/lib/ocf/lib/heartbeat/OCF_*.pm %changelog -* Fri Oct 14 2022 Oyvind Albrigtsen - 4.9.0-16.5 -- IPsrcaddr: proto, metric, scope and default route fixes +* Wed Aug 10 2022 Oyvind Albrigtsen - 4.9.0-29 +- ethmonitor/pgsql: remove attrd_updater "-q" parameter to solve issue + with Pacemaker 2.1.3+ not ignoring it - Resolves: rhbz#2134539 + Resolves: rhbz#2116941 -* Fri Aug 5 2022 Oyvind Albrigtsen - 4.9.0-16.2 +* Thu Aug 4 2022 Oyvind Albrigtsen - 4.9.0-28 - CTDB: move process to root cgroup if realtime scheduling is enabled - Resolves: rhbz#2092262 + Resolves: rhbz#2090370 + +* Thu Jul 14 2022 Oyvind Albrigtsen - 4.9.0-27 +- ocf-tester: add testing tool + + Resolves: rhbz#2103370 + +* Thu Jul 14 2022 Oyvind Albrigtsen - 4.9.0-26 +- openstack-cinder-volume/openstack-floating-ip/openstack-info/ + openstack-virtual-ip: new resource agents + + Resolves: rhbz#1908146, rhbz#1908147, rhbz#1908148, rhbz#1949114 + +* Thu Jun 16 2022 Oyvind Albrigtsen - 4.9.0-22 +- gcp-vpc-move-route/gcp-vpc-move-vip: upgrade bundled + python-httplib2 to fix SSL issue + + Resolves: rhbz#2097462 + +* Thu Jun 9 2022 Oyvind Albrigtsen - 4.9.0-21 +- aws-vpc-move-ip: add interface label support + + Resolves: rhbz#2093214 + +* Wed Jun 8 2022 Oyvind Albrigtsen - 4.9.0-20 +- lvmlockd: fail when use_lvmlockd has not been set + + Resolves: rhbz#2086889 + +* Thu Apr 21 2022 Oyvind Albrigtsen - 4.9.0-19 +- Filesystem: fix UUID/label device support when there's whitespace + between parameter and UUID/label + + Resolves: rhbz#2049414 + +* Thu Apr 7 2022 Oyvind Albrigtsen - 4.9.0-18 +- LVM-activate: use correct return code to fence failed node + + Resolves: rhbz#2072043 * Thu Mar 3 2022 Oyvind Albrigtsen - 4.9.0-16 - IPsrcaddr: add warning about possible issues when used with DHCP, and add error message when matching route not found - Resolves: rhbz#1654862 + Resolves: rhbz#2064342 * Thu Feb 24 2022 Oyvind Albrigtsen - 4.9.0-15 - db2: use -l forever to fix crm_attribute issue