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.
+ </longdesc>
+ <shortdesc lang="en">filesystem type</shortdesc>
+-<content type="string" default="" />
++<content type="string" default="${OCF_RESKEY_fstype_default}" />
+ </parameter>
+ 
+ <parameter name="options">
+@@ -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.
+ </longdesc>
+ <shortdesc lang="en">fast stop</shortdesc>
+-<content type="boolean" default="yes" />
++<content type="boolean" default="${OCF_RESKEY_fast_stop_default}" />
+ </parameter>
+ 
+ <parameter name="force_clones">
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 <oalbrigt@redhat.com>
+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 <oalbrigt@redhat.com>
+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 <oalbrigt@redhat.com>
-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 "<resource id=\"${RESOURCE_NAME}\" .* role=\"(Promoted|Master)\""
+     if [ $? -ne 0 ] ; then
+         # If I am Slave and Master is not exist
+         ocf_log info "Master does not exist."
+@@ -1784,11 +1784,11 @@
+ }
+ 
+ is_node_online() {
+-    print_crm_mon | tr '[A-Z]' '[a-z]' | grep -e "^node $1 " -e "^node $1:" | grep -q -v "offline"
++    print_crm_mon | grep -q -i "<node name=\"$1\" .* online=\"true\""
+ }
+ 
+ node_exist() {
+-    print_crm_mon | tr '[A-Z]' '[a-z]' | grep -q "^node $1"
++    print_crm_mon | grep -q -i "<node name=\"$1\" .* online"
+ }
+ 
+ check_binary2() {
+@@ -2070,7 +2070,14 @@
+ 
+ print_crm_mon() {
+     if [ -z "$CRM_MON_OUTPUT" ]; then
+-        CRM_MON_OUTPUT=`exec_with_retry 0 crm_mon -n1`
++        ocf_version_cmp "$OCF_RESKEY_crm_feature_set" "3.1.0"
++        res=$?
++        if [ -z "$OCF_RESKEY_crm_feature_set" ] || [ $res -eq 2 ]; then
++            XMLOPT="--output-as=xml"
++        else
++            XMLOPT="--as-xml"
++        fi
++        CRM_MON_OUTPUT=`exec_with_retry 0 crm_mon -1 $XMLOPT`
+     fi
+     printf "${CRM_MON_OUTPUT}\n"
+ }
diff --git a/SOURCES/bz1843999-aliyun-vpc-move-ip-log-output-when-failing.patch b/SOURCES/bz1843999-aliyun-vpc-move-ip-log-output-when-failing.patch
new file mode 100644
index 0000000..7a7185f
--- /dev/null
+++ b/SOURCES/bz1843999-aliyun-vpc-move-ip-log-output-when-failing.patch
@@ -0,0 +1,265 @@
+--- a/heartbeat/aliyun-vpc-move-ip	2020-06-09 13:41:35.308379032 +0200
++++ b/heartbeat/aliyun-vpc-move-ip	2020-06-05 10:48:45.555132686 +0200
+@@ -9,12 +9,46 @@
+ # Initialization:
+ : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+ . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
++
++# Parameter defaults
++
++OCF_RESKEY_address_default=""
++OCF_RESKEY_routing_table_default=""
++OCF_RESKEY_interface_default="eth0"
++OCF_RESKEY_profile_default="default"
++OCF_RESKEY_endpoint_default="vpc.aliyuncs.com"
++OCF_RESKEY_aliyuncli_default="detect"
++
++
++: ${OCF_RESKEY_address=${OCF_RESKEY_address_default}}
++: ${OCF_RESKEY_routing_table=${OCF_RESKEY_routing_table_default}}
++: ${OCF_RESKEY_interface=${OCF_RESKEY_interface_default}}
++: ${OCF_RESKEY_profile=${OCF_RESKEY_profile_default}}
++: ${OCF_RESKEY_endpoint=${OCF_RESKEY_endpoint_default}}
++: ${OCF_RESKEY_aliyuncli=${OCF_RESKEY_aliyuncli_default}}
++
+ #######################################################################
+ 
+-# aliyuncli doesnt work without HOME parameter
++# aliyun cli doesnt work without HOME parameter
+ export HOME="/root"
+ 
+ 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)"
++fi
++
++if [[ "${OCF_RESKEY_aliyuncli##*/}" == 'aliyuncli' ]]; then
++	OUTPUT="text"
++	EXECUTING='{ print $3 }'
++	IFS_=" "
++	ENDPOINT=""
++elif [[ "${OCF_RESKEY_aliyuncli##*/}" == 'aliyun' ]]; then
++	OUTPUT="table cols=InstanceId,DestinationCidrBlock rows=RouteTables.RouteTable[].RouteEntrys.RouteEntry[]"
++	EXECUTING='{ gsub (" ", "", $0); print $1 }'
++	IFS_="|"
++	ENDPOINT="--endpoint $OCF_RESKEY_endpoint"
++fi
+ ###############################################################################
+ 
+ 
+@@ -24,27 +58,61 @@
+ #
+ ###############################################################################
+ 
++request_create_route_entry() {
++	cmd="${OCF_RESKEY_aliyuncli} vpc CreateRouteEntry --RouteTableId $OCF_RESKEY_routing_table --DestinationCidrBlock ${OCF_RESKEY_address}/32 --NextHopId $ECS_INSTANCE_ID --NextHopType Instance ${ENDPOINT}"
++	ocf_log debug "executing command: $cmd"
++	res=$($cmd  2>&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
+ </longdesc>
+ <shortdesc lang="en">Move IP within a VPC of the Aliyun ECS</shortdesc>
++
+ <parameters>
++<parameter name="aliyuncli" required="0">
++<longdesc lang="en">
++Path to command line tools for Aliyun
++</longdesc>
++<shortdesc lang="en">Path to Aliyun CLI tools</shortdesc>
++<content type="string" default="${OCF_RESKEY_aliyuncli_default}" />
++</parameter>
++
+ <parameter name="address" required="1">
+ <longdesc lang="en">
+ VPC private IP address
+ </longdesc>
+ <shortdesc lang="en">vpc ip</shortdesc>
+-<content type="string" default="" />
++<content type="string" default="${OCF_RESKEY_address_default}" />
+ </parameter>
++
+ <parameter name="routing_table" required="1">
+ <longdesc lang="en">
+ Name of the routing table, where the route for the IP address should be changed, i.e. vtb-...
+ </longdesc>
+ <shortdesc lang="en">routing table name</shortdesc>
+-<content type="string" default="" />
++<content type="string" default="${OCF_RESKEY_routing_table_default}" />
+ </parameter>
++
+ <parameter name="interface" required="1">
+ <longdesc lang="en">
+ Name of the network interface, i.e. eth0
+ </longdesc>
+ <shortdesc lang="en">network interface name</shortdesc>
+-<content type="string" default="eth0" />
++<content type="string" default="${OCF_RESKEY_interface_default}" />
+ </parameter>
+-<parameter name="profile" required="0">
++
++<parameter name="endpoint" required="0">
+ <longdesc lang="en">
+-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
++</longdesc>
++<shortdesc lang="en">service endpoint</shortdesc>
++<content type="string" default="${OCF_RESKEY_endpoint_default}" />
++</parameter>
+ 
+-See https://www.alibabacloud.com/help/doc-detail/43039.htm?spm=a2c63.p38356.b99.16.38a914abRZtOU3 for more information about aliyuncli-ra.
++<parameter name="profile" required="0">
++<longdesc lang="en">
++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.
+ </longdesc>
+ <shortdesc lang="en">profile name</shortdesc>
+-<content type="string" default="default" />
++<content type="string" default="${OCF_RESKEY_profile_default}" />
+ </parameter>
+ </parameters>
++
+ <actions>
+ <action name="start" timeout="180s" />
+ <action name="stop" timeout="180s" />
+@@ -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 <gfigueira@suse.com>
+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 <gfigueira@suse.com>
+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 <kazunori_inoue@newson.co.jp>
+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
+ <longdesc lang="en">
+ 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.
+ </longdesc>
+ <shortdesc lang="en">
+ 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 <vvidic@debian.org>
+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.
+ </longdesc>
+ <shortdesc lang="en">
+ 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 <oalbrigt@redhat.com> - 4.1.1-60
+- Upgrade bundled python-httplib2 to fix CVE-2020-11078
+
+  Resolves: rhbz#1850990
+
+* Wed Jun 17 2020 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-59
+- pgsql: support Pacemaker v2.03+ output
+
+  Resolves: rhbz#1836186
+
+* Thu Jun 11 2020 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-56
+- Filesystem: set "fast_stop" default to "no" for GFS2 filesystems
+
+  Resolves: rhbz#1814896
+
+* Wed Jun 10 2020 Oyvind Albrigtsen <oalbrigt@redhat.com> - 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 <oalbrigt@redhat.com> - 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 <oalbrigt@redhat.com> - 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 <oalbrigt@redhat.com> - 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 <oalbrigt@redhat.com> - 4.1.1-49