diff --git a/.gitignore b/.gitignore
index f79624a..9640a61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,6 @@ 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-241.0.0-linux-x86_64.tar.gz
+SOURCES/httplib2-0.18.1.tar.gz
SOURCES/pycryptodome-3.6.4.tar.gz
SOURCES/pyroute2-0.4.13.tar.gz
diff --git a/.resource-agents.metadata b/.resource-agents.metadata
index e21f8a9..546b20f 100644
--- a/.resource-agents.metadata
+++ b/.resource-agents.metadata
@@ -5,5 +5,6 @@ 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
876e2b0c0e3031c6e6101745acd08e4e9f53d6a9 SOURCES/google-cloud-sdk-241.0.0-linux-x86_64.tar.gz
+c5d22ce6660999633154927684eb9b799123e569 SOURCES/httplib2-0.18.1.tar.gz
326a73f58a62ebee00c11a12cfdd838b196e0e8e SOURCES/pycryptodome-3.6.4.tar.gz
147149db11104c06d405fd077dcd2aa1c345f109 SOURCES/pyroute2-0.4.13.tar.gz
diff --git a/SOURCES/7-gcp-bundled.patch b/SOURCES/7-gcp-bundled.patch
index b341dac..b1b8a50 100644
--- a/SOURCES/7-gcp-bundled.patch
+++ b/SOURCES/7-gcp-bundled.patch
@@ -10,14 +10,26 @@ 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-vip.in b/heartbeat/gcp-vpc-move-vip.in
+--- a/heartbeat/gcp-vpc-move-vip.in 2020-06-25 13:21:42.090334894 +0200
++++ b/heartbeat/gcp-vpc-move-vip.in 2020-06-25 13:14:16.668092817 +0200
+@@ -28,6 +28,7 @@
+ from ocf import *
+
+ try:
++ sys.path.insert(0, '/usr/lib/resource-agents/bundled/gcp/google-cloud-sdk/lib/third_party')
+ import googleapiclient.discovery
+ except ImportError:
+ pass
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
-@@ -45,6 +45,7 @@
+--- a/heartbeat/gcp-vpc-move-route.in 2020-06-25 13:22:03.216301380 +0200
++++ b/heartbeat/gcp-vpc-move-route.in 2020-06-25 13:13:19.864183380 +0200
+@@ -45,6 +45,8 @@
from ocf import *
try:
+ sys.path.insert(0, '/usr/lib/resource-agents/bundled/gcp')
++ sys.path.insert(0, '/usr/lib/resource-agents/bundled/gcp/google-cloud-sdk/lib/third_party')
import googleapiclient.discovery
import pyroute2
except ImportError:
diff --git a/SOURCES/aliyun-vpc-move-ip-4-bundled.patch b/SOURCES/aliyun-vpc-move-ip-4-bundled.patch
index b52e7c8..29a92b9 100644
--- a/SOURCES/aliyun-vpc-move-ip-4-bundled.patch
+++ b/SOURCES/aliyun-vpc-move-ip-4-bundled.patch
@@ -1,62 +1,15 @@
-diff -uNr a/heartbeat/aliyun-vpc-move-ip b/heartbeat/aliyun-vpc-move-ip
---- a/heartbeat/aliyun-vpc-move-ip 2018-08-03 15:21:34.869664678 +0200
-+++ b/heartbeat/aliyun-vpc-move-ip 2018-08-03 15:22:48.632185198 +0200
-@@ -36,13 +36,13 @@
- ip_drop
- fi
-
-- cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
-+ cmd="aliyuncli-ra vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
- ocf_log debug "executing command: $cmd"
- $cmd
- rc=$?
- while [ $rc -ne 0 ]; do
- sleep 1
-- cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
-+ cmd="aliyuncli-ra vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
- ocf_log debug "executing command: $cmd"
- $cmd
- rc=$?
-@@ -75,7 +75,7 @@
- return $OCF_ERR_GENERIC
- fi
-
-- cmd="aliyuncli vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE --output text"
-+ cmd="aliyuncli-ra vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE --output text"
- ocf_log debug "executing command: $cmd"
- $cmd
- if [ $? -ne 0 ]; then
-@@ -90,13 +90,13 @@
- }
-
- wait_for_started() {
-- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
-+ cmd="aliyuncli-ra vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
- ocf_log debug "executing command: $cmd"
- ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
-
- while [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; do
- sleep 3
-- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
-+ cmd="aliyuncli-ra vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
- ocf_log debug "executing command: $cmd"
- ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
- done
-@@ -107,7 +107,7 @@
-
- while [ ! -z "$ROUTE_TO_INSTANCE" ]; do
- sleep 1
-- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
-+ cmd="aliyuncli-ra vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
- ocf_log debug "executing command: $cmd"
- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
- done
-@@ -248,7 +248,7 @@
-
- ecs_ip_monitor() {
- ocf_log debug "function: ecsip_monitor: check routing table"
-- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
-+ cmd="aliyuncli-ra vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
- ocf_log debug "executing command: $cmd"
-
- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
+--- a/heartbeat/aliyun-vpc-move-ip 2020-06-09 13:45:38.432860930 +0200
++++ b/heartbeat/aliyun-vpc-move-ip 2020-06-09 13:51:06.341211557 +0200
+@@ -35,10 +35,10 @@
+ USAGE="usage: $0 {start|stop|status|meta-data}";
+
+ if [ "${OCF_RESKEY_aliyuncli}" = "detect" ]; then
+- OCF_RESKEY_aliyuncli="$(which aliyuncli 2> /dev/null || which aliyun 2> /dev/null)"
++ OCF_RESKEY_aliyuncli="$(which aliyuncli-ra 2> /dev/null || which aliyuncli 2> /dev/null || which aliyun 2> /dev/null)"
+ fi
+
+-if [[ "${OCF_RESKEY_aliyuncli##*/}" == 'aliyuncli' ]]; then
++if [[ "${OCF_RESKEY_aliyuncli##*/}" == 'aliyuncli-ra' ]] || [[ "${OCF_RESKEY_aliyuncli##*/}" == 'aliyuncli' ]]; then
+ OUTPUT="text"
+ EXECUTING='{ print $3 }'
+ IFS_=" "
diff --git a/SOURCES/bz1814896-Filesystem-fast_stop-default-to-no-for-GFS2.patch b/SOURCES/bz1814896-Filesystem-fast_stop-default-to-no-for-GFS2.patch
new file mode 100644
index 0000000..b0e8230
--- /dev/null
+++ b/SOURCES/bz1814896-Filesystem-fast_stop-default-to-no-for-GFS2.patch
@@ -0,0 +1,46 @@
+--- a/heartbeat/Filesystem 2020-06-11 15:49:54.111316780 +0200
++++ b/heartbeat/Filesystem 2020-06-11 15:53:53.423821158 +0200
+@@ -60,6 +60,21 @@
+ # Defaults
+ DFLT_STATUSDIR=".Filesystem_status/"
+
++# Parameter defaults
++
++OCF_RESKEY_fstype_default=""
++OCF_RESKEY_fast_stop_default="yes"
++
++: ${OCF_RESKEY_fstype=${OCF_RESKEY_fstype_default}}
++if [ -z "${OCF_RESKEY_fast_stop}" ]; then
++ case "$OCF_RESKEY_fstype" in
++ gfs2)
++ OCF_RESKEY_fast_stop="no";;
++ *)
++ OCF_RESKEY_fast_stop=${OCF_RESKEY_fast_stop_default};;
++ esac
++fi
++
+ # Variables used by multiple methods
+ HOSTOS=`uname`
+
+@@ -135,7 +150,7 @@
+ The type of filesystem to be mounted.
+
+ filesystem type
+-
++
+
+
+
+@@ -178,9 +193,11 @@
+ users easily and want to prevent the stop action from failing,
+ then set this parameter to "no" and add an appropriate timeout
+ for the stop operation.
++
++This defaults to "no" for GFS2 filesystems.
+
+ fast stop
+-
++
+
+
+
diff --git a/SOURCES/bz1820523-exportfs-1-add-symlink-support.patch b/SOURCES/bz1820523-exportfs-1-add-symlink-support.patch
new file mode 100644
index 0000000..b5c1d96
--- /dev/null
+++ b/SOURCES/bz1820523-exportfs-1-add-symlink-support.patch
@@ -0,0 +1,51 @@
+From 091a6d1f26140651b7314cfb618c80f9258fd1d4 Mon Sep 17 00:00:00 2001
+From: Oyvind Albrigtsen
+Date: Tue, 5 May 2020 14:20:43 +0200
+Subject: [PATCH] exportfs: add symlink support
+
+based on implementation in Filesystem agent
+---
+ heartbeat/exportfs | 30 ++++++++++++++++++++++--------
+ 1 file changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/heartbeat/exportfs b/heartbeat/exportfs
+index 1cabdee70..294d7eec9 100755
+--- a/heartbeat/exportfs
++++ b/heartbeat/exportfs
+@@ -450,14 +450,28 @@ exportfs_validate_all ()
+ fi
+ }
+
+-# If someone puts a trailing slash at the end of the export directory,
+-# this agent is going to fail in some unexpected ways due to how
+-# export strings are matched. The simplest solution here is to strip off
+-# a trailing '/' in the directory before processing anything.
+-newdir=$(echo "$OCF_RESKEY_directory" | sed -n -e 's/^\(.*\)\/$/\1/p')
+-if [ -n "$newdir" ]; then
+- OCF_RESKEY_directory=$newdir
+-fi
++for dir in $OCF_RESKEY_directory; do
++ # strip off trailing '/' from directory
++ dir=$(echo $dir | sed 's/\/*$//')
++ : ${dir:=/}
++ if [ -e "$dir" ] ; then
++ canonicalized_dir=$(readlink -f "$dir")
++ if [ $? -ne 0 ]; then
++ if [ "$__OCF_ACTION" != "stop" ]; then
++ ocf_exit_reason "Could not canonicalize $dir because readlink failed"
++ exit $OCF_ERR_GENERIC
++ fi
++ fi
++ else
++ if [ "$__OCF_ACTION" != "stop" ]; then
++ ocf_exit_reason "$dir does not exist"
++ exit $OCF_ERR_CONFIGURED
++ fi
++ fi
++ directories+="$canonicalized_dir "
++done
++
++OCF_RESKEY_directory="${directories%% }"
+
+ NUMDIRS=`echo "$OCF_RESKEY_directory" | wc -w`
+ OCF_REQUIRED_PARAMS="directory fsid clientspec"
diff --git a/SOURCES/bz1820523-exportfs-2-fix-monitor-action.patch b/SOURCES/bz1820523-exportfs-2-fix-monitor-action.patch
new file mode 100644
index 0000000..ec1dff4
--- /dev/null
+++ b/SOURCES/bz1820523-exportfs-2-fix-monitor-action.patch
@@ -0,0 +1,35 @@
+From fda12d3d6495e33e049ed3ac03d6bfb4d65aac3d Mon Sep 17 00:00:00 2001
+From: Oyvind Albrigtsen
+Date: Tue, 9 Jun 2020 10:27:13 +0200
+Subject: [PATCH] exportfs: fix monitor-action in symlink-logic for when
+ directory doesnt exist
+
+---
+ heartbeat/exportfs | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/heartbeat/exportfs b/heartbeat/exportfs
+index 294d7eec9..d7d3463d9 100755
+--- a/heartbeat/exportfs
++++ b/heartbeat/exportfs
+@@ -463,10 +463,16 @@ for dir in $OCF_RESKEY_directory; do
+ fi
+ fi
+ else
+- if [ "$__OCF_ACTION" != "stop" ]; then
+- ocf_exit_reason "$dir does not exist"
+- exit $OCF_ERR_CONFIGURED
+- fi
++ case "$__OCF_ACTION" in
++ stop|monitor)
++ canonicalized_dir="$dir"
++ ocf_log debug "$dir does not exist"
++ ;;
++ *)
++ ocf_exit_reason "$dir does not exist"
++ exit $OCF_ERR_CONFIGURED
++ ;;
++ esac
+ fi
+ directories+="$canonicalized_dir "
+ done
diff --git a/SOURCES/bz1820523-exportfs-add-symlink-support.patch b/SOURCES/bz1820523-exportfs-add-symlink-support.patch
deleted file mode 100644
index b5c1d96..0000000
--- a/SOURCES/bz1820523-exportfs-add-symlink-support.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 091a6d1f26140651b7314cfb618c80f9258fd1d4 Mon Sep 17 00:00:00 2001
-From: Oyvind Albrigtsen
-Date: Tue, 5 May 2020 14:20:43 +0200
-Subject: [PATCH] exportfs: add symlink support
-
-based on implementation in Filesystem agent
----
- heartbeat/exportfs | 30 ++++++++++++++++++++++--------
- 1 file changed, 22 insertions(+), 8 deletions(-)
-
-diff --git a/heartbeat/exportfs b/heartbeat/exportfs
-index 1cabdee70..294d7eec9 100755
---- a/heartbeat/exportfs
-+++ b/heartbeat/exportfs
-@@ -450,14 +450,28 @@ exportfs_validate_all ()
- fi
- }
-
--# If someone puts a trailing slash at the end of the export directory,
--# this agent is going to fail in some unexpected ways due to how
--# export strings are matched. The simplest solution here is to strip off
--# a trailing '/' in the directory before processing anything.
--newdir=$(echo "$OCF_RESKEY_directory" | sed -n -e 's/^\(.*\)\/$/\1/p')
--if [ -n "$newdir" ]; then
-- OCF_RESKEY_directory=$newdir
--fi
-+for dir in $OCF_RESKEY_directory; do
-+ # strip off trailing '/' from directory
-+ dir=$(echo $dir | sed 's/\/*$//')
-+ : ${dir:=/}
-+ if [ -e "$dir" ] ; then
-+ canonicalized_dir=$(readlink -f "$dir")
-+ if [ $? -ne 0 ]; then
-+ if [ "$__OCF_ACTION" != "stop" ]; then
-+ ocf_exit_reason "Could not canonicalize $dir because readlink failed"
-+ exit $OCF_ERR_GENERIC
-+ fi
-+ fi
-+ else
-+ if [ "$__OCF_ACTION" != "stop" ]; then
-+ ocf_exit_reason "$dir does not exist"
-+ exit $OCF_ERR_CONFIGURED
-+ fi
-+ fi
-+ directories+="$canonicalized_dir "
-+done
-+
-+OCF_RESKEY_directory="${directories%% }"
-
- NUMDIRS=`echo "$OCF_RESKEY_directory" | wc -w`
- OCF_REQUIRED_PARAMS="directory fsid clientspec"
diff --git a/SOURCES/bz1836186-pgsql-support-Pacemaker-v2.03-output.patch b/SOURCES/bz1836186-pgsql-support-Pacemaker-v2.03-output.patch
new file mode 100644
index 0000000..b0d7ade
--- /dev/null
+++ b/SOURCES/bz1836186-pgsql-support-Pacemaker-v2.03-output.patch
@@ -0,0 +1,52 @@
+--- a/heartbeat/ocf-shellfuncs.in 2020-06-16 10:47:54.462276461 +0200
++++ b/heartbeat/ocf-shellfuncs.in 2020-06-16 10:43:36.880739016 +0200
+@@ -563,7 +563,7 @@
+ # (master/slave) resource. This is defined as a resource where the
+ # master-max meta attribute is present, and set to greater than zero.
+ ocf_is_ms() {
+- [ ! -z "${OCF_RESKEY_CRM_meta_master_max}" ] && [ "${OCF_RESKEY_CRM_meta_master_max}" -gt 0 ]
++ [ "${OCF_RESKEY_CRM_meta_promotable}" = "true" ] || { [ ! -z "${OCF_RESKEY_CRM_meta_master_max}" ] && [ "${OCF_RESKEY_CRM_meta_master_max}" -gt 0 ]; }
+ }
+
+ # version check functions
+--- a/heartbeat/pgsql 2020-06-16 10:47:54.474276441 +0200
++++ b/heartbeat/pgsql 2020-06-16 10:49:02.835159083 +0200
+@@ -1021,7 +1021,7 @@
+
+ # I can't get master node name from $OCF_RESKEY_CRM_meta_notify_master_uname on monitor,
+ # so I will get master node name using crm_mon -n
+- print_crm_mon | tr -d "\t" | tr -d " " | grep -q "^${RESOURCE_NAME}[(:].*[):].*Master"
++ print_crm_mon | grep -q -i -E "&1)
++ rc=$?
++ if [[ $rc -eq 0 ]]
++ then
++ ocf_log debug "result: $res; rc: $rc"
++ else
++ ocf_log err "result: $res; cmd: $cmd; rc: $rc"
++ fi
++ return $rc
++}
++
++request_delete_route_entry() {
++ cmd="${OCF_RESKEY_aliyuncli} vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE ${ENDPOINT}"
++ ocf_log debug "executing command: $cmd"
++ res=$($cmd)
++ rc=$?
++ if [[ $rc -eq 0 ]]
++ then
++ ocf_log debug "result: $res; rc: $rc"
++ else
++ ocf_log err "result: $res; cmd: $cmd; rc: $rc"
++ fi
++ return $rc
++}
+
++request_describe_route_tables() {
++ cmd="${OCF_RESKEY_aliyuncli} vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output ${OUTPUT} ${ENDPOINT}"
++ ocf_log debug "executing command: $cmd"
++ res=$($cmd)
++ rc=$?
++ if [[ $rc -eq 0 ]]
++ then
++ ROUTE_TO_INSTANCE=$(echo "$res" |grep "\s${OCF_RESKEY_address}/" | awk -F "${IFS_}" "${EXECUTING}")
++ ocf_log debug "ROUTE_TO_INSTANCE: $ROUTE_TO_INSTANCE"
++ else
++ ocf_log err "result: $res; cmd: $cmd; rc: $rc"
++ fi
++}
+
+ ip_get_and_configure() {
+ ocf_log debug "function: ip_get_and_configure"
+
+- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
+-
++ request_describe_route_tables
+ if [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then
+ if [ -n "$ROUTE_TO_INSTANCE" ]; then
+ ip_drop
+ fi
+-
+- cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
+- ocf_log debug "executing command: $cmd"
+- $cmd
++ request_create_route_entry
+ rc=$?
+ while [ $rc -ne 0 ]; do
+ sleep 1
+- cmd="aliyuncli vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance --output text"
+- ocf_log debug "executing command: $cmd"
+- $cmd
++ request_create_route_entry
+ rc=$?
+ done
+ wait_for_started
+@@ -68,17 +136,15 @@
+ ocf_log debug "function: ip_drop"
+ cmd="ip addr delete ${OCF_RESKEY_address}/32 dev $OCF_RESKEY_interface"
+ ocf_log debug "executing command: $cmd"
+- $cmd
++ res=$($cmd)
+ rc=$?
+ if [ $rc -ne 0 ] && [ $rc -ne 2 ]; then
+- ocf_log err "command failed, rc $rc"
++ ocf_log err "command failed, rc: $rc; cmd: $cmd; result: $res"
+ return $OCF_ERR_GENERIC
+ fi
+-
+- cmd="aliyuncli vpc DeleteRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ROUTE_TO_INSTANCE --output text"
+- ocf_log debug "executing command: $cmd"
+- $cmd
+- if [ $? -ne 0 ]; then
++ request_delete_route_entry
++ rc=$?
++ if [ $rc -ne 0 ]; then
+ ocf_log err "command failed, rc: $rc"
+ return $OCF_ERR_GENERIC
+ fi
+@@ -90,26 +156,18 @@
+ }
+
+ wait_for_started() {
+- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
+- ocf_log debug "executing command: $cmd"
+- ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
+-
++ request_describe_route_tables
+ while [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; do
+ sleep 3
+- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
+- ocf_log debug "executing command: $cmd"
+- ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_address | awk '{ print $3 }')"
++ request_describe_route_tables
+ done
+ }
+
+ wait_for_deleted() {
+- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
+-
++ request_describe_route_tables
+ while [ ! -z "$ROUTE_TO_INSTANCE" ]; do
+ sleep 1
+- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
+- ocf_log debug "executing command: $cmd"
+- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
++ request_describe_route_tables
+ done
+ }
+
+@@ -124,38 +182,58 @@
+ by changing an entry in an specific routing table
+
+ Move IP within a VPC of the Aliyun ECS
++
+
++
++
++Path to command line tools for Aliyun
++
++Path to Aliyun CLI tools
++
++
++
+
+
+ VPC private IP address
+
+ vpc ip
+-
++
+
++
+
+
+ Name of the routing table, where the route for the IP address should be changed, i.e. vtb-...
+
+ routing table name
+-
++
+
++
+
+
+ Name of the network interface, i.e. eth0
+
+ network interface name
+-
++
+
+-
++
++
+
+-Valid Aliyun CLI profile name (see 'aliyuncli-ra configure').
++An endpoint is the service entry of an Alibaba Cloud service, i.e. vpc.cn-beijing.aliyuncs.com
++
++service endpoint
++
++
+
+-See https://www.alibabacloud.com/help/doc-detail/43039.htm?spm=a2c63.p38356.b99.16.38a914abRZtOU3 for more information about aliyuncli-ra.
++
++
++Valid Aliyun CLI profile name (see 'aliyun cli configure').
++See https://www.alibabacloud.com/help/zh/product/29991.htm for more information about aliyun cli.
+
+ profile name
+-
++
+
+
++
+
+
+
+@@ -170,6 +248,11 @@
+ ecs_ip_validate() {
+ ocf_log debug "function: validate"
+
++ if [ -z "${OCF_RESKEY_aliyuncli}" ]; then
++ ocf_exit_reason "unable to detect aliyuncli binary"
++ exit $OCF_ERR_INSTALLED
++ fi
++
+ # IP address
+ if [ -z "$OCF_RESKEY_address" ]; then
+ ocf_log err "IP address parameter not set $OCF_RESKEY_ADDRESS!"
+@@ -250,10 +333,7 @@
+
+ ecs_ip_monitor() {
+ ocf_log debug "function: ecsip_monitor: check routing table"
+- cmd="aliyuncli vpc DescribeRouteTables --RouteTableId $OCF_RESKEY_routing_table --output text"
+- ocf_log debug "executing command: $cmd"
+-
+- ROUTE_TO_INSTANCE="$($cmd |grep $OCF_RESKEY_address | awk '{ print $3 }')"
++ request_describe_route_tables
+
+ if [ "$ECS_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then
+ ocf_log debug "not routed to this instance ($ECS_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE"
diff --git a/SOURCES/bz1845574-azure-events-handle-exceptions-in-urlopen.patch b/SOURCES/bz1845574-azure-events-handle-exceptions-in-urlopen.patch
new file mode 100644
index 0000000..fa194c9
--- /dev/null
+++ b/SOURCES/bz1845574-azure-events-handle-exceptions-in-urlopen.patch
@@ -0,0 +1,70 @@
+From 194909ff08cfe75cd5da9f704d8ed4cc9ab40341 Mon Sep 17 00:00:00 2001
+From: Gustavo Figueira
+Date: Tue, 19 May 2020 10:58:34 +0200
+Subject: [PATCH 1/2] azure-events: handle exceptions in urlopen The locking in
+ azure-events does not correctly handle some failures.
+
+If the metadata server is not recheable or has an error
+handling the request, attr_globalPullState will never go
+back to IDLE unless the administrator manually changes it.
+
+> azure-events: ERROR: [Errno 104] Connection reset by peer
+> lrmd[2734]: notice: rsc_azure-events_monitor_10000:113088:stderr [ ocf-exit-reason:[Errno 104] Connection reset by peer ]
+---
+ heartbeat/azure-events.in | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/heartbeat/azure-events.in b/heartbeat/azure-events.in
+index 8709d97e3..bd812f4b2 100644
+--- a/heartbeat/azure-events.in
++++ b/heartbeat/azure-events.in
+@@ -82,9 +82,19 @@ class azHelper:
+ req = urllib2.Request(url, postData)
+ req.add_header("Metadata", "true")
+ req.add_header("User-Agent", USER_AGENT)
+- resp = urllib2.urlopen(req)
+- data = resp.read()
+- ocf.logger.debug("_sendMetadataRequest: response = %s" % data)
++ try:
++ resp = urllib2.urlopen(req)
++ except URLError as e:
++ if hasattr(e, 'reason'):
++ print('We failed to reach a server. Reason: '), e.reason
++ clusterHelper.setAttr(attr_globalPullState, "IDLE")
++ elif hasattr(e, 'code'):
++ print('The server couldn\'t fulfill the request. Error code: '), e.code
++ clusterHelper.setAttr(attr_globalPullState, "IDLE")
++ else:
++ data = resp.read()
++ ocf.logger.debug("_sendMetadataRequest: response = %s" % data)
++
+ if data:
+ data = json.loads(data)
+
+
+From c4071ec4a82fcb831f170f341e0790633e4b904f Mon Sep 17 00:00:00 2001
+From: Gustavo Figueira
+Date: Tue, 19 May 2020 12:53:22 +0200
+Subject: [PATCH 2/2] azure-events: use ocf.logger.warning instead of print
+
+---
+ heartbeat/azure-events.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/heartbeat/azure-events.in b/heartbeat/azure-events.in
+index bd812f4b2..a48a86309 100644
+--- a/heartbeat/azure-events.in
++++ b/heartbeat/azure-events.in
+@@ -86,10 +86,10 @@ class azHelper:
+ resp = urllib2.urlopen(req)
+ except URLError as e:
+ if hasattr(e, 'reason'):
+- print('We failed to reach a server. Reason: '), e.reason
++ ocf.logger.warning("Failed to reach the server: %s" % e.reason)
+ clusterHelper.setAttr(attr_globalPullState, "IDLE")
+ elif hasattr(e, 'code'):
+- print('The server couldn\'t fulfill the request. Error code: '), e.code
++ ocf.logger.warning("The server couldn\'t fulfill the request. Error code: %s" % e.code)
+ clusterHelper.setAttr(attr_globalPullState, "IDLE")
+ else:
+ data = resp.read()
diff --git a/SOURCES/bz1845581-nfsserver-dont-log-error-message-file-doesnt-exist.patch b/SOURCES/bz1845581-nfsserver-dont-log-error-message-file-doesnt-exist.patch
new file mode 100644
index 0000000..06da3b4
--- /dev/null
+++ b/SOURCES/bz1845581-nfsserver-dont-log-error-message-file-doesnt-exist.patch
@@ -0,0 +1,31 @@
+From 314eadcd683551bd79b644de05cbf0e425c84f83 Mon Sep 17 00:00:00 2001
+From: Kazunori INOUE
+Date: Tue, 9 Jun 2020 13:30:32 +0000
+Subject: [PATCH] nfsserver: prevent error messages when /etc/sysconfig/nfs
+ does not exist
+
+---
+ heartbeat/nfsserver-redhat.sh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/heartbeat/nfsserver-redhat.sh b/heartbeat/nfsserver-redhat.sh
+index cef0862ee..73a70c186 100644
+--- a/heartbeat/nfsserver-redhat.sh
++++ b/heartbeat/nfsserver-redhat.sh
+@@ -150,10 +150,12 @@ set_env_args()
+
+ # override local nfs config. preserve previous local config though.
+ if [ -s $tmpconfig ]; then
+- cat $NFS_SYSCONFIG | grep -q -e "$NFS_SYSCONFIG_AUTOGEN_TAG" > /dev/null 2>&1
+- if [ $? -ne 0 ]; then
+- # backup local nfs config if it doesn't have our HA autogen tag in it.
+- mv -f $NFS_SYSCONFIG $NFS_SYSCONFIG_LOCAL_BACKUP
++ if [ -f "$NFS_SYSCONFIG" ]; then
++ cat $NFS_SYSCONFIG | grep -q -e "$NFS_SYSCONFIG_AUTOGEN_TAG" > /dev/null 2>&1
++ if [ $? -ne 0 ]; then
++ # backup local nfs config if it doesn't have our HA autogen tag in it.
++ mv -f $NFS_SYSCONFIG $NFS_SYSCONFIG_LOCAL_BACKUP
++ fi
+ fi
+
+ cat $tmpconfig | grep -q -e "$NFS_SYSCONFIG_AUTOGEN_TAG" > /dev/null 2>&1
diff --git a/SOURCES/bz1845583-exportfs-1-describe-clientspec-format-in-metadata.patch b/SOURCES/bz1845583-exportfs-1-describe-clientspec-format-in-metadata.patch
new file mode 100644
index 0000000..fd685b1
--- /dev/null
+++ b/SOURCES/bz1845583-exportfs-1-describe-clientspec-format-in-metadata.patch
@@ -0,0 +1,27 @@
+From f572186ec9bd26c791771a18d38804cfde602578 Mon Sep 17 00:00:00 2001
+From: zzhou1 <10611019+zzhou1@users.noreply.github.com>
+Date: Tue, 3 Sep 2019 09:24:23 +0000
+Subject: [PATCH] exportfs: doc clarification for clientspec format
+
+Point out the standard of the format is aligned with `man exportfs`, and also point out the correct way to deal with the use case to export the same directory(-ies) to multiple subnets.
+---
+ heartbeat/exportfs | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/heartbeat/exportfs b/heartbeat/exportfs
+index 80ed057f2..dc609a0b4 100755
+--- a/heartbeat/exportfs
++++ b/heartbeat/exportfs
+@@ -47,6 +47,12 @@ Manages NFS exports
+
+ The client specification allowing remote machines to mount the directory
+ (or directories) over NFS.
++
++Note: it follows the format defined in "man exportfs". For example, in
++the use case to export the directory(-ies) for multiple subnets, please
++do config a dedicated primitive for each subnet CIDR ip address,
++and do not attempt to use multiple CIDR ip addresses in a space
++seperated list, like in /etc/exports.
+
+
+ Client ACL.
diff --git a/SOURCES/bz1845583-exportfs-2-fix-typo.patch b/SOURCES/bz1845583-exportfs-2-fix-typo.patch
new file mode 100644
index 0000000..0406f31
--- /dev/null
+++ b/SOURCES/bz1845583-exportfs-2-fix-typo.patch
@@ -0,0 +1,23 @@
+From 0f8189161ef5c09c6a6df96cb15937d430f75353 Mon Sep 17 00:00:00 2001
+From: Valentin Vidic
+Date: Wed, 23 Oct 2019 22:11:14 +0200
+Subject: [PATCH] Low: exportfs: Fix spelling error
+
+Replace seperated -> separated.
+---
+ heartbeat/exportfs | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/heartbeat/exportfs b/heartbeat/exportfs
+index dc609a0b4..d79aced88 100755
+--- a/heartbeat/exportfs
++++ b/heartbeat/exportfs
+@@ -52,7 +52,7 @@ Note: it follows the format defined in "man exportfs". For example, in
+ the use case to export the directory(-ies) for multiple subnets, please
+ do config a dedicated primitive for each subnet CIDR ip address,
+ and do not attempt to use multiple CIDR ip addresses in a space
+-seperated list, like in /etc/exports.
++separated list, like in /etc/exports.
+
+
+ Client ACL.
diff --git a/SPECS/resource-agents.spec b/SPECS/resource-agents.spec
index 0abb33f..8738405 100644
--- a/SPECS/resource-agents.spec
+++ b/SPECS/resource-agents.spec
@@ -29,6 +29,10 @@
%global googlecloudsdk google-cloud-sdk
%global googlecloudsdk_version 241.0.0
%global googlecloudsdk_dir %{bundled_lib_dir}/gcp/%{googlecloudsdk}
+# python-httplib2 bundle
+%global httplib2 httplib2
+%global httplib2_version 0.18.1
+%global httplib2_dir %{bundled_lib_dir}/gcp/%{httplib2}
# python-pyroute2 bundle
%global pyroute2 pyroute2
%global pyroute2_version 0.4.13
@@ -66,7 +70,7 @@
Name: resource-agents
Summary: Open Source HA Reusable Cluster Resource Scripts
Version: 4.1.1
-Release: 53%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist}
+Release: 60%{?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}
@@ -76,13 +80,14 @@ Group: Productivity/Clustering/HA
%endif
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
+Source2: %{httplib2}-%{httplib2_version}.tar.gz
+Source3: %{pyroute2}-%{pyroute2_version}.tar.gz
+Source4: %{colorama}-%{colorama_version}.tar.gz
+Source5: %{pycryptodome}-%{pycryptodome_version}.tar.gz
+Source6: %{aliyunsdkcore}-%{aliyunsdkcore_version}.tar.gz
+Source7: %{aliyunsdkecs}-%{aliyunsdkecs_version}.tar.gz
+Source8: %{aliyunsdkvpc}-%{aliyunsdkvpc_version}.tar.gz
+Source9: %{aliyuncli}-%{aliyuncli_version}.tar.gz
Patch0: nova-compute-wait-NovaEvacuate.patch
Patch1: LVM-volume_group_check_only.patch
Patch2: bz1552330-vdo-vol.patch
@@ -208,7 +213,7 @@ Patch121: bz1819965-2-azure-events.patch
Patch122: bz1759115-aws-vpc-route53-3-awscli-property.patch
Patch123: bz1744190-pgsql-1-set-primary-standby-initial-score.patch
Patch124: bz1744190-pgsql-2-improve-start-checks.patch
-Patch125: bz1820523-exportfs-add-symlink-support.patch
+Patch125: bz1820523-exportfs-1-add-symlink-support.patch
Patch126: bz1832321-rabbitmq-cluster-increase-wait-timeout.patch
Patch127: bz1818997-nfsserver-fix-nfsv4-only-support.patch
Patch128: bz1830716-NovaEvacuate-suppress-expected-error.patch
@@ -216,6 +221,14 @@ Patch129: bz1836945-db2-hadr-promote-standby-node.patch
Patch130: bz1633251-gcp-pd-move-4-fixes-and-improvements.patch
Patch131: bz1633251-gcp-pd-move-5-bundle.patch
Patch132: bz1839721-podman-force-rm-container-if-rm-fails.patch
+Patch133: bz1820523-exportfs-2-fix-monitor-action.patch
+Patch134: bz1843999-aliyun-vpc-move-ip-log-output-when-failing.patch
+Patch135: bz1845574-azure-events-handle-exceptions-in-urlopen.patch
+Patch136: bz1845581-nfsserver-dont-log-error-message-file-doesnt-exist.patch
+Patch137: bz1845583-exportfs-1-describe-clientspec-format-in-metadata.patch
+Patch138: bz1845583-exportfs-2-fix-typo.patch
+Patch139: bz1814896-Filesystem-fast_stop-default-to-no-for-GFS2.patch
+Patch140: bz1836186-pgsql-support-Pacemaker-v2.03-output.patch
# bundle patches
Patch1000: 7-gcp-bundled.patch
@@ -497,6 +510,14 @@ exit 1
%patch130 -p1
%patch131 -p1
%patch132 -p1
+%patch133 -p1
+%patch134 -p1
+%patch135 -p1
+%patch136 -p1
+%patch137 -p1
+%patch138 -p1
+%patch139 -p1
+%patch140 -p1
chmod 755 heartbeat/nova-compute-wait
chmod 755 heartbeat/NovaEvacuate
@@ -508,6 +529,15 @@ mkdir -p %{bundled_lib_dir}/aliyun
# google-cloud-sdk bundle
%ifarch x86_64
tar -xzf %SOURCE1 -C %{bundled_lib_dir}/gcp
+## upgrade httplib2 to fix CVE-2020-11078
+pushd %{googlecloudsdk_dir}
+rm -rf lib/third_party/httplib2
+popd
+
+# python-httplib2 bundle
+tar -xzf %SOURCE2 -C %{bundled_lib_dir}
+mv %{bundled_lib_dir}/%{httplib2}-%{httplib2_version} %{httplib2_dir}
+
# gcp*: append bundled-directory to search path, gcloud-ra
%patch1000 -p1
# google-cloud-sdk fixes
@@ -536,7 +566,7 @@ rm -rf %{googlecloudsdk_dir}/lib/third_party/dateutil
cp %{googlecloudsdk_dir}/README %{googlecloudsdk}_README
cp %{googlecloudsdk_dir}/lib/third_party/argparse/README.txt %{googlecloudsdk}_argparse_README.txt
cp %{googlecloudsdk_dir}/LICENSE %{googlecloudsdk}_LICENSE
-cp %{googlecloudsdk_dir}/lib/third_party/httplib2/LICENSE %{googlecloudsdk}_httplib2_LICENSE
+cp %{httplib2_dir}/LICENSE %{googlecloudsdk}_httplib2_LICENSE
cp %{googlecloudsdk_dir}/lib/third_party/contextlib2/LICENSE %{googlecloudsdk}_contextlib2_LICENSE
cp %{googlecloudsdk_dir}/lib/third_party/concurrent/LICENSE %{googlecloudsdk}_concurrent_LICENSE
cp %{googlecloudsdk_dir}/lib/third_party/yaml/LICENSE %{googlecloudsdk}_yaml_LICENSE
@@ -579,7 +609,7 @@ cp %{googlecloudsdk_dir}/lib/third_party/apitools/LICENSE %{googlecloudsdk}_apit
cp %{googlecloudsdk_dir}/lib/third_party/containerregistry/LICENSE %{googlecloudsdk}_containerregistry_LICENSE
# python-pyroute2 bundle
-tar -xzf %SOURCE2 -C %{bundled_lib_dir}/gcp
+tar -xzf %SOURCE3 -C %{bundled_lib_dir}/gcp
mv %{bundled_lib_dir}/gcp/%{pyroute2}-%{pyroute2_version} %{pyroute2_dir}
cp %{pyroute2_dir}/README.md %{pyroute2}_README.md
cp %{pyroute2_dir}/README.license.md %{pyroute2}_README.license.md
@@ -587,7 +617,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 %SOURCE4 -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
@@ -598,28 +628,28 @@ rm -rf *.egg-info
popd
# python-pycryptodome bundle
-tar -xzf %SOURCE4 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE5 -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 %SOURCE6 -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 %SOURCE7 -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 %SOURCE8 -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 %SOURCE9 -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
@@ -677,8 +707,13 @@ JFLAGS="$(echo '%{_smp_mflags}')"
make $JFLAGS
-# python-pyroute2 bundle
+# python-httplib2 bundle
%ifarch x86_64
+pushd %{httplib2_dir}
+%{__python3} setup.py build
+popd
+
+# python-pyroute2 bundle
pushd %{pyroute2_dir}
%{__python3} setup.py build
popd
@@ -730,6 +765,11 @@ mkdir %{buildroot}/%{_bindir}
ln -s /usr/lib/%{name}/%{googlecloudsdk_dir}/bin/gcloud-ra %{buildroot}/%{_bindir}
popd
+# python-httplib2 bundle
+pushd %{httplib2_dir}
+%{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{googlecloudsdk_dir}/lib/third_party
+popd
+
# python-pyroute2 bundle
pushd %{pyroute2_dir}
%{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/gcp
@@ -1041,6 +1081,37 @@ ccs_update_schema > /dev/null 2>&1 ||:
%endif
%changelog
+* Thu Jun 25 2020 Oyvind Albrigtsen - 4.1.1-60
+- Upgrade bundled python-httplib2 to fix CVE-2020-11078
+
+ Resolves: rhbz#1850990
+
+* Wed Jun 17 2020 Oyvind Albrigtsen - 4.1.1-59
+- pgsql: support Pacemaker v2.03+ output
+
+ Resolves: rhbz#1836186
+
+* Thu Jun 11 2020 Oyvind Albrigtsen - 4.1.1-56
+- Filesystem: set "fast_stop" default to "no" for GFS2 filesystems
+
+ Resolves: rhbz#1814896
+
+* Wed Jun 10 2020 Oyvind Albrigtsen - 4.1.1-55
+- azure-events: handle exceptions in urlopen
+- nfsserver: dont log error message when /etc/sysconfig/nfs does not exist
+- exportfs: describe clientspec format in metadata
+
+ Resolves: rhbz#1845574
+ Resolves: rhbz#1845581
+ Resolves: rhbz#1845583
+
+* Tue Jun 9 2020 Oyvind Albrigtsen - 4.1.1-54
+- exportfs: add symlink support
+- aliyun-vpc-move-ip: log output when failing
+
+ Resolves: rhbz#1820523
+ Resolves: rhbz#1843999
+
* Tue Jun 2 2020 Oyvind Albrigtsen - 4.1.1-53
- podman: force remove container if remove fails
@@ -1061,10 +1132,8 @@ ccs_update_schema > /dev/null 2>&1 ||:
Resolves: rhbz#1836945
* Thu May 7 2020 Oyvind Albrigtsen - 4.1.1-50
-- exportfs: add symlink support
- rabbitmq-cluster: increase rabbitmqctl wait timeout during start
- Resolves: rhbz#1820523
Resolves: rhbz#1832321
* Tue Apr 28 2020 Oyvind Albrigtsen - 4.1.1-49