import resource-agents-4.10.0-9.el9_0
This commit is contained in:
commit
9a69534996
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
SOURCES/ClusterLabs-resource-agents-fd0720f7.tar.gz
|
1
.resource-agents.metadata
Normal file
1
.resource-agents.metadata
Normal file
@ -0,0 +1 @@
|
||||
3b517ecdbe2103df77813050e5c998e102c5de7e SOURCES/ClusterLabs-resource-agents-fd0720f7.tar.gz
|
3338
SOURCES/bz1952005-pgsqlms-new-ra.patch
Normal file
3338
SOURCES/bz1952005-pgsqlms-new-ra.patch
Normal file
File diff suppressed because it is too large
Load Diff
29
SOURCES/bz2021125-gcp-ilb-1-fix-log_enable.patch
Normal file
29
SOURCES/bz2021125-gcp-ilb-1-fix-log_enable.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 9a7b47f1838e9d6e3c807e9db5312097adb5c499 Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Fri, 5 Nov 2021 10:30:49 +0100
|
||||
Subject: [PATCH] gcp-ilb/Squid: fix issues detected by CI
|
||||
|
||||
---
|
||||
heartbeat/Squid.in | 2 +-
|
||||
heartbeat/gcp-ilb | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/heartbeat/gcp-ilb b/heartbeat/gcp-ilb
|
||||
index 28484b241..48dc3ac4e 100755
|
||||
--- a/heartbeat/gcp-ilb
|
||||
+++ b/heartbeat/gcp-ilb
|
||||
@@ -53,12 +53,12 @@ pidfile="/var/run/$OCF_RESOURCE_INSTANCE.pid"
|
||||
|
||||
|
||||
#Validate command for logging
|
||||
-if $OCF_RESKEY_log_enable = "true"; then
|
||||
+if [ $OCF_RESKEY_log_enable = "true" ]; then
|
||||
if type $OCF_RESKEY_log_cmd > /dev/null 2>&1; then
|
||||
logging_cmd="$OCF_RESKEY_log_cmd $OCF_RESKEY_log_params"
|
||||
ocf_log debug "Logging command is: \'$logging_cmd\' "
|
||||
else
|
||||
- $OCF_RESKEY_log_enable = "false"
|
||||
+ OCF_RESKEY_log_enable="false"
|
||||
ocf_log err "\'$logging_cmd\' is invalid. External logging disabled."
|
||||
|
||||
fi;
|
@ -0,0 +1,51 @@
|
||||
From 14576f7ca02fb0abff188238ac019e88ab06e878 Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Tue, 9 Nov 2021 11:49:36 +0100
|
||||
Subject: [PATCH] gcp-ilb: only check if log_cmd binary is available if
|
||||
log_enable is true
|
||||
|
||||
---
|
||||
heartbeat/gcp-ilb | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/heartbeat/gcp-ilb b/heartbeat/gcp-ilb
|
||||
index 48dc3ac4e..f84f373b7 100755
|
||||
--- a/heartbeat/gcp-ilb
|
||||
+++ b/heartbeat/gcp-ilb
|
||||
@@ -37,7 +37,7 @@ if type "socat" > /dev/null 2>&1; then
|
||||
OCF_RESKEY_cat_default="socat"
|
||||
else
|
||||
OCF_RESKEY_cat_default="nc"
|
||||
-fi;
|
||||
+fi
|
||||
|
||||
|
||||
: ${OCF_RESKEY_cat=${OCF_RESKEY_cat_default}}
|
||||
@@ -53,7 +53,7 @@ pidfile="/var/run/$OCF_RESOURCE_INSTANCE.pid"
|
||||
|
||||
|
||||
#Validate command for logging
|
||||
-if [ $OCF_RESKEY_log_enable = "true" ]; then
|
||||
+if ocf_is_true "$OCF_RESKEY_log_enable"; then
|
||||
if type $OCF_RESKEY_log_cmd > /dev/null 2>&1; then
|
||||
logging_cmd="$OCF_RESKEY_log_cmd $OCF_RESKEY_log_params"
|
||||
ocf_log debug "Logging command is: \'$logging_cmd\' "
|
||||
@@ -61,7 +61,7 @@ if [ $OCF_RESKEY_log_enable = "true" ]; then
|
||||
OCF_RESKEY_log_enable="false"
|
||||
ocf_log err "\'$logging_cmd\' is invalid. External logging disabled."
|
||||
|
||||
- fi;
|
||||
+ fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -285,7 +285,8 @@ ilb_stop() {
|
||||
|
||||
ilb_validate() {
|
||||
check_binary "$OCF_RESKEY_cat"
|
||||
- check_binary "$OCF_RESKEY_log_cmd"
|
||||
+
|
||||
+ ocf_is_true "$OCF_RESKEY_log_enable" && check_binary "$OCF_RESKEY_log_cmd"
|
||||
|
||||
if ! ocf_is_decimal "$OCF_RESKEY_port"; then
|
||||
ocf_exit_reason "$OCF_RESKEY_port is not a valid port"
|
32
SOURCES/bz2029704-1-db2-crm_attribute-use-forever.patch
Normal file
32
SOURCES/bz2029704-1-db2-crm_attribute-use-forever.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From 925180da2f41feddc5aac3c249563eb179b34029 Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Mon, 22 Nov 2021 16:44:48 +0100
|
||||
Subject: [PATCH] db2: use -l forever instead of -t nodes -l reboot, as they
|
||||
conflict with eachother
|
||||
|
||||
---
|
||||
heartbeat/db2 | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/heartbeat/db2 b/heartbeat/db2
|
||||
index 03146a957..fa2a45a5d 100755
|
||||
--- a/heartbeat/db2
|
||||
+++ b/heartbeat/db2
|
||||
@@ -274,7 +274,7 @@ db2_fal_attrib() {
|
||||
while read id node member
|
||||
do
|
||||
[ "$member" = member -a "$node" != "$me" ] || continue
|
||||
- crm_attribute -t nodes -l reboot --node=$node -n $attr -v "$3"
|
||||
+ crm_attribute -l forever --node=$node -n $attr -v "$3"
|
||||
rc=$?
|
||||
ocf_log info "DB2 instance $instance($db2node/$db: setting attrib for FAL to $FIRST_ACTIVE_LOG @ $node"
|
||||
[ $rc != 0 ] && break
|
||||
@@ -282,7 +282,7 @@ db2_fal_attrib() {
|
||||
;;
|
||||
|
||||
get)
|
||||
- crm_attribute -t nodes -l reboot -n $attr -G --quiet 2>&1
|
||||
+ crm_attribute -l forever -n $attr -G --quiet 2>&1
|
||||
rc=$?
|
||||
if [ $rc != 0 ]
|
||||
then
|
32
SOURCES/bz2029704-2-db2-fixes.patch
Normal file
32
SOURCES/bz2029704-2-db2-fixes.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From 75eaf06eea8957aa3941823955d1c8fa7933ab1d Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Wed, 23 Feb 2022 16:32:21 +0100
|
||||
Subject: [PATCH] db2: only warn when notify isnt set, and use
|
||||
ocf_local_nodename() to get node name
|
||||
|
||||
---
|
||||
heartbeat/db2 | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/heartbeat/db2 b/heartbeat/db2
|
||||
index fa2a45a5d..ea24d33fc 100755
|
||||
--- a/heartbeat/db2
|
||||
+++ b/heartbeat/db2
|
||||
@@ -267,7 +267,7 @@ db2_fal_attrib() {
|
||||
|
||||
case "$2" in
|
||||
set)
|
||||
- me=$(uname -n)
|
||||
+ me=$(ocf_local_nodename)
|
||||
|
||||
# loop over all member nodes and set attribute
|
||||
crm_node -l |
|
||||
@@ -284,7 +284,7 @@ db2_fal_attrib() {
|
||||
get)
|
||||
crm_attribute -l forever -n $attr -G --quiet 2>&1
|
||||
rc=$?
|
||||
- if [ $rc != 0 ]
|
||||
+ if ! ocf_is_true "$OCF_RESKEY_CRM_meta_notify" && [ $rc != 0 ]
|
||||
then
|
||||
ocf_log warn "DB2 instance $instance($db2node/$db: can't retrieve attribute $attr, are you sure notifications are enabled ?"
|
||||
fi
|
22
SOURCES/bz2029753-podman-remove-anonymous-volumes.patch
Normal file
22
SOURCES/bz2029753-podman-remove-anonymous-volumes.patch
Normal file
@ -0,0 +1,22 @@
|
||||
From c6338011cf9ea69324f44c8c31a4ca2478aab35a Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Tue, 7 Dec 2021 08:59:50 +0100
|
||||
Subject: [PATCH] podman: remove anonymous volumes
|
||||
|
||||
---
|
||||
heartbeat/podman | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/heartbeat/podman b/heartbeat/podman
|
||||
index fd901c968..2b73857f1 100755
|
||||
--- a/heartbeat/podman
|
||||
+++ b/heartbeat/podman
|
||||
@@ -251,7 +251,7 @@ remove_container()
|
||||
return 0
|
||||
fi
|
||||
ocf_log notice "Cleaning up inactive container, ${CONTAINER}."
|
||||
- ocf_run podman rm $CONTAINER
|
||||
+ ocf_run podman rm -v $CONTAINER
|
||||
rc=$?
|
||||
if [ $rc -ne 0 ]; then
|
||||
# due to a podman bug (rhbz#1841485), sometimes a stopped
|
@ -0,0 +1,43 @@
|
||||
From 7c54e4ecda33c90a1046c0688774f5b847ab10fe Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
Date: Tue, 7 Dec 2021 10:37:24 +0100
|
||||
Subject: [PATCH] Route: return OCF_NOT_RUNNING for probe action when interface
|
||||
or route doesnt exist
|
||||
|
||||
---
|
||||
heartbeat/Route | 15 +++++----------
|
||||
1 file changed, 5 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/heartbeat/Route b/heartbeat/Route
|
||||
index 8b390615a..7db41d0ae 100755
|
||||
--- a/heartbeat/Route
|
||||
+++ b/heartbeat/Route
|
||||
@@ -227,15 +227,6 @@ route_stop() {
|
||||
}
|
||||
|
||||
route_status() {
|
||||
- if [ -n "${OCF_RESKEY_device}" ]; then
|
||||
- # Must check if device exists or is gone.
|
||||
- # If device is gone, route is also unconfigured.
|
||||
- ip link show dev ${OCF_RESKEY_device} >/dev/null 2>&1
|
||||
- if [ $? -ne 0 ]; then
|
||||
- # Assume device does not exist, and short-circuit here.
|
||||
- return $OCF_NOT_RUNNING
|
||||
- fi
|
||||
- fi
|
||||
show_output="$(ip $addr_family route show $(create_route_spec) 2>/dev/null)"
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ -n "$show_output" ]; then
|
||||
@@ -251,7 +242,11 @@ route_status() {
|
||||
else
|
||||
# "ip route show" returned an error code. Assume something
|
||||
# went wrong.
|
||||
- return $OCF_ERR_GENERIC
|
||||
+ if ocf_is_probe; then
|
||||
+ return $OCF_NOT_RUNNING
|
||||
+ else
|
||||
+ return $OCF_ERR_GENERIC
|
||||
+ fi
|
||||
fi
|
||||
}
|
||||
|
41
SOURCES/bz2055016-1-IPsrcaddr-dhcp-warning.patch
Normal file
41
SOURCES/bz2055016-1-IPsrcaddr-dhcp-warning.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 6d2ed7615614ede093f097189876d0f08553a43e Mon Sep 17 00:00:00 2001
|
||||
From: Reid Wahl <nrwahl@protonmail.com>
|
||||
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 <nrwahl@protonmail.com>
|
||||
---
|
||||
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() {
|
||||
<longdesc lang="en">
|
||||
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.
|
||||
</longdesc>
|
||||
<shortdesc lang="en">Manages the preferred source address for outgoing IP packets</shortdesc>
|
||||
|
@ -0,0 +1,49 @@
|
||||
From 5a65f66ff803ad7ed15af958cc1efdde4d53dcb7 Mon Sep 17 00:00:00 2001
|
||||
From: Reid Wahl <nrwahl@protonmail.com>
|
||||
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 <nrwahl@protonmail.com>
|
||||
---
|
||||
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
|
56
SOURCES/bz2055016-3-IPsrcaddr-fix-indentation.patch
Normal file
56
SOURCES/bz2055016-3-IPsrcaddr-fix-indentation.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 0a197f1cd227e768837dff778a0c56fc1085d434 Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
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
|
117
SOURCES/bz2055016-4-IPsrcaddr-fixes.patch
Normal file
117
SOURCES/bz2055016-4-IPsrcaddr-fixes.patch
Normal file
@ -0,0 +1,117 @@
|
||||
From 50a596bfb977b18902dc62b99145bbd1a087690a Mon Sep 17 00:00:00 2001
|
||||
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
|
||||
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"
|
12
SOURCES/ha-cloud-support-aliyun.patch
Normal file
12
SOURCES/ha-cloud-support-aliyun.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff --color -uNr a/heartbeat/aliyun-vpc-move-ip b/heartbeat/aliyun-vpc-move-ip
|
||||
--- a/heartbeat/aliyun-vpc-move-ip 2021-08-19 09:37:57.000000000 +0200
|
||||
+++ b/heartbeat/aliyun-vpc-move-ip 2021-08-25 13:38:26.786626079 +0200
|
||||
@@ -17,7 +17,7 @@
|
||||
OCF_RESKEY_interface_default="eth0"
|
||||
OCF_RESKEY_profile_default="default"
|
||||
OCF_RESKEY_endpoint_default="vpc.aliyuncs.com"
|
||||
-OCF_RESKEY_aliyuncli_default="detect"
|
||||
+OCF_RESKEY_aliyuncli_default="/usr/lib/fence-agents/support/aliyun/bin/aliyuncli"
|
||||
|
||||
|
||||
: ${OCF_RESKEY_address=${OCF_RESKEY_address_default}}
|
48
SOURCES/ha-cloud-support-aws.patch
Normal file
48
SOURCES/ha-cloud-support-aws.patch
Normal file
@ -0,0 +1,48 @@
|
||||
diff --color -uNr a/heartbeat/awseip b/heartbeat/awseip
|
||||
--- a/heartbeat/awseip 2020-12-03 14:31:17.000000000 +0100
|
||||
+++ b/heartbeat/awseip 2021-02-15 16:47:36.624610378 +0100
|
||||
@@ -43,7 +43,7 @@
|
||||
#
|
||||
# Defaults
|
||||
#
|
||||
-OCF_RESKEY_awscli_default="/usr/bin/aws"
|
||||
+OCF_RESKEY_awscli_default="/usr/lib/fence-agents/support/awscli/bin/aws"
|
||||
OCF_RESKEY_profile_default="default"
|
||||
OCF_RESKEY_api_delay_default="3"
|
||||
|
||||
diff --color -uNr a/heartbeat/awsvip b/heartbeat/awsvip
|
||||
--- a/heartbeat/awsvip 2020-12-03 14:31:17.000000000 +0100
|
||||
+++ b/heartbeat/awsvip 2021-02-15 16:47:48.960632484 +0100
|
||||
@@ -42,7 +42,7 @@
|
||||
#
|
||||
# Defaults
|
||||
#
|
||||
-OCF_RESKEY_awscli_default="/usr/bin/aws"
|
||||
+OCF_RESKEY_awscli_default="/usr/lib/fence-agents/support/awscli/bin/aws"
|
||||
OCF_RESKEY_profile_default="default"
|
||||
OCF_RESKEY_api_delay_default="3"
|
||||
|
||||
diff --color -uNr a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
|
||||
--- a/heartbeat/aws-vpc-move-ip 2020-12-03 14:31:17.000000000 +0100
|
||||
+++ b/heartbeat/aws-vpc-move-ip 2021-02-15 16:47:55.484644118 +0100
|
||||
@@ -35,7 +35,7 @@
|
||||
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
|
||||
|
||||
# Defaults
|
||||
-OCF_RESKEY_awscli_default="/usr/bin/aws"
|
||||
+OCF_RESKEY_awscli_default="/usr/lib/fence-agents/support/awscli/bin/aws"
|
||||
OCF_RESKEY_profile_default="default"
|
||||
OCF_RESKEY_region_default=""
|
||||
OCF_RESKEY_ip_default=""
|
||||
diff --color -uNr a/heartbeat/aws-vpc-route53.in b/heartbeat/aws-vpc-route53.in
|
||||
--- a/heartbeat/aws-vpc-route53.in 2020-12-03 14:31:17.000000000 +0100
|
||||
+++ b/heartbeat/aws-vpc-route53.in 2021-02-15 16:47:59.808651828 +0100
|
||||
@@ -45,7 +45,7 @@
|
||||
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
|
||||
|
||||
# Defaults
|
||||
-OCF_RESKEY_awscli_default="/usr/bin/aws"
|
||||
+OCF_RESKEY_awscli_default="/usr/lib/fence-agents/support/awscli/bin/aws"
|
||||
OCF_RESKEY_profile_default="default"
|
||||
OCF_RESKEY_hostedzoneid_default=""
|
||||
OCF_RESKEY_fullname_default=""
|
33
SOURCES/ha-cloud-support-gcloud.patch
Normal file
33
SOURCES/ha-cloud-support-gcloud.patch
Normal file
@ -0,0 +1,33 @@
|
||||
diff --color -uNr a/heartbeat/gcp-pd-move.in b/heartbeat/gcp-pd-move.in
|
||||
--- a/heartbeat/gcp-pd-move.in 2021-08-19 09:37:57.000000000 +0200
|
||||
+++ b/heartbeat/gcp-pd-move.in 2021-08-25 13:50:54.461732967 +0200
|
||||
@@ -32,6 +32,7 @@
|
||||
from ocf import logger
|
||||
|
||||
try:
|
||||
+ sys.path.insert(0, '/usr/lib/fence-agents/support/google')
|
||||
import googleapiclient.discovery
|
||||
except ImportError:
|
||||
pass
|
||||
diff --color -uNr a/heartbeat/gcp-vpc-move-route.in b/heartbeat/gcp-vpc-move-route.in
|
||||
--- a/heartbeat/gcp-vpc-move-route.in 2021-08-19 09:37:57.000000000 +0200
|
||||
+++ b/heartbeat/gcp-vpc-move-route.in 2021-08-25 13:51:17.489797999 +0200
|
||||
@@ -45,6 +45,7 @@
|
||||
from ocf import *
|
||||
|
||||
try:
|
||||
+ sys.path.insert(0, '/usr/lib/fence-agents/support/google')
|
||||
import googleapiclient.discovery
|
||||
import pyroute2
|
||||
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 2021-08-19 09:37:57.000000000 +0200
|
||||
+++ b/heartbeat/gcp-vpc-move-vip.in 2021-08-25 13:51:35.012847487 +0200
|
||||
@@ -29,6 +29,7 @@
|
||||
from ocf import *
|
||||
|
||||
try:
|
||||
+ sys.path.insert(0, '/usr/lib/fence-agents/support/google')
|
||||
import googleapiclient.discovery
|
||||
try:
|
||||
from google.oauth2.service_account import Credentials as ServiceAccountCredentials
|
787
SOURCES/nova-compute-wait-NovaEvacuate.patch
Normal file
787
SOURCES/nova-compute-wait-NovaEvacuate.patch
Normal file
@ -0,0 +1,787 @@
|
||||
diff --color -uNr a/doc/man/Makefile.am b/doc/man/Makefile.am
|
||||
--- a/doc/man/Makefile.am 2021-08-25 09:51:53.037906134 +0200
|
||||
+++ b/doc/man/Makefile.am 2021-08-25 09:48:44.578408475 +0200
|
||||
@@ -97,6 +97,8 @@
|
||||
ocf_heartbeat_ManageRAID.7 \
|
||||
ocf_heartbeat_ManageVE.7 \
|
||||
ocf_heartbeat_NodeUtilization.7 \
|
||||
+ ocf_heartbeat_nova-compute-wait.7 \
|
||||
+ ocf_heartbeat_NovaEvacuate.7 \
|
||||
ocf_heartbeat_Pure-FTPd.7 \
|
||||
ocf_heartbeat_Raid1.7 \
|
||||
ocf_heartbeat_Route.7 \
|
||||
diff --color -uNr a/heartbeat/Makefile.am b/heartbeat/Makefile.am
|
||||
--- a/heartbeat/Makefile.am 2021-08-25 09:51:53.038906137 +0200
|
||||
+++ b/heartbeat/Makefile.am 2021-08-25 09:48:44.588408501 +0200
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
ocfdir = $(OCF_RA_DIR_PREFIX)/heartbeat
|
||||
|
||||
+ospdir = $(OCF_RA_DIR_PREFIX)/openstack
|
||||
+
|
||||
dtddir = $(datadir)/$(PACKAGE_NAME)
|
||||
dtd_DATA = ra-api-1.dtd metadata.rng
|
||||
|
||||
@@ -50,6 +52,9 @@
|
||||
send_ua_SOURCES = send_ua.c IPv6addr_utils.c
|
||||
send_ua_LDADD = $(LIBNETLIBS)
|
||||
|
||||
+osp_SCRIPTS = nova-compute-wait \
|
||||
+ NovaEvacuate
|
||||
+
|
||||
ocf_SCRIPTS = AoEtarget \
|
||||
AudibleAlarm \
|
||||
ClusterMon \
|
||||
diff --color -uNr a/heartbeat/nova-compute-wait b/heartbeat/nova-compute-wait
|
||||
--- a/heartbeat/nova-compute-wait 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/heartbeat/nova-compute-wait 2021-08-25 09:50:14.626646141 +0200
|
||||
@@ -0,0 +1,345 @@
|
||||
+#!/bin/sh
|
||||
+#
|
||||
+#
|
||||
+# nova-compute-wait agent manages compute daemons.
|
||||
+#
|
||||
+# Copyright (c) 2015
|
||||
+#
|
||||
+# 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_ACTION=$1}
|
||||
+
|
||||
+#######################################################################
|
||||
+
|
||||
+meta_data() {
|
||||
+ cat <<END
|
||||
+<?xml version="1.0"?>
|
||||
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
||||
+<resource-agent name="nova-compute-wait" version="1.0">
|
||||
+<version>1.0</version>
|
||||
+
|
||||
+<longdesc lang="en">
|
||||
+OpenStack Nova Compute Server.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">OpenStack Nova Compute Server</shortdesc>
|
||||
+
|
||||
+<parameters>
|
||||
+
|
||||
+<parameter name="auth_url" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="username" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="password" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="tenant_name" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="domain" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">DNS domain</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="endpoint_type" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="no_shared_storage" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Deprecated option not in use
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Deprecated</shortdesc>
|
||||
+<content type="boolean" default="0" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="evacuation_delay" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+How long to wait for nova to finish evacuating instances elsewhere
|
||||
+before starting nova-compute. Only used when the agent detects
|
||||
+evacuations might be in progress.
|
||||
+
|
||||
+You may need to increase the start timeout when increasing this value.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Delay to allow evacuations time to complete</shortdesc>
|
||||
+<content type="integer" default="120" />
|
||||
+</parameter>
|
||||
+
|
||||
+</parameters>
|
||||
+
|
||||
+<actions>
|
||||
+<action name="start" timeout="600" />
|
||||
+<action name="stop" timeout="300" />
|
||||
+<action name="monitor" timeout="20" interval="10" depth="0"/>
|
||||
+<action name="validate-all" timeout="20" />
|
||||
+<action name="meta-data" timeout="5" />
|
||||
+</actions>
|
||||
+</resource-agent>
|
||||
+END
|
||||
+}
|
||||
+
|
||||
+#######################################################################
|
||||
+
|
||||
+# don't exit on TERM, to test that lrmd makes sure that we do exit
|
||||
+trap sigterm_handler TERM
|
||||
+sigterm_handler() {
|
||||
+ ocf_log info "They use TERM to bring us down. No such luck."
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+nova_usage() {
|
||||
+ cat <<END
|
||||
+usage: $0 {start|stop|monitor|validate-all|meta-data}
|
||||
+
|
||||
+Expects to have a fully populated OCF RA-compliant environment set.
|
||||
+END
|
||||
+}
|
||||
+
|
||||
+nova_start() {
|
||||
+ build_unfence_overlay
|
||||
+
|
||||
+ state=$(attrd_updater -p -n evacuate -N ${NOVA_HOST} | sed -e 's/.*value=//' | tr -d '"' )
|
||||
+ if [ "x$state" = x ]; then
|
||||
+ : never been fenced
|
||||
+
|
||||
+ elif [ "x$state" = xno ]; then
|
||||
+ : has been evacuated, however it could have been 1s ago
|
||||
+ ocf_log info "Pausing to give evacuations from ${NOVA_HOST} time to complete"
|
||||
+ sleep ${OCF_RESKEY_evacuation_delay}
|
||||
+
|
||||
+ else
|
||||
+ while [ "x$state" != "xno" ]; do
|
||||
+ ocf_log info "Waiting for pending evacuations from ${NOVA_HOST}"
|
||||
+ state=$(attrd_updater -p -n evacuate -N ${NOVA_HOST} | sed -e 's/.*value=//' | tr -d '"' )
|
||||
+ sleep 5
|
||||
+ done
|
||||
+
|
||||
+ ocf_log info "Pausing to give evacuations from ${NOVA_HOST} time to complete"
|
||||
+ sleep ${OCF_RESKEY_evacuation_delay}
|
||||
+ fi
|
||||
+
|
||||
+ touch "$statefile"
|
||||
+
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+nova_stop() {
|
||||
+ rm -f "$statefile"
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+nova_monitor() {
|
||||
+ if [ ! -f "$statefile" ]; then
|
||||
+ return $OCF_NOT_RUNNING
|
||||
+ fi
|
||||
+
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+nova_notify() {
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+build_unfence_overlay() {
|
||||
+ fence_options=""
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_auth_url}" ]; then
|
||||
+ candidates=$(/usr/sbin/stonith_admin -l ${NOVA_HOST})
|
||||
+ for candidate in ${candidates}; do
|
||||
+ pcs stonith show $d | grep -q fence_compute
|
||||
+ if [ $? = 0 ]; then
|
||||
+ ocf_log info "Unfencing nova based on: $candidate"
|
||||
+ fence_auth=$(pcs stonith show $candidate | grep Attributes: | sed -e s/Attributes:// -e s/-/_/g -e 's/[^ ]\+=/OCF_RESKEY_\0/g' -e s/passwd/password/g)
|
||||
+ eval "export $fence_auth"
|
||||
+ break
|
||||
+ fi
|
||||
+ done
|
||||
+ fi
|
||||
+
|
||||
+ # Copied from NovaEvacuate
|
||||
+ if [ -z "${OCF_RESKEY_auth_url}" ]; then
|
||||
+ ocf_exit_reason "auth_url not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -k ${OCF_RESKEY_auth_url}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_username}" ]; then
|
||||
+ ocf_exit_reason "username not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -l ${OCF_RESKEY_username}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_password}" ]; then
|
||||
+ ocf_exit_reason "password not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -p ${OCF_RESKEY_password}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_tenant_name}" ]; then
|
||||
+ ocf_exit_reason "tenant_name not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -t ${OCF_RESKEY_tenant_name}"
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_domain}" ]; then
|
||||
+ fence_options="${fence_options} -d ${OCF_RESKEY_domain}"
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_region_name}" ]; then
|
||||
+ fence_options="${fence_options} \
|
||||
+ --region-name ${OCF_RESKEY_region_name}"
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_insecure}" ]; then
|
||||
+ if ocf_is_true "${OCF_RESKEY_insecure}"; then
|
||||
+ fence_options="${fence_options} --insecure"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_no_shared_storage}" ]; then
|
||||
+ if ocf_is_true "${OCF_RESKEY_no_shared_storage}"; then
|
||||
+ fence_options="${fence_options} --no-shared-storage"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_endpoint_type}" ]; then
|
||||
+ case ${OCF_RESKEY_endpoint_type} in
|
||||
+ adminURL|publicURL|internalURL)
|
||||
+ ;;
|
||||
+ *)
|
||||
+ ocf_exit_reason "endpoint_type ${OCF_RESKEY_endpoint_type}" \
|
||||
+ "not valid. Use adminURL or publicURL or internalURL"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ ;;
|
||||
+ esac
|
||||
+ fence_options="${fence_options} -e ${OCF_RESKEY_endpoint_type}"
|
||||
+ fi
|
||||
+
|
||||
+ mkdir -p /run/systemd/system/openstack-nova-compute.service.d
|
||||
+ cat<<EOF>/run/systemd/system/openstack-nova-compute.service.d/unfence-20.conf
|
||||
+[Service]
|
||||
+ExecStartPost=/sbin/fence_compute ${fence_options} -o on -n ${NOVA_HOST}
|
||||
+EOF
|
||||
+}
|
||||
+
|
||||
+nova_validate() {
|
||||
+ rc=$OCF_SUCCESS
|
||||
+
|
||||
+ check_binary crudini
|
||||
+ check_binary nova-compute
|
||||
+ check_binary fence_compute
|
||||
+
|
||||
+ if [ ! -f /etc/nova/nova.conf ]; then
|
||||
+ ocf_exit_reason "/etc/nova/nova.conf not found"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ # Is the state directory writable?
|
||||
+ state_dir=$(dirname $statefile)
|
||||
+ touch "$state_dir/$$"
|
||||
+ if [ $? != 0 ]; then
|
||||
+ ocf_exit_reason "Invalid state directory: $state_dir"
|
||||
+ return $OCF_ERR_ARGS
|
||||
+ fi
|
||||
+ rm -f "$state_dir/$$"
|
||||
+
|
||||
+ NOVA_HOST=$(crudini --get /etc/nova/nova.conf DEFAULT host 2>/dev/null)
|
||||
+ if [ $? = 1 ]; then
|
||||
+ short_host=$(uname -n | awk -F. '{print $1}')
|
||||
+ if [ "x${OCF_RESKEY_domain}" != x ]; then
|
||||
+ NOVA_HOST=${short_host}.${OCF_RESKEY_domain}
|
||||
+ else
|
||||
+ NOVA_HOST=$(uname -n)
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ $rc != $OCF_SUCCESS ]; then
|
||||
+ exit $rc
|
||||
+ fi
|
||||
+ return $rc
|
||||
+}
|
||||
+
|
||||
+statefile="${HA_RSCTMP}/${OCF_RESOURCE_INSTANCE}.active"
|
||||
+
|
||||
+: ${OCF_RESKEY_evacuation_delay=120}
|
||||
+case $__OCF_ACTION in
|
||||
+meta-data) meta_data
|
||||
+ exit $OCF_SUCCESS
|
||||
+ ;;
|
||||
+usage|help) nova_usage
|
||||
+ exit $OCF_SUCCESS
|
||||
+ ;;
|
||||
+esac
|
||||
+
|
||||
+case $__OCF_ACTION in
|
||||
+start) nova_validate; nova_start;;
|
||||
+stop) nova_stop;;
|
||||
+monitor) nova_validate; nova_monitor;;
|
||||
+notify) nova_notify;;
|
||||
+validate-all) exit $OCF_SUCCESS;;
|
||||
+*) nova_usage
|
||||
+ exit $OCF_ERR_UNIMPLEMENTED
|
||||
+ ;;
|
||||
+esac
|
||||
+rc=$?
|
||||
+ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
|
||||
+exit $rc
|
||||
+
|
||||
diff --color -uNr a/heartbeat/NovaEvacuate b/heartbeat/NovaEvacuate
|
||||
--- a/heartbeat/NovaEvacuate 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/heartbeat/NovaEvacuate 2021-08-25 09:50:23.780670326 +0200
|
||||
@@ -0,0 +1,400 @@
|
||||
+#!/bin/bash
|
||||
+#
|
||||
+# Copyright 2015 Red Hat, Inc.
|
||||
+#
|
||||
+# Description: Manages evacuation of nodes running nova-compute
|
||||
+#
|
||||
+# Authors: Andrew Beekhof
|
||||
+#
|
||||
+# Support: openstack@lists.openstack.org
|
||||
+# License: Apache Software License (ASL) 2.0
|
||||
+#
|
||||
+
|
||||
+
|
||||
+#######################################################################
|
||||
+# Initialization:
|
||||
+
|
||||
+###
|
||||
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
|
||||
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
|
||||
+###
|
||||
+
|
||||
+: ${__OCF_ACTION=$1}
|
||||
+
|
||||
+#######################################################################
|
||||
+
|
||||
+meta_data() {
|
||||
+ cat <<END
|
||||
+<?xml version="1.0"?>
|
||||
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
||||
+<resource-agent name="NovaEvacuate" version="1.0">
|
||||
+<version>1.0</version>
|
||||
+
|
||||
+<longdesc lang="en">
|
||||
+Facility for tacking a list of compute nodes and reliably evacuating the ones that fence_evacuate has flagged.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Evacuator for OpenStack Nova Compute Server</shortdesc>
|
||||
+
|
||||
+<parameters>
|
||||
+
|
||||
+<parameter name="auth_url" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Authorization URL for connecting to keystone in admin context
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Authorization URL</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="username" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Username for connecting to keystone in admin context
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Username</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="password" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Password for connecting to keystone in admin context
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Password</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="tenant_name" unique="0" required="1">
|
||||
+<longdesc lang="en">
|
||||
+Tenant name for connecting to keystone in admin context.
|
||||
+Note that with Keystone V3 tenant names are only unique within a domain.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Tenant name</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="domain" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">DNS domain</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="endpoint_type" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Nova API location (internal, public or admin URL)
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Nova API location (internal, public or admin URL)</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="region_name" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Region name for connecting to nova.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Region name</shortdesc>
|
||||
+<content type="string" default="" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="insecure" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Explicitly allow client to perform "insecure" TLS (https) requests.
|
||||
+The server's certificate will not be verified against any certificate authorities.
|
||||
+This option should be used with caution.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Allow insecure TLS requests</shortdesc>
|
||||
+<content type="boolean" default="0" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="no_shared_storage" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Indicate that nova storage for instances is not shared across compute
|
||||
+nodes. This must match the reality of how nova storage is configured!
|
||||
+Otherwise VMs could end up in error state upon evacuation. When
|
||||
+storage is non-shared, instances on dead hypervisors will be rebuilt
|
||||
+from their original image or volume, so anything on ephemeral storage
|
||||
+will be lost.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Disable shared storage recovery for instances</shortdesc>
|
||||
+<content type="boolean" default="0" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="verbose" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Enable extra logging from the evacuation process
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Enable debug logging</shortdesc>
|
||||
+<content type="boolean" default="0" />
|
||||
+</parameter>
|
||||
+
|
||||
+<parameter name="evacuate_delay" unique="0" required="0">
|
||||
+<longdesc lang="en">
|
||||
+Allows delaying the nova evacuate API call, e.g. to give a storage array time to clean
|
||||
+up eventual locks/leases.
|
||||
+</longdesc>
|
||||
+<shortdesc lang="en">Nova evacuate delay</shortdesc>
|
||||
+<content type="integer" default="0" />
|
||||
+</parameter>
|
||||
+
|
||||
+</parameters>
|
||||
+
|
||||
+<actions>
|
||||
+<action name="start" timeout="20" />
|
||||
+<action name="stop" timeout="20" />
|
||||
+<action name="monitor" timeout="600" interval="10" depth="0"/>
|
||||
+<action name="validate-all" timeout="20" />
|
||||
+<action name="meta-data" timeout="5" />
|
||||
+</actions>
|
||||
+</resource-agent>
|
||||
+END
|
||||
+}
|
||||
+
|
||||
+#######################################################################
|
||||
+
|
||||
+# don't exit on TERM, to test that lrmd makes sure that we do exit
|
||||
+trap sigterm_handler TERM
|
||||
+sigterm_handler() {
|
||||
+ ocf_log info "They use TERM to bring us down. No such luck."
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+evacuate_usage() {
|
||||
+ cat <<END
|
||||
+usage: $0 {start|stop|monitor|validate-all|meta-data}
|
||||
+
|
||||
+Expects to have a fully populated OCF RA-compliant environment set.
|
||||
+END
|
||||
+}
|
||||
+
|
||||
+evacuate_stop() {
|
||||
+ rm -f "$statefile"
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+evacuate_start() {
|
||||
+ touch "$statefile"
|
||||
+ # Do not invole monitor here so that the start timeout can be low
|
||||
+ return $?
|
||||
+}
|
||||
+
|
||||
+update_evacuation() {
|
||||
+ attrd_updater -p -n evacuate -Q -N ${1} -U ${2}
|
||||
+ arc=$?
|
||||
+ if [ ${arc} != 0 ]; then
|
||||
+ ocf_log warn "Can not set evacuation state of ${1} to ${2}: ${arc}"
|
||||
+ fi
|
||||
+ return ${arc}
|
||||
+}
|
||||
+
|
||||
+handle_evacuations() {
|
||||
+ while [ $# -gt 0 ]; do
|
||||
+ node=$1
|
||||
+ state=$2
|
||||
+ shift; shift;
|
||||
+ need_evacuate=0
|
||||
+
|
||||
+ case $state in
|
||||
+ "")
|
||||
+ ;;
|
||||
+ no)
|
||||
+ ocf_log debug "$node is either fine or already handled"
|
||||
+ ;;
|
||||
+ yes) need_evacuate=1
|
||||
+ ;;
|
||||
+ *@*)
|
||||
+ where=$(echo $state | awk -F@ '{print $1}')
|
||||
+ when=$(echo $state | awk -F@ '{print $2}')
|
||||
+ now=$(date +%s)
|
||||
+
|
||||
+ if [ $(($now - $when)) -gt 60 ]; then
|
||||
+ ocf_log info "Processing partial evacuation of $node by" \
|
||||
+ "$where at $when"
|
||||
+ need_evacuate=1
|
||||
+ else
|
||||
+ # Give some time for any in-flight evacuations to either
|
||||
+ # complete or fail Nova won't react well if there are two
|
||||
+ # overlapping requests
|
||||
+ ocf_log info "Deferring processing partial evacuation of" \
|
||||
+ "$node by $where at $when"
|
||||
+ fi
|
||||
+ ;;
|
||||
+ esac
|
||||
+
|
||||
+ if [ $need_evacuate = 1 ]; then
|
||||
+ fence_agent="fence_compute"
|
||||
+
|
||||
+ if have_binary fence_evacuate; then
|
||||
+ fence_agent="fence_evacuate"
|
||||
+ fi
|
||||
+
|
||||
+ if [ ${OCF_RESKEY_evacuate_delay} != 0 ]; then
|
||||
+ ocf_log info "Delaying nova evacuate by $OCF_RESKEY_evacuate_delay seconds"
|
||||
+ sleep ${OCF_RESKEY_evacuate_delay}
|
||||
+ fi
|
||||
+
|
||||
+ ocf_log notice "Initiating evacuation of $node with $fence_agent"
|
||||
+ $fence_agent ${fence_options} -o status -n ${node}
|
||||
+ if [ $? = 1 ]; then
|
||||
+ ocf_log info "Nova does not know about ${node}"
|
||||
+ # Dont mark as no because perhaps nova is unavailable right now
|
||||
+ continue
|
||||
+ fi
|
||||
+
|
||||
+ update_evacuation ${node} "$(uname -n)@$(date +%s)"
|
||||
+ if [ $? != 0 ]; then
|
||||
+ return $OCF_SUCCESS
|
||||
+ fi
|
||||
+
|
||||
+ $fence_agent ${fence_options} -o off -n $node
|
||||
+ rc=$?
|
||||
+
|
||||
+ if [ $rc = 0 ]; then
|
||||
+ update_evacuation ${node} no
|
||||
+ ocf_log notice "Completed evacuation of $node"
|
||||
+ else
|
||||
+ ocf_log warn "Evacuation of $node failed: $rc"
|
||||
+ update_evacuation ${node} yes
|
||||
+ fi
|
||||
+ fi
|
||||
+ done
|
||||
+
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+evacuate_monitor() {
|
||||
+ if [ ! -f "$statefile" ]; then
|
||||
+ return $OCF_NOT_RUNNING
|
||||
+ fi
|
||||
+
|
||||
+ handle_evacuations $(
|
||||
+ attrd_updater -n evacuate -A \
|
||||
+ 2> >(grep -v "attribute does not exist" 1>&2) |
|
||||
+ sed 's/ value=""/ value="no"/' |
|
||||
+ tr '="' ' ' |
|
||||
+ awk '{print $4" "$6}'
|
||||
+ )
|
||||
+ return $OCF_SUCCESS
|
||||
+}
|
||||
+
|
||||
+evacuate_validate() {
|
||||
+ rc=$OCF_SUCCESS
|
||||
+ fence_options=""
|
||||
+
|
||||
+ if ! have_binary fence_evacuate; then
|
||||
+ check_binary fence_compute
|
||||
+ fi
|
||||
+
|
||||
+ # Is the state directory writable?
|
||||
+ state_dir=$(dirname $statefile)
|
||||
+ touch "$state_dir/$$"
|
||||
+ if [ $? != 0 ]; then
|
||||
+ ocf_exit_reason "Invalid state directory: $state_dir"
|
||||
+ return $OCF_ERR_ARGS
|
||||
+ fi
|
||||
+ rm -f "$state_dir/$$"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_auth_url}" ]; then
|
||||
+ ocf_exit_reason "auth_url not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -k ${OCF_RESKEY_auth_url}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_username}" ]; then
|
||||
+ ocf_exit_reason "username not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -l ${OCF_RESKEY_username}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_password}" ]; then
|
||||
+ ocf_exit_reason "password not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -p ${OCF_RESKEY_password}"
|
||||
+
|
||||
+ if [ -z "${OCF_RESKEY_tenant_name}" ]; then
|
||||
+ ocf_exit_reason "tenant_name not configured"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ fi
|
||||
+
|
||||
+ fence_options="${fence_options} -t ${OCF_RESKEY_tenant_name}"
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_domain}" ]; then
|
||||
+ fence_options="${fence_options} -d ${OCF_RESKEY_domain}"
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_region_name}" ]; then
|
||||
+ fence_options="${fence_options} \
|
||||
+ --region-name ${OCF_RESKEY_region_name}"
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_insecure}" ]; then
|
||||
+ if ocf_is_true "${OCF_RESKEY_insecure}"; then
|
||||
+ fence_options="${fence_options} --insecure"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_no_shared_storage}" ]; then
|
||||
+ if ocf_is_true "${OCF_RESKEY_no_shared_storage}"; then
|
||||
+ fence_options="${fence_options} --no-shared-storage"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_verbose}" ]; then
|
||||
+ if ocf_is_true "${OCF_RESKEY_verbose}"; then
|
||||
+ fence_options="${fence_options} --verbose"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ -n "${OCF_RESKEY_endpoint_type}" ]; then
|
||||
+ case ${OCF_RESKEY_endpoint_type} in
|
||||
+ adminURL|publicURL|internalURL)
|
||||
+ ;;
|
||||
+ *)
|
||||
+ ocf_exit_reason "endpoint_type ${OCF_RESKEY_endpoint_type}" \
|
||||
+ "not valid. Use adminURL or publicURL or internalURL"
|
||||
+ exit $OCF_ERR_CONFIGURED
|
||||
+ ;;
|
||||
+ esac
|
||||
+ fence_options="${fence_options} -e ${OCF_RESKEY_endpoint_type}"
|
||||
+ fi
|
||||
+
|
||||
+ if [ $rc != $OCF_SUCCESS ]; then
|
||||
+ exit $rc
|
||||
+ fi
|
||||
+ return $rc
|
||||
+}
|
||||
+
|
||||
+statefile="${HA_RSCTMP}/${OCF_RESOURCE_INSTANCE}.active"
|
||||
+
|
||||
+case $__OCF_ACTION in
|
||||
+ start)
|
||||
+ evacuate_validate
|
||||
+ evacuate_start
|
||||
+ ;;
|
||||
+ stop)
|
||||
+ evacuate_stop
|
||||
+ ;;
|
||||
+ monitor)
|
||||
+ evacuate_validate
|
||||
+ evacuate_monitor
|
||||
+ ;;
|
||||
+ meta-data)
|
||||
+ meta_data
|
||||
+ exit $OCF_SUCCESS
|
||||
+ ;;
|
||||
+ usage|help)
|
||||
+ evacuate_usage
|
||||
+ exit $OCF_SUCCESS
|
||||
+ ;;
|
||||
+ validate-all)
|
||||
+ exit $OCF_SUCCESS
|
||||
+ ;;
|
||||
+ *)
|
||||
+ evacuate_usage
|
||||
+ exit $OCF_ERR_UNIMPLEMENTED
|
||||
+ ;;
|
||||
+esac
|
||||
+rc=$?
|
||||
+ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
|
||||
+exit $rc
|
1132
SPECS/resource-agents.spec
Normal file
1132
SPECS/resource-agents.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user