diff --git a/.gitignore b/.gitignore
index a5ea076..26d0954 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,11 @@
 SOURCES/ClusterLabs-resource-agents-e711383f.tar.gz
 SOURCES/SAPHanaSR-2067519.tar.gz
 SOURCES/aliyun-cli-2.1.10.tar.gz
-SOURCES/aliyun-python-sdk-core-2.8.5.tar.gz
+SOURCES/aliyun-python-sdk-core-2.13.1.tar.gz
 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-206.0.0-linux-x86_64.tar.gz
-SOURCES/jmespath-0.7.1.tar.gz
+SOURCES/google-cloud-sdk-241.0.0-linux-x86_64.tar.gz
 SOURCES/pycryptodome-3.6.4.tar.gz
 SOURCES/pyroute2-0.4.13.tar.gz
 SOURCES/sap_cluster_connector-0015fe2.tar.gz
diff --git a/.resource-agents.metadata b/.resource-agents.metadata
index c27a2c8..5b6c0ef 100644
--- a/.resource-agents.metadata
+++ b/.resource-agents.metadata
@@ -1,12 +1,11 @@
 0358e1cb7fe86b2105bd2646cbe86f3c0273844a SOURCES/ClusterLabs-resource-agents-e711383f.tar.gz
 92409ca65e8f4e63d5c308368861fa67ced470f1 SOURCES/SAPHanaSR-2067519.tar.gz
 306e131d8908ca794276bfe3a0b55ccc3bbd482f SOURCES/aliyun-cli-2.1.10.tar.gz
-b68122ef53a0857d020529ff85d14f0e905c327f SOURCES/aliyun-python-sdk-core-2.8.5.tar.gz
+0a56f6d9ed2014a363486d33b63eca094379be06 SOURCES/aliyun-python-sdk-core-2.13.1.tar.gz
 c2a98b9a1562d223a76514f05028488ca000c395 SOURCES/aliyun-python-sdk-ecs-4.9.3.tar.gz
 f14647a4d37a9a254c4e711b95a7654fc418e41e SOURCES/aliyun-python-sdk-vpc-3.0.2.tar.gz
 0fe5bd8bca54dd71223778a1e0bcca9af324abb1 SOURCES/colorama-0.3.3.tar.gz
-182a102b36701e8c27b31e9751b6716a377fc3ef SOURCES/google-cloud-sdk-206.0.0-linux-x86_64.tar.gz
-f8fbedae53dd8f8b2717a32de9a9ae0e15cba566 SOURCES/jmespath-0.7.1.tar.gz
+876e2b0c0e3031c6e6101745acd08e4e9f53d6a9 SOURCES/google-cloud-sdk-241.0.0-linux-x86_64.tar.gz
 326a73f58a62ebee00c11a12cfdd838b196e0e8e SOURCES/pycryptodome-3.6.4.tar.gz
 147149db11104c06d405fd077dcd2aa1c345f109 SOURCES/pyroute2-0.4.13.tar.gz
 731c683ecc63b50fbc0823170e966b74ec2a0f51 SOURCES/sap_cluster_connector-0015fe2.tar.gz
diff --git a/SOURCES/10-gcloud-support-info.patch b/SOURCES/10-gcloud-support-info.patch
index ca70f10..ef96ca5 100644
--- a/SOURCES/10-gcloud-support-info.patch
+++ b/SOURCES/10-gcloud-support-info.patch
@@ -1,20 +1,20 @@
 diff -uNr a/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/calliope/usage_text.py b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/calliope/usage_text.py
 --- a/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/calliope/usage_text.py	1980-01-01 09:00:00.000000000 +0100
-+++ b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/calliope/usage_text.py	2018-06-25 17:27:48.677568874 +0200
-@@ -812,6 +812,9 @@
-   buf.write("""
++++ b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/calliope/usage_text.py	2019-04-04 11:59:47.592768577 +0200
+@@ -900,6 +900,9 @@
+   return """\
  For detailed information on this command and its flags, run:
    {command_path} --help
 +
-+WARNING: {command_path} is only supported for "{command_path} init" and for use with
-+the agents in resource-agents.
- """.format(command_path=' '.join(command.GetPath())))
++WARNING: {command_path} is only supported for "{command_path} init" and for use
++with the agents in resource-agents.
+ """.format(command_path=' '.join(command.GetPath()))
+ 
  
-   return buf.getvalue()
 diff -uNr a/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/gcloud_main.py b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/gcloud_main.py
 --- a/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/gcloud_main.py	1980-01-01 09:00:00.000000000 +0100
-+++ b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/gcloud_main.py	2018-06-25 18:42:28.414510873 +0200
-@@ -81,7 +81,7 @@
++++ b/bundled/gcp/google-cloud-sdk/lib/googlecloudsdk/gcloud_main.py	2019-04-04 12:00:23.991142694 +0200
+@@ -84,7 +84,7 @@
  
    pkg_root = os.path.dirname(os.path.dirname(surface.__file__))
    loader = cli.CLILoader(
diff --git a/SOURCES/9-google-cloud-sdk-oauth2client-python-rsa-to-cryptography.patch b/SOURCES/9-google-cloud-sdk-oauth2client-python-rsa-to-cryptography.patch
index 4ee51ea..de378c4 100644
--- a/SOURCES/9-google-cloud-sdk-oauth2client-python-rsa-to-cryptography.patch
+++ b/SOURCES/9-google-cloud-sdk-oauth2client-python-rsa-to-cryptography.patch
@@ -1,11 +1,15 @@
 diff -uNr a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py b/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py
---- a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py	2016-10-14 19:53:53.000000000 +0200
-+++ b/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py	2018-06-21 15:40:25.216478384 +0200
-@@ -23,7 +23,10 @@
+--- a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py	1980-01-01 09:00:00.000000000 +0100
++++ b/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_python_crypt.py	2019-04-04 11:56:00.292677044 +0200
+@@ -19,8 +19,14 @@
+ certificates.
+ """
+ 
++from pyasn1.codec.der import decoder
  from pyasn1_modules import pem
- from pyasn1_modules.rfc2459 import Certificate
- from pyasn1_modules.rfc5208 import PrivateKeyInfo
 -import rsa
++from pyasn1_modules.rfc2459 import Certificate
++from pyasn1_modules.rfc5208 import PrivateKeyInfo
 +from cryptography.hazmat.primitives import serialization, hashes
 +from cryptography.hazmat.primitives.asymmetric import padding
 +from cryptography import x509
@@ -13,7 +17,16 @@ diff -uNr a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_pyth
  import six
  
  from oauth2client import _helpers
-@@ -70,7 +73,8 @@
+@@ -40,7 +46,7 @@
+                  '-----END RSA PRIVATE KEY-----')
+ _PKCS8_MARKER = ('-----BEGIN PRIVATE KEY-----',
+                  '-----END PRIVATE KEY-----')
+-_PKCS8_SPEC = None
++_PKCS8_SPEC = PrivateKeyInfo()
+ 
+ 
+ def _bit_list_to_bytes(bit_list):
+@@ -67,7 +73,8 @@
      """
  
      def __init__(self, pubkey):
@@ -23,7 +36,7 @@ diff -uNr a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_pyth
  
      def verify(self, message, signature):
          """Verifies a message against a signature.
-@@ -87,8 +91,9 @@
+@@ -84,8 +91,9 @@
          """
          message = _helpers._to_bytes(message, encoding='utf-8')
          try:
@@ -35,13 +48,17 @@ diff -uNr a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_pyth
              return False
  
      @classmethod
-@@ -112,16 +117,18 @@
+@@ -109,19 +117,18 @@
          """
          key_pem = _helpers._to_bytes(key_pem)
          if is_x509_cert:
+-            from pyasn1.codec.der import decoder
+-            from pyasn1_modules import rfc2459
+-
 -            der = rsa.pem.load_pem(key_pem, 'CERTIFICATE')
+-            asn1_cert, remaining = decoder.decode(der, asn1Spec=rfc2459.Certificate())
 +            der = x509.load_pem_x509_certificate(pem_data, default_backend())
-             asn1_cert, remaining = decoder.decode(der, asn1Spec=Certificate())
++            asn1_cert, remaining = decoder.decode(der, asn1Spec=Certificate())
              if remaining != b'':
                  raise ValueError('Unused bytes', remaining)
  
@@ -75,17 +92,28 @@ diff -uNr a/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/_pure_pyth
  
      @classmethod
      def from_string(cls, key, password='notasecret'):
-@@ -168,16 +177,19 @@
+@@ -163,27 +172,24 @@
+             ValueError if the key cannot be parsed as PKCS#1 or PKCS#8 in
+             PEM format.
+         """
+-        global _PKCS8_SPEC
+         key = _helpers._from_bytes(key)  # pem expects str in Py3
+         marker_id, key_bytes = pem.readPemBlocksFromFile(
              six.StringIO(key), _PKCS1_MARKER, _PKCS8_MARKER)
  
          if marker_id == 0:
 -            pkey = rsa.key.PrivateKey.load_pkcs1(key_bytes,
 -                                                 format='DER')
+-        elif marker_id == 1:
+-            from pyasn1.codec.der import decoder
+-            from pyasn1_modules import rfc5208
 +            pkey = serialization.load_der_private_key(
 +                key_bytes, password=None,
 +                backend=default_backend())
-+
-         elif marker_id == 1:
+ 
+-            if _PKCS8_SPEC is None:
+-              _PKCS8_SPEC = rfc5208.PrivateKeyInfo()
++        elif marker_id == 1:
              key_info, remaining = decoder.decode(
                  key_bytes, asn1Spec=_PKCS8_SPEC)
              if remaining != b'':
diff --git a/SOURCES/aliyuncli-python3-fixes.patch b/SOURCES/aliyuncli-python3-fixes.patch
new file mode 100644
index 0000000..22be4e1
--- /dev/null
+++ b/SOURCES/aliyuncli-python3-fixes.patch
@@ -0,0 +1,398 @@
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsExportHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsExportHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsExportHandler.py	2019-02-19 12:08:17.331785393 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsExportHandler.py	2019-02-19 14:40:39.656330971 +0100
+@@ -13,7 +13,7 @@
+     
+     def getFileName(self,keyValues):
+         filename = None
+-        if keyValues.has_key('--filename') and len(keyValues['--filename']) > 0:
++        if '--filename' in keyValues and len(keyValues['--filename']) > 0:
+             filename = keyValues['--filename'][0]
+         else:
+             return filename, "A file name is needed! please use \'--filename\' and add the file name."
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsImportHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsImportHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsImportHandler.py	2019-02-19 12:08:17.331785393 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/ecsImportHandler.py	2019-02-19 14:41:48.927128430 +0100
+@@ -13,7 +13,7 @@
+     
+     def getFileName(self,keyValues):
+         filename = None
+-        if keyValues.has_key('--filename') and len(keyValues['--filename']) > 0:
++        if '--filename' in keyValues and len(keyValues['--filename']) > 0:
+             filename = keyValues['--filename'][0]
+         else:
+             print("A profile is needed! please use \'--filename\' and add the profile name.")
+@@ -21,7 +21,7 @@
+ 
+     def getInstanceCount(self,keyValues):
+         count = 1
+-        if keyValues.has_key('--instancecount') and len(keyValues['--instancecount']) > 0:
++        if '--instancecount' in keyValues and len(keyValues['--instancecount']) > 0:
+             if  keyValues['--instancecount'][0].isdigit() and int(keyValues['--instancecount'][0]) >= 0:
+                 count = keyValues['--instancecount'][0]
+             else:
+@@ -113,7 +113,7 @@
+ 
+     def isAllocatePublicIpAddress(self,keyValues):
+         _publicIp = False
+-        if keyValues.has_key('--allocatepublicip') and len(keyValues['--allocatepublicip']) > 0:
++        if '--allocatepublicip' in keyValues and len(keyValues['--allocatepublicip']) > 0:
+             if  keyValues['--allocatepublicip'][0] == "yes":
+                 _publicIp = True
+         return _publicIp
+@@ -125,7 +125,7 @@
+             '''
+             data = json.loads(jsonbody)
+             '''
+-            if data.has_key('InstanceId') and len(data['InstanceId']) > 0:
++            if 'InstanceId' in data and len(data['InstanceId']) > 0:
+                 instanceId = data['InstanceId']
+         except Exception as e:
+             pass
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsExportHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsExportHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsExportHandler.py	2019-02-19 12:08:17.331785393 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsExportHandler.py	2019-02-19 14:42:11.772731833 +0100
+@@ -38,7 +38,7 @@
+ 
+     def getFileName(self,keyValues):
+         filename = None
+-        if keyValues.has_key('--filename') and len(keyValues['--filename']) > 0:
++        if '--filename' in keyValues and len(keyValues['--filename']) > 0:
+             filename = keyValues['--filename'][0]
+         else:
+             return filename, "A file name is needed! please use \'--filename\' and add the file name."
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsImportHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsImportHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsImportHandler.py	2019-02-19 12:08:17.331785393 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/rdsImportHandler.py	2019-02-19 14:39:09.247900469 +0100
+@@ -13,7 +13,7 @@
+     
+     def getFileName(self,keyValues):
+         filename = None
+-        if keyValues.has_key('--filename') and len(keyValues['--filename']) > 0:
++        if '--filename' in keyValues and len(keyValues['--filename']) > 0:
+             filename = keyValues['--filename'][0]
+         else:
+             return filename, "A filename is needed! please use \'--filename\' and add the file name."
+@@ -21,7 +21,7 @@
+     def getInstanceCount(self,keyValues):
+         count = 1
+         import_count = "--count"
+-        if keyValues.has_key(import_count) and len(keyValues[import_count]) > 0:
++        if import_count in keyValues and len(keyValues[import_count]) > 0:
+             if  keyValues[import_count][0].isdigit() and int(keyValues[import_count][0]) >= 0:
+                 count = keyValues[import_count][0]
+             else:
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/userConfigHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/userConfigHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/userConfigHandler.py	2018-01-24 04:08:33.000000000 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/userConfigHandler.py	2019-02-19 11:01:46.116653274 +0100
+@@ -17,37 +17,37 @@
+ 
+     def getConfigHandlerOptions(self):
+         return [ConfigCmd.name]
+-				
++
+     def showConfig(self):
+         _credentialsPath = os.path.join(self.extensionCliHandler.aliyunConfigurePath,self.extensionCliHandler.credentials)
+         _configurePath = os.path.join(self.extensionCliHandler.aliyunConfigurePath,self.extensionCliHandler.configure)
+         config = dict()
+         configContent = dict() 
+-	credentialsContent = dict ()
+-	if os.path.exists(_configurePath):
++        credentialsContent = dict ()
++        if os.path.exists(_configurePath):
+             for line in open(_configurePath):
+                 line = line.strip('\n')
+                 if line.find('=') > 0:
+                     list = line.split("=",1)
+-		    configContent[list[0]] = list[1]
+-		else: 
+-		    pass
+-	config['configure'] = configContent
+-	if os.path.exists(_credentialsPath):
+-	    for line in open(_credentialsPath):
++                    configContent[list[0]] = list[1]
++                else: 
++                    pass
++        config['configure'] = configContent
++        if os.path.exists(_credentialsPath):
++            for line in open(_credentialsPath):
+                 line = line.strip('\n')
+                 if line.find('=') > 0:
+                     list = line.split("=",1)
+-		    credentialsContent[list[0]] = list[1]
+-		else: 
+-		    pass 
+-	config ['credentials'] = credentialsContent
+-	response.display_response("showConfigure",config,'table')
++                    credentialsContent[list[0]] = list[1]
++                else: 
++                    pass 
++        config ['credentials'] = credentialsContent
++        response.display_response("showConfigure",config,'table')
+     def importConfig():
+         pass
+     def exportConfig():
+         pass
+-	
++
+ 
+ 
+ if __name__ == "__main__":
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/advance/userProfileHandler.py b/bundled/aliyun/aliyun-cli/aliyuncli/advance/userProfileHandler.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/advance/userProfileHandler.py	2019-02-19 12:08:17.332785376 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/advance/userProfileHandler.py	2019-02-19 14:40:12.267806439 +0100
+@@ -20,7 +20,7 @@
+     def handleProfileCmd(self, cmd, keyValues):
+         if cmd.lower() == ProfileCmd.useProfile.lower(): # confirm command is right
+             #check --name is valid
+-            if keyValues.has_key(ProfileCmd.name) and len(keyValues[ProfileCmd.name]) > 0:
++            if ProfileCmd.name in keyValues and len(keyValues[ProfileCmd.name]) > 0:
+                 _value = keyValues[ProfileCmd.name][0] # use the first value
+                 self.extensionCliHandler.setUserProfile(_value)
+             else:
+@@ -34,7 +34,7 @@
+         newProfileName = ''
+         if cmd.lower() == ProfileCmd.addProfile.lower(): # confirm command is right
+             #check --name is valid
+-            if keyValues.has_key(ProfileCmd.name) and len(keyValues[ProfileCmd.name]) > 0:
++            if ProfileCmd.name in keyValues and len(keyValues[ProfileCmd.name]) > 0:
+                 _value = keyValues[ProfileCmd.name][0] # check the first value
+                 # only input key and secret
+                 newProfileName = _value
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliParser.py b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliParser.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliParser.py	2019-02-19 12:08:17.332785376 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliParser.py	2019-02-19 14:35:32.009660989 +0100
+@@ -137,9 +137,9 @@
+                         values.append(self.args[index])
+                         index = index + 1
+                     keyValues[currentValue] = values
+-        if keyValues.has_key(keystr) and keyValues[keystr].__len__() > 0:
++        if keystr in keyValues and keyValues[keystr].__len__() > 0:
+             _key = keyValues[keystr][0]
+-        if keyValues.has_key(secretstr) and keyValues[secretstr].__len__() > 0:
++        if secretstr in keyValues and keyValues[secretstr].__len__() > 0:
+             _secret = keyValues[secretstr][0]
+         #print("accesskeyid: ", _key , "accesskeysecret: ",_secret)
+         return _key, _secret
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/aliyuncli.py b/bundled/aliyun/aliyun-cli/aliyuncli/aliyuncli.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/aliyuncli.py	2018-01-24 04:08:33.000000000 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/aliyuncli.py	2019-02-19 13:35:35.738680413 +0100
+@@ -19,8 +19,9 @@
+ '''
+ 
+ import sys 
+-reload(sys)
+-sys.setdefaultencoding('utf-8')
++if sys.version_info[0] < 3:
++    reload(sys)
++    sys.setdefaultencoding('utf-8')
+ __author__ = 'xixi.xxx'
+ import aliyunCliMain
+ 
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliUpgrade.py b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliUpgrade.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliUpgrade.py	2019-02-19 12:08:17.332785376 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunCliUpgrade.py	2019-02-19 11:15:19.920089641 +0100
+@@ -18,7 +18,7 @@
+ '''
+ 
+ import aliyunCliConfiugre
+-import urllib2
++import urllib3
+ import re
+ import os
+ import platform
+@@ -151,7 +151,7 @@
+ # this functino will get the latest version
+     def _getLatestTimeFromServer(self):
+         try:
+-            f = urllib2.urlopen(self.configure.server_url,data=None,timeout=5)
++            f = urllib3.urlopen(self.configure.server_url,data=None,timeout=5)
+             s = f.read()
+             return s
+         except Exception as e:
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunOpenApiData.py b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunOpenApiData.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunOpenApiData.py	2019-02-19 12:08:17.332785376 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunOpenApiData.py	2019-02-19 14:37:28.221649497 +0100
+@@ -26,7 +26,7 @@
+ import aliyunSdkConfigure
+ import json
+ import cliError
+-import urllib2
++import urllib3
+ import handleEndPoint
+ 
+ from __init__ import  __version__
+@@ -259,7 +259,7 @@
+     def changeEndPoint(self, classname, keyValues):
+         endpoint = "Endpoint"
+         try:
+-            if keyValues.has_key(endpoint) and keyValues[endpoint].__len__() > 0:
++            if endpoint in keyValues and keyValues[endpoint].__len__() > 0:
+                 classname._RestApi__domain = keyValues[endpoint][0]
+         except Exception as e:
+             pass
+@@ -444,10 +444,10 @@
+ 
+     def getTempVersion(self,keyValues):
+         key='--version'
+-        if keyValues is not None and keyValues.has_key(key):
++        if keyValues is not None and key in keyValues:
+             return keyValues.get(key)
+         key = 'version'
+-        if keyValues is not None and keyValues.has_key(key):
++        if keyValues is not None and key in keyValues:
+             return keyValues.get(key)
+ 
+     def getVersionFromFile(self,cmd):
+@@ -513,7 +513,7 @@
+         self.checkForServer(response,cmd,operation)
+     def getRequestId(self,response):
+         try:
+-            if response.has_key('RequestId') and len(response['RequestId']) > 0:
++            if 'RequestId' in response and len(response['RequestId']) > 0:
+                 requestId = response['RequestId']
+                 return  requestId
+         except Exception:
+@@ -532,7 +532,7 @@
+             ua = ""
+         url = configure.server_url + "?requesId=" + requestId + "&ak=" + ak +"&ua="+ua+"&cmd="+cmd+"&operation="+operation
+         try:
+-            f = urllib2.urlopen(url,data=None,timeout=5)
++            f = urllib3.urlopen(url,data=None,timeout=5)
+             s = f.read()
+             return s
+         except Exception :
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunSdkConfigure.py b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunSdkConfigure.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/aliyunSdkConfigure.py	2019-02-19 12:08:17.333785359 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/aliyunSdkConfigure.py	2019-02-19 14:38:04.032029661 +0100
+@@ -39,7 +39,7 @@
+ 
+     def sdkConfigure(self,cmd,operation):
+         keyValues = self.parser._getKeyValues()
+-        if keyValues.has_key('--version') and len(keyValues['--version']) > 0:
++        if '--version' in keyValues and len(keyValues['--version']) > 0:
+             version=keyValues['--version'][0]
+             filename=self.fileName
+             self.writeCmdVersionToFile(cmd,version,filename)
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/configure.py b/bundled/aliyun/aliyun-cli/aliyuncli/configure.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/configure.py	2019-02-19 12:08:17.333785359 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/configure.py	2019-02-19 11:12:58.670708353 +0100
+@@ -23,6 +23,8 @@
+ import aliyunCliParser
+ import platform
+ 
++if sys.version_info[0] > 2:
++    raw_input = input
+ 
+ OSS_CREDS_FILENAME = "%s/.aliyuncli/osscredentials" % os.path.expanduser('~')
+ OSS_CONFIG_SECTION = 'OSSCredentials'
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/paramOptimize.py b/bundled/aliyun/aliyun-cli/aliyuncli/paramOptimize.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/paramOptimize.py	2019-02-19 12:08:17.333785359 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/paramOptimize.py	2019-02-19 11:14:58.926181598 +0100
+@@ -19,7 +19,7 @@
+ #/usr/bin/env python
+ #!-*- coding:utf-8 -*-
+ import os
+-import urllib2
++import urllib3
+ import cliError
+ 
+ 
+@@ -64,9 +64,9 @@
+         print(e)
+ def _getParamFromUrl(prefix,value,mode):
+ 
+-    req = urllib2.Request(value)
++    req = urllib3.Request(value)
+     try:
+-        response=urllib2.urlopen(req)
++        response=urllib3.urlopen(req)
+         if response.getcode() == 200:
+             return response.read()
+         else:
+diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/six.py b/bundled/aliyun/aliyun-cli/aliyuncli/six.py
+--- a/bundled/aliyun/aliyun-cli/aliyuncli/six.py	2018-01-24 04:08:33.000000000 +0100
++++ b/bundled/aliyun/aliyun-cli/aliyuncli/six.py	2019-02-19 11:14:40.505262286 +0100
+@@ -340,8 +340,8 @@
+ 
+ 
+ _urllib_error_moved_attributes = [
+-    MovedAttribute("URLError", "urllib2", "urllib.error"),
+-    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
++    MovedAttribute("URLError", "urllib3", "urllib.error"),
++    MovedAttribute("HTTPError", "urllib3", "urllib.error"),
+     MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+ ]
+ for attr in _urllib_error_moved_attributes:
+@@ -359,34 +359,34 @@
+ 
+ 
+ _urllib_request_moved_attributes = [
+-    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+-    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+-    MovedAttribute("build_opener", "urllib2", "urllib.request"),
++    MovedAttribute("urlopen", "urllib3", "urllib.request"),
++    MovedAttribute("install_opener", "urllib3", "urllib.request"),
++    MovedAttribute("build_opener", "urllib3", "urllib.request"),
+     MovedAttribute("pathname2url", "urllib", "urllib.request"),
+     MovedAttribute("url2pathname", "urllib", "urllib.request"),
+     MovedAttribute("getproxies", "urllib", "urllib.request"),
+-    MovedAttribute("Request", "urllib2", "urllib.request"),
+-    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+-    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+-    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+-    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
++    MovedAttribute("Request", "urllib3", "urllib.request"),
++    MovedAttribute("OpenerDirector", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPDefaultErrorHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPRedirectHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPCookieProcessor", "urllib3", "urllib.request"),
++    MovedAttribute("ProxyHandler", "urllib3", "urllib.request"),
++    MovedAttribute("BaseHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPPasswordMgr", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib3", "urllib.request"),
++    MovedAttribute("AbstractBasicAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPBasicAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("ProxyBasicAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("AbstractDigestAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPDigestAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("ProxyDigestAuthHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPSHandler", "urllib3", "urllib.request"),
++    MovedAttribute("FileHandler", "urllib3", "urllib.request"),
++    MovedAttribute("FTPHandler", "urllib3", "urllib.request"),
++    MovedAttribute("CacheFTPHandler", "urllib3", "urllib.request"),
++    MovedAttribute("UnknownHandler", "urllib3", "urllib.request"),
++    MovedAttribute("HTTPErrorProcessor", "urllib3", "urllib.request"),
+     MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+     MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+     MovedAttribute("URLopener", "urllib", "urllib.request"),
+diff -uNr a/bundled/aliyun/aliyun-cli/setup.py b/bundled/aliyun/aliyun-cli/setup.py
+--- a/bundled/aliyun/aliyun-cli/setup.py	2018-01-24 04:08:33.000000000 +0100
++++ b/bundled/aliyun/aliyun-cli/setup.py	2019-02-19 13:33:29.069848394 +0100
+@@ -24,7 +24,7 @@
+ 
+ install_requires = [
+         'colorama>=0.2.5,<=0.3.3',
+-        'jmespath>=0.7.0,<=0.7.1',
++        'jmespath>=0.7.0',
+         ]
+ def main():
+     setup(
diff --git a/SOURCES/bz1710058-Squid-1-fix-pidfile-issue.patch b/SOURCES/bz1710058-Squid-1-fix-pidfile-issue.patch
new file mode 100644
index 0000000..1ebb942
--- /dev/null
+++ b/SOURCES/bz1710058-Squid-1-fix-pidfile-issue.patch
@@ -0,0 +1,70 @@
+From d228d41c61f57f2576dd87aa7be86f9ca26e3059 Mon Sep 17 00:00:00 2001
+From: Oyvind Albrigtsen <oalbrigt@redhat.com>
+Date: Mon, 18 Mar 2019 16:03:14 +0100
+Subject: [PATCH] Squid: fix pid file issue due to new Squid version saving the
+ PID of the parent process instead of the listener child process
+
+---
+ heartbeat/Squid.in | 21 +++++----------------
+ 1 file changed, 5 insertions(+), 16 deletions(-)
+
+diff --git a/heartbeat/Squid.in b/heartbeat/Squid.in
+index a99892d75..0b3c8ea86 100644
+--- a/heartbeat/Squid.in
++++ b/heartbeat/Squid.in
+@@ -96,12 +96,9 @@ for a squid instance managed by this RA.
+ <content type="string" default=""/>
+ </parameter>
+ 
+-<parameter name="squid_pidfile" required="1" unique="1">
+-<longdesc lang="en">
+-This is a required parameter. This parameter specifies a process id file
+-for a squid instance managed by this RA.
+-</longdesc>
+-<shortdesc lang="en">Pidfile</shortdesc>
++<parameter name="squid_pidfile" required="0" unique="1">
++<longdesc lang="en">Deprecated - do not use anymore</longdesc>
++<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
+ <content type="string" default=""/>
+ </parameter>
+ 
+@@ -175,8 +172,8 @@ get_pids()
+ 	# Seek by pattern
+ 	SQUID_PIDS[0]=$(pgrep -f "$PROCESS_PATTERN")
+ 
+-	# Seek by pidfile
+-	SQUID_PIDS[1]=$(awk '1{print $1}' $SQUID_PIDFILE 2>/dev/null)
++	# Seek by child process
++	SQUID_PIDS[1]=$(pgrep -P ${SQUID_PIDS[0]})
+ 
+ 	if [[ -n "${SQUID_PIDS[1]}" ]]; then
+ 		typeset exe
+@@ -306,7 +303,6 @@ stop_squid()
+ 		while true; do
+ 			get_pids
+ 			if is_squid_dead; then
+-				rm -f $SQUID_PIDFILE
+ 				return $OCF_SUCCESS
+ 			fi
+ 			(( lapse_sec = lapse_sec + 1 ))
+@@ -326,7 +322,6 @@ stop_squid()
+ 		kill -KILL ${SQUID_PIDS[0]} ${SQUID_PIDS[2]}
+ 		sleep 1
+ 		if is_squid_dead; then
+-			rm -f $SQUID_PIDFILE
+ 			return $OCF_SUCCESS
+ 		fi
+ 	done
+@@ -389,12 +384,6 @@ if [[ ! -x "$SQUID_EXE" ]]; then
+ 	exit $OCF_ERR_CONFIGURED
+ fi
+ 
+-SQUID_PIDFILE="${OCF_RESKEY_squid_pidfile}"
+-if [[ -z "$SQUID_PIDFILE" ]]; then
+-	ocf_exit_reason "SQUID_PIDFILE is not defined"
+-	exit $OCF_ERR_CONFIGURED
+-fi
+-
+ SQUID_PORT="${OCF_RESKEY_squid_port}"
+ if [[ -z "$SQUID_PORT" ]]; then
+ 	ocf_exit_reason "SQUID_PORT is not defined"
diff --git a/SOURCES/bz1710058-Squid-2-dont-run-pgrep-without-PID.patch b/SOURCES/bz1710058-Squid-2-dont-run-pgrep-without-PID.patch
new file mode 100644
index 0000000..bb6a894
--- /dev/null
+++ b/SOURCES/bz1710058-Squid-2-dont-run-pgrep-without-PID.patch
@@ -0,0 +1,24 @@
+From e370845f41d39d93f76fa34502d62e2513d5eb73 Mon Sep 17 00:00:00 2001
+From: Oyvind Albrigtsen <oalbrigt@redhat.com>
+Date: Wed, 29 May 2019 14:07:46 +0200
+Subject: [PATCH] Squid: dont run pgrep -P without PID
+
+---
+ heartbeat/Squid.in | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/heartbeat/Squid.in b/heartbeat/Squid.in
+index 0b3c8ea86..e62e7ee66 100644
+--- a/heartbeat/Squid.in
++++ b/heartbeat/Squid.in
+@@ -173,7 +173,9 @@ get_pids()
+ 	SQUID_PIDS[0]=$(pgrep -f "$PROCESS_PATTERN")
+ 
+ 	# Seek by child process
+-	SQUID_PIDS[1]=$(pgrep -P ${SQUID_PIDS[0]})
++	if [[ -n "${SQUID_PIDS[0]}" ]]; then
++		SQUID_PIDS[1]=$(pgrep -P ${SQUID_PIDS[0]})
++	fi
+ 
+ 	if [[ -n "${SQUID_PIDS[1]}" ]]; then
+ 		typeset exe
diff --git a/SOURCES/bz1710060-gcloud-dont-detect-python2.patch b/SOURCES/bz1710060-gcloud-dont-detect-python2.patch
new file mode 100644
index 0000000..9abbd09
--- /dev/null
+++ b/SOURCES/bz1710060-gcloud-dont-detect-python2.patch
@@ -0,0 +1,29 @@
+diff -uNr a/bundled/gcp/google-cloud-sdk/bin/gcloud b/bundled/gcp/google-cloud-sdk/bin/gcloud
+--- a/bundled/gcp/google-cloud-sdk/bin/gcloud	2019-04-04 12:01:28.838027640 +0200
++++ b/bundled/gcp/google-cloud-sdk/bin/gcloud	2019-04-04 12:03:21.577089065 +0200
+@@ -74,24 +74,7 @@
+ 
+ # if CLOUDSDK_PYTHON is empty
+ if [ -z "$CLOUDSDK_PYTHON" ]; then
+-  # if python2 exists then plain python may point to a version != 2
+-  if _cloudsdk_which python2 >/dev/null; then
+-    CLOUDSDK_PYTHON=python2
+-  elif _cloudsdk_which python2.7 >/dev/null; then
+-    # this is what some OS X versions call their built-in Python
+-    CLOUDSDK_PYTHON=python2.7
+-  elif _cloudsdk_which python >/dev/null; then
+-    # Use unversioned python if it exists.
+-    CLOUDSDK_PYTHON=python
+-  elif _cloudsdk_which python3 >/dev/null; then
+-    # We support python3, but only want to default to it if nothing else is
+-    # found.
+-    CLOUDSDK_PYTHON=python3
+-  else
+-    # This won't work because it wasn't found above, but at this point this
+-    # is our best guess for the error message.
+-    CLOUDSDK_PYTHON=python
+-  fi
++  CLOUDSDK_PYTHON="/usr/libexec/platform-python"
+ fi
+ 
+ # $PYTHONHOME can interfere with gcloud. Users should use
diff --git a/SOURCES/bz1710061-aws-vpc-move-ip-avoid-possible-race-condition.patch b/SOURCES/bz1710061-aws-vpc-move-ip-avoid-possible-race-condition.patch
new file mode 100644
index 0000000..8899055
--- /dev/null
+++ b/SOURCES/bz1710061-aws-vpc-move-ip-avoid-possible-race-condition.patch
@@ -0,0 +1,104 @@
+From 57f695d336cab33c61e754e463654ad6400f7b58 Mon Sep 17 00:00:00 2001
+From: gguifelixamz <fguilher@amazon.com>
+Date: Tue, 27 Nov 2018 17:06:05 +0000
+Subject: [PATCH 1/4] Enable --query flag in DescribeRouteTable API call to
+ avoid race condition with grep
+
+---
+ heartbeat/aws-vpc-move-ip | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index 9b2043aca..d2aed7490 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -167,9 +167,10 @@ ec2ip_validate() {
+ ec2ip_monitor() {
+ 	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ] || ocf_is_probe; then
+ 		ocf_log info "monitor: check routing table (API call)"
+-		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table"
++                cmd=''$OCF_RESKEY_awscli' --profile '$OCF_RESKEY_profile' --output text ec2 describe-route-tables --route-table-ids '$OCF_RESKEY_routing_table' --query 'RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId''
+ 		ocf_log debug "executing command: $cmd"
+-		ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_ip | awk '{ print $3 }')"
++                ROUTE_TO_INSTANCE=$($cmd)
++                ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
+ 		if [ -z "$ROUTE_TO_INSTANCE" ]; then
+ 			ROUTE_TO_INSTANCE="<unknown>"
+ 		fi
+
+From 4d6371aca5dca35b902a480e07a08c1dc3373ca5 Mon Sep 17 00:00:00 2001
+From: gguifelixamz <fguilher@amazon.com>
+Date: Thu, 29 Nov 2018 11:39:26 +0000
+Subject: [PATCH 2/4] aws-vpc-move-ip: Fixed outer quotes and removed inner
+ quotes
+
+---
+ heartbeat/aws-vpc-move-ip | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index d2aed7490..ced69bd13 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -167,7 +167,7 @@ ec2ip_validate() {
+ ec2ip_monitor() {
+ 	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ] || ocf_is_probe; then
+ 		ocf_log info "monitor: check routing table (API call)"
+-                cmd=''$OCF_RESKEY_awscli' --profile '$OCF_RESKEY_profile' --output text ec2 describe-route-tables --route-table-ids '$OCF_RESKEY_routing_table' --query 'RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId''
++                cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId"
+ 		ocf_log debug "executing command: $cmd"
+                 ROUTE_TO_INSTANCE=$($cmd)
+                 ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
+
+From 09f4b061690a0e681aaf7314f1fc3e6f4e597cc8 Mon Sep 17 00:00:00 2001
+From: gguifelixamz <fguilher@amazon.com>
+Date: Thu, 29 Nov 2018 11:55:05 +0000
+Subject: [PATCH 3/4] aws-vpc-move-ip: Replaced indentation spaces with tabs
+ for consistency with the rest of the code
+
+---
+ heartbeat/aws-vpc-move-ip | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index ced69bd13..3e827283e 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -167,10 +167,10 @@ ec2ip_validate() {
+ ec2ip_monitor() {
+ 	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ] || ocf_is_probe; then
+ 		ocf_log info "monitor: check routing table (API call)"
+-                cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId"
++		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId"
+ 		ocf_log debug "executing command: $cmd"
+-                ROUTE_TO_INSTANCE=$($cmd)
+-                ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
++		ROUTE_TO_INSTANCE=$($cmd)
++		ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
+ 		if [ -z "$ROUTE_TO_INSTANCE" ]; then
+ 			ROUTE_TO_INSTANCE="<unknown>"
+ 		fi
+
+From fcf85551ce70cb4fb7ce24e21c361fdbe6fcce6b Mon Sep 17 00:00:00 2001
+From: gguifelixamz <fguilher@amazon.com>
+Date: Thu, 29 Nov 2018 13:07:32 +0000
+Subject: [PATCH 4/4] aws-vpc-move-ip: In cmd variable on ec2ip_monitor():
+ replaced _address with _ip and modified to use single quotes
+
+---
+ heartbeat/aws-vpc-move-ip | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index 3e827283e..331ee184f 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -167,7 +167,7 @@ ec2ip_validate() {
+ ec2ip_monitor() {
+ 	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ] || ocf_is_probe; then
+ 		ocf_log info "monitor: check routing table (API call)"
+-		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock==\`$OCF_RESKEY_address/32\`].InstanceId"
++		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock=='$OCF_RESKEY_ip/32'].InstanceId"
+ 		ocf_log debug "executing command: $cmd"
+ 		ROUTE_TO_INSTANCE=$($cmd)
+ 		ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
diff --git a/SOURCES/bz1710063-1-gcp-vpc-move-route-vip-fix-python3-encoding.patch b/SOURCES/bz1710063-1-gcp-vpc-move-route-vip-fix-python3-encoding.patch
new file mode 100644
index 0000000..9ad4c1d
--- /dev/null
+++ b/SOURCES/bz1710063-1-gcp-vpc-move-route-vip-fix-python3-encoding.patch
@@ -0,0 +1,46 @@
+From 17fe1dfeef1534b270e4765277cb8d7b42c4a9c4 Mon Sep 17 00:00:00 2001
+From: Oyvind Albrigtsen <oalbrigt@redhat.com>
+Date: Fri, 5 Apr 2019 09:15:40 +0200
+Subject: [PATCH] gcp-vpc-move-route/gcp-vpc-move-vip: fix Python 3 encoding
+ issue
+
+---
+ heartbeat/gcp-vpc-move-route.in | 2 +-
+ heartbeat/gcp-vpc-move-vip.in   | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/heartbeat/gcp-vpc-move-route.in b/heartbeat/gcp-vpc-move-route.in
+index 591b97b1c..7dd47150d 100644
+--- a/heartbeat/gcp-vpc-move-route.in
++++ b/heartbeat/gcp-vpc-move-route.in
+@@ -193,7 +193,7 @@ def get_metadata(metadata_key, params=None, timeout=None):
+   url = '%s?%s' % (metadata_url, params)
+   request = urlrequest.Request(url, headers=METADATA_HEADERS)
+   request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({}))
+-  return request_opener.open(request, timeout=timeout * 1.1).read()
++  return request_opener.open(request, timeout=timeout * 1.1).read().decode("utf-8")
+ 
+ 
+ def validate(ctx):
+diff --git a/heartbeat/gcp-vpc-move-vip.in b/heartbeat/gcp-vpc-move-vip.in
+index bd6cf86cd..953d61ed7 100755
+--- a/heartbeat/gcp-vpc-move-vip.in
++++ b/heartbeat/gcp-vpc-move-vip.in
+@@ -106,7 +106,7 @@ def get_metadata(metadata_key, params=None, timeout=None):
+   url = '%s?%s' % (metadata_url, params)
+   request = urlrequest.Request(url, headers=METADATA_HEADERS)
+   request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({}))
+-  return request_opener.open(request, timeout=timeout * 1.1).read()
++  return request_opener.open(request, timeout=timeout * 1.1).read().decode("utf-8")
+ 
+ 
+ def get_instance(project, zone, instance):
+@@ -162,7 +162,7 @@ def get_alias(project, zone, instance):
+ 
+ def get_localhost_alias():
+   net_iface = get_metadata('instance/network-interfaces', {'recursive': True})
+-  net_iface = json.loads(net_iface.decode('utf-8'))
++  net_iface = json.loads(net_iface)
+   try:
+     return net_iface[0]['ipAliases'][0]
+   except (KeyError, IndexError):
diff --git a/SOURCES/bz1710063-2-oauth2client-fix-python3-encoding.patch b/SOURCES/bz1710063-2-oauth2client-fix-python3-encoding.patch
new file mode 100644
index 0000000..06d2078
--- /dev/null
+++ b/SOURCES/bz1710063-2-oauth2client-fix-python3-encoding.patch
@@ -0,0 +1,11 @@
+--- ClusterLabs-resource-agents-e711383f/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/client.py	1980-01-01 09:00:00.000000000 +0100
++++ ClusterLabs-resource-agents-e711383f/bundled/gcp/google-cloud-sdk/lib/third_party/oauth2client/client.py.new	2019-05-28 10:42:54.366396838 +0200
+@@ -813,7 +813,7 @@
+ 
+         logger.info('Refreshing access_token')
+         resp, content = http_request(
+-            self.token_uri.encode('idna'), method='POST',
++            self.token_uri, method='POST',
+             body=body, headers=headers)
+         content = _helpers._from_bytes(content)
+         if resp.status == http_client.OK:
diff --git a/SOURCES/bz1714104-aws-vpc-move-ip-1-multi-route-table-support.patch b/SOURCES/bz1714104-aws-vpc-move-ip-1-multi-route-table-support.patch
new file mode 100644
index 0000000..b724aa3
--- /dev/null
+++ b/SOURCES/bz1714104-aws-vpc-move-ip-1-multi-route-table-support.patch
@@ -0,0 +1,122 @@
+--- a/heartbeat/aws-vpc-move-ip	2019-05-20 10:54:01.527329668 +0200
++++ b/heartbeat/aws-vpc-move-ip	2019-05-20 11:33:35.386089091 +0200
+@@ -93,11 +93,19 @@
+ <content type="string" default="" />
+ </parameter>
+ 
++<parameter name="address">
++<longdesc lang="en">
++Deprecated IP address param. Use the ip param instead.
++</longdesc>
++<shortdesc lang="en">Deprecated VPC private IP Address</shortdesc>
++<content type="string" 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. rtb-...
++Name of the routing table(s), where the route for the IP address should be changed. If declaring multiple routing tables they should be separated by comma. Example: rtb-XXXXXXXX,rtb-YYYYYYYYY
+ </longdesc>
+-<shortdesc lang="en">routing table name</shortdesc>
++<shortdesc lang="en">routing table name(s)</shortdesc>
+ <content type="string" default="" />
+ </parameter>
+ 
+@@ -129,6 +137,13 @@
+ END
+ }
+ 
++ec2ip_set_address_param_compat(){
++	# Include backward compatibility for the deprecated address parameter
++	if [ -z  "$OCF_RESKEY_ip" ] && [ -n "$OCF_RESKEY_address" ]; then
++		OCF_RESKEY_ip="$OCF_RESKEY_address"
++	fi
++}
++
+ ec2ip_validate() {
+ 	for cmd in aws ip curl; do
+ 		check_binary "$cmd"
+@@ -150,20 +165,29 @@
+ }
+ 
+ ec2ip_monitor() {
+-	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ]; then
+-		ocf_log info "monitor: check routing table (API call)"
+-		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table --query RouteTables[*].Routes[?DestinationCidrBlock=='$OCF_RESKEY_ip/32'].InstanceId"
+-		ocf_log debug "executing command: $cmd"
+-		ROUTE_TO_INSTANCE=$($cmd)
+-		ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
+-		if [ -z "$ROUTE_TO_INSTANCE" ]; then
+-			ROUTE_TO_INSTANCE="<unknown>"
+-		fi
++        MON_RES=""
++	if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ] || ocf_is_probe; then
++		for rtb in $(echo $OCF_RESKEY_routing_table | sed -e 's/,/ /g'); do
++			ocf_log info "monitor: check routing table (API call) - $rtb"
++			cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $rtb --query RouteTables[*].Routes[?DestinationCidrBlock=='$OCF_RESKEY_ip/32'].InstanceId"
++			ocf_log debug "executing command: $cmd"
++			ROUTE_TO_INSTANCE="$($cmd)"
++			ocf_log debug "Overlay IP is currently routed to ${ROUTE_TO_INSTANCE}"
++			if [ -z "$ROUTE_TO_INSTANCE" ]; then
++				ROUTE_TO_INSTANCE="<unknown>"
++			fi
++
++			if [ "$EC2_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ]; then 
++				ocf_log warn "not routed to this instance ($EC2_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE on $rtb"
++				MON_RES="$MON_RES $rtb"
++			fi
++			sleep 1
++		done
+ 
+-		if [ "$EC2_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ];then 
+-			ocf_log warn "not routed to this instance ($EC2_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE"
++		if [ ! -z "$MON_RES" ]; then
+ 			return $OCF_NOT_RUNNING
+ 		fi
++
+ 	else
+ 		ocf_log debug "monitor: Enhanced Monitoring disabled - omitting API call"
+ 	fi
+@@ -195,19 +219,23 @@
+ }
+ 
+ ec2ip_get_and_configure() {
+-	# Adjusting the routing table
+-	cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile ec2 replace-route --route-table-id $OCF_RESKEY_routing_table --destination-cidr-block ${OCF_RESKEY_ip}/32 --instance-id $EC2_INSTANCE_ID"
+-	ocf_log debug "executing command: $cmd"
+-	$cmd
+-	rc=$?
+-	if [ "$rc" != 0 ]; then
+-		ocf_log warn "command failed, rc: $rc"
+-		return $OCF_ERR_GENERIC
+-	fi
++	for rtb in $(echo $OCF_RESKEY_routing_table | sed -e 's/,/ /g'); do
++		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 replace-route --route-table-id $rtb --destination-cidr-block ${OCF_RESKEY_ip}/32 --instance-id $EC2_INSTANCE_ID"
++		ocf_log debug "executing command: $cmd"
++		$cmd
++		rc=$?
++		if [ "$rc" != 0 ]; then
++			ocf_log warn "command failed, rc: $rc"
++			return $OCF_ERR_GENERIC
++		fi
++		sleep 1
++	done
+ 
+ 	# Reconfigure the local ip address
+ 	ec2ip_drop
+-	ip addr add "${OCF_RESKEY_ip}/32" dev $OCF_RESKEY_interface
++	cmd="ip addr add ${OCF_RESKEY_ip}/32 dev $OCF_RESKEY_interface"
++	ocf_log debug "executing command: $cmd"
++	$cmd
+ 	rc=$?
+ 	if [ $rc != 0 ]; then
+ 		ocf_log warn "command failed, rc: $rc"
+@@ -289,6 +317,8 @@
+ 	exit $OCF_ERR_PERM
+ fi
+ 
++ec2ip_set_address_param_compat
++
+ ec2ip_validate
+ 
+ case $__OCF_ACTION in
diff --git a/SOURCES/bz1714104-aws-vpc-move-ip-2-fix-route-update-multi-NICs.patch b/SOURCES/bz1714104-aws-vpc-move-ip-2-fix-route-update-multi-NICs.patch
new file mode 100644
index 0000000..c283801
--- /dev/null
+++ b/SOURCES/bz1714104-aws-vpc-move-ip-2-fix-route-update-multi-NICs.patch
@@ -0,0 +1,221 @@
+From 9f2b9cc09f7e2df163ff95585374f860f3dc58eb Mon Sep 17 00:00:00 2001
+From: Tomas Krojzl <tomas_krojzl@cz.ibm.com>
+Date: Tue, 16 Apr 2019 18:40:29 +0200
+Subject: [PATCH 1/6] Fix for VM having multiple network interfaces
+
+---
+ heartbeat/aws-vpc-move-ip | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index 090956434..a91c2dd11 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -219,8 +219,28 @@ ec2ip_drop() {
+ }
+ 
+ ec2ip_get_and_configure() {
++	cmd="ip -br link show dev $OCF_RESKEY_interface | tr -s ' ' | cut -d' ' -f3"
++	ocf_log debug "executing command: $cmd"
++	MAC_ADDR="$(eval $cmd)"
++	rc=$?
++	if [ $rc != 0 ]; then
++		ocf_log warn "command failed, rc: $rc"
++		return $OCF_ERR_GENERIC
++	fi
++  ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
++
++	cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-instances --instance-ids $EC2_INSTANCE_ID --query 'Reservations[*].Instances[*].NetworkInterfaces[*].[NetworkInterfaceId,MacAddress]' | grep ${MAC_ADDR} | cut -f1"
++	ocf_log debug "executing command: $cmd"
++	EC2_NETWORK_INTERFACE_ID="$(eval $cmd)"
++	rc=$?
++	if [ $rc != 0 ]; then
++		ocf_log warn "command failed, rc: $rc"
++		return $OCF_ERR_GENERIC
++	fi
++  ocf_log debug "network interface id associated MAC address ${MAC_ADDR}: ${EC2_NETWORK_INTERFACE_ID}"
++
+ 	for rtb in $(echo $OCF_RESKEY_routing_table | sed -e 's/,/ /g'); do
+-		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 replace-route --route-table-id $rtb --destination-cidr-block ${OCF_RESKEY_ip}/32 --instance-id $EC2_INSTANCE_ID"
++		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 replace-route --route-table-id $rtb --destination-cidr-block ${OCF_RESKEY_ip}/32 --network-interface-id $EC2_NETWORK_INTERFACE_ID"
+ 		ocf_log debug "executing command: $cmd"
+ 		$cmd
+ 		rc=$?
+
+From a871a463134ebb2456b5f37a343bf9034f5f4074 Mon Sep 17 00:00:00 2001
+From: krojzl <tomas_krojzl@cz.ibm.com>
+Date: Tue, 16 Apr 2019 18:49:32 +0200
+Subject: [PATCH 2/6] Fixing indentation
+
+---
+ heartbeat/aws-vpc-move-ip | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index a91c2dd11..a46d10d30 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -227,7 +227,7 @@ ec2ip_get_and_configure() {
+ 		ocf_log warn "command failed, rc: $rc"
+ 		return $OCF_ERR_GENERIC
+ 	fi
+-  ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
++	ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 
+ 	cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-instances --instance-ids $EC2_INSTANCE_ID --query 'Reservations[*].Instances[*].NetworkInterfaces[*].[NetworkInterfaceId,MacAddress]' | grep ${MAC_ADDR} | cut -f1"
+ 	ocf_log debug "executing command: $cmd"
+@@ -237,7 +237,7 @@ ec2ip_get_and_configure() {
+ 		ocf_log warn "command failed, rc: $rc"
+ 		return $OCF_ERR_GENERIC
+ 	fi
+-  ocf_log debug "network interface id associated MAC address ${MAC_ADDR}: ${EC2_NETWORK_INTERFACE_ID}"
++	ocf_log debug "network interface id associated MAC address ${MAC_ADDR}: ${EC2_NETWORK_INTERFACE_ID}"
+ 
+ 	for rtb in $(echo $OCF_RESKEY_routing_table | sed -e 's/,/ /g'); do
+ 		cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 replace-route --route-table-id $rtb --destination-cidr-block ${OCF_RESKEY_ip}/32 --network-interface-id $EC2_NETWORK_INTERFACE_ID"
+
+From 068680427dff620a948ae25f090bc154b02f17b9 Mon Sep 17 00:00:00 2001
+From: krojzl <tomas_krojzl@cz.ibm.com>
+Date: Wed, 17 Apr 2019 14:22:31 +0200
+Subject: [PATCH 3/6] Requested fix to avoid using AWS API
+
+---
+ heartbeat/aws-vpc-move-ip | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index a46d10d30..2910552f2 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -229,7 +229,7 @@ ec2ip_get_and_configure() {
+ 	fi
+ 	ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 
+-	cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-instances --instance-ids $EC2_INSTANCE_ID --query 'Reservations[*].Instances[*].NetworkInterfaces[*].[NetworkInterfaceId,MacAddress]' | grep ${MAC_ADDR} | cut -f1"
++	cmd="curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id"
+ 	ocf_log debug "executing command: $cmd"
+ 	EC2_NETWORK_INTERFACE_ID="$(eval $cmd)"
+ 	rc=$?
+
+From 207a2ba66ba7196180d27674aa204980fcd25de2 Mon Sep 17 00:00:00 2001
+From: krojzl <tomas_krojzl@cz.ibm.com>
+Date: Fri, 19 Apr 2019 11:14:21 +0200
+Subject: [PATCH 4/6] More robust approach of getting MAC address
+
+---
+ heartbeat/aws-vpc-move-ip | 29 +++++++++++++++++++++--------
+ 1 file changed, 21 insertions(+), 8 deletions(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index 2910552f2..3a848b7e3 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -219,15 +219,28 @@ ec2ip_drop() {
+ }
+ 
+ ec2ip_get_and_configure() {
+-	cmd="ip -br link show dev $OCF_RESKEY_interface | tr -s ' ' | cut -d' ' -f3"
+-	ocf_log debug "executing command: $cmd"
+-	MAC_ADDR="$(eval $cmd)"
+-	rc=$?
+-	if [ $rc != 0 ]; then
+-		ocf_log warn "command failed, rc: $rc"
+-		return $OCF_ERR_GENERIC
++	MAC_FILE="/sys/class/net/${OCF_RESKEY_interface}/address"
++	if [ -f $MAC_FILE ]; then
++		cmd="cat ${MAC_FILE}"
++		ocf_log debug "executing command: $cmd"
++		MAC_ADDR="$(eval $cmd)"
++		rc=$?
++		if [ $rc != 0 ]; then
++			ocf_log warn "command failed, rc: $rc"
++			return $OCF_ERR_GENERIC
++		fi
++		ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
++	else
++		cmd="ip -br link show dev ${OCF_RESKEY_interface} | tr -s ' ' | cut -d' ' -f3"
++		ocf_log debug "executing command: $cmd"
++		MAC_ADDR="$(eval $cmd)"
++		rc=$?
++		if [ $rc != 0 ]; then
++			ocf_log warn "command failed, rc: $rc"
++			return $OCF_ERR_GENERIC
++		fi
++		ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 	fi
+-	ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 
+ 	cmd="curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id"
+ 	ocf_log debug "executing command: $cmd"
+
+From cdcc12a9c1431125b0d5298176e5242bfc9fbe29 Mon Sep 17 00:00:00 2001
+From: krojzl <tomas_krojzl@cz.ibm.com>
+Date: Fri, 19 Apr 2019 11:20:09 +0200
+Subject: [PATCH 5/6] Moving shared part outside if
+
+---
+ heartbeat/aws-vpc-move-ip | 25 +++++++++----------------
+ 1 file changed, 9 insertions(+), 16 deletions(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index 3a848b7e3..bfe23e5bf 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -222,26 +222,19 @@ ec2ip_get_and_configure() {
+ 	MAC_FILE="/sys/class/net/${OCF_RESKEY_interface}/address"
+ 	if [ -f $MAC_FILE ]; then
+ 		cmd="cat ${MAC_FILE}"
+-		ocf_log debug "executing command: $cmd"
+-		MAC_ADDR="$(eval $cmd)"
+-		rc=$?
+-		if [ $rc != 0 ]; then
+-			ocf_log warn "command failed, rc: $rc"
+-			return $OCF_ERR_GENERIC
+-		fi
+-		ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 	else
+ 		cmd="ip -br link show dev ${OCF_RESKEY_interface} | tr -s ' ' | cut -d' ' -f3"
+-		ocf_log debug "executing command: $cmd"
+-		MAC_ADDR="$(eval $cmd)"
+-		rc=$?
+-		if [ $rc != 0 ]; then
+-			ocf_log warn "command failed, rc: $rc"
+-			return $OCF_ERR_GENERIC
+-		fi
+-		ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
+ 	fi
+ 
++	ocf_log debug "executing command: $cmd"
++	MAC_ADDR="$(eval $cmd)"
++	rc=$?
++	if [ $rc != 0 ]; then
++		ocf_log warn "command failed, rc: $rc"
++		return $OCF_ERR_GENERIC
++	fi
++	ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}"
++
+ 	cmd="curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id"
+ 	ocf_log debug "executing command: $cmd"
+ 	EC2_NETWORK_INTERFACE_ID="$(eval $cmd)"
+
+From c3fc114fc64f6feb015c5342923fd2afc367ae28 Mon Sep 17 00:00:00 2001
+From: krojzl <tomas_krojzl@cz.ibm.com>
+Date: Fri, 19 Apr 2019 11:22:55 +0200
+Subject: [PATCH 6/6] Linting adjustment
+
+---
+ heartbeat/aws-vpc-move-ip | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip
+index bfe23e5bf..2757c27d0 100755
+--- a/heartbeat/aws-vpc-move-ip
++++ b/heartbeat/aws-vpc-move-ip
+@@ -225,7 +225,6 @@ ec2ip_get_and_configure() {
+ 	else
+ 		cmd="ip -br link show dev ${OCF_RESKEY_interface} | tr -s ' ' | cut -d' ' -f3"
+ 	fi
+-
+ 	ocf_log debug "executing command: $cmd"
+ 	MAC_ADDR="$(eval $cmd)"
+ 	rc=$?
diff --git a/SOURCES/python3-syntax-fixes.patch b/SOURCES/python3-syntax-fixes.patch
index d3b8012..a037ae1 100644
--- a/SOURCES/python3-syntax-fixes.patch
+++ b/SOURCES/python3-syntax-fixes.patch
@@ -572,50 +572,6 @@ diff -uNr a/bundled/aliyun/aliyun-cli/aliyuncli/paramOptimize.py b/bundled/aliyu
 -            }
 \ No newline at end of file
 +            }
-diff -uNr a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/http/format_type.py b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/http/format_type.py
---- a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/http/format_type.py	2018-06-11 09:10:15.000000000 +0200
-+++ b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/http/format_type.py	2018-10-08 12:08:11.121188112 +0200
-@@ -46,9 +46,9 @@
- 
- 
- if __name__ == "__main__":
--    print map_format_to_accept(XML)
--    print map_format_to_accept(JSON)
--    print map_format_to_accept(RAW)
--    print map_accept_to_format("application/xml")
--    print map_accept_to_format("text/xml")
--    print map_accept_to_format("application/json")
-+    print(map_format_to_accept(XML))
-+    print(map_format_to_accept(JSON))
-+    print(map_format_to_accept(RAW))
-+    print(map_accept_to_format("application/xml"))
-+    print(map_accept_to_format("text/xml"))
-+    print(map_accept_to_format("application/json"))
-diff -uNr a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/profile/location_service.py b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/profile/location_service.py
---- a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/profile/location_service.py	2018-06-11 09:10:15.000000000 +0200
-+++ b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/profile/location_service.py	2018-10-08 12:08:11.121188112 +0200
-@@ -159,7 +159,7 @@
-                 else:
-                     return endpoint[0].get('Endpoint')
-             elif 400 <= status < 500:
--                # print "serviceCode=" + service_code + " get location error!
-+                # print("serviceCode=" + service_code + " get location error!)
-                 # code=" + result.get('Code') +", message =" +
-                 # result.get('Message')
-                 return None
-diff -uNr a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/utils/parameter_helper.py b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/utils/parameter_helper.py
---- a/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/utils/parameter_helper.py	2018-06-11 09:10:15.000000000 +0200
-+++ b/bundled/aliyun/aliyun-python-sdk-core/aliyunsdkcore/utils/parameter_helper.py	2018-10-08 12:08:11.122188094 +0200
-@@ -62,6 +62,6 @@
- 
- 
- if __name__ == "__main__":
--    print get_uuid()
--    print get_iso_8061_date()
--    print get_rfc_2616_date()
-+    print(get_uuid())
-+    print(get_iso_8061_date())
-+    print(get_rfc_2616_date())
 diff -uNr a/bundled/aliyun/colorama/demos/demo07.py b/bundled/aliyun/colorama/demos/demo07.py
 --- a/bundled/aliyun/colorama/demos/demo07.py	2015-01-06 11:41:47.000000000 +0100
 +++ b/bundled/aliyun/colorama/demos/demo07.py	2018-10-08 12:20:25.598622106 +0200
diff --git a/SPECS/resource-agents.spec b/SPECS/resource-agents.spec
index 07e17d7..e8ed8c7 100644
--- a/SPECS/resource-agents.spec
+++ b/SPECS/resource-agents.spec
@@ -33,7 +33,7 @@
 ## google cloud
 # google-cloud-sdk bundle
 %global googlecloudsdk		google-cloud-sdk
-%global googlecloudsdk_version	206.0.0
+%global googlecloudsdk_version	241.0.0
 %global googlecloudsdk_dir	%{bundled_lib_dir}/gcp/%{googlecloudsdk}
 # python-pyroute2 bundle
 %global pyroute2		pyroute2
@@ -44,17 +44,13 @@
 %global colorama		colorama
 %global colorama_version	0.3.3
 %global colorama_dir		%{bundled_lib_dir}/aliyun/%{colorama}
-# python-jmespath bundle
-%global jmespath		jmespath
-%global jmespath_version	0.7.1
-%global jmespath_dir		%{bundled_lib_dir}/aliyun/%{jmespath}
 # python-pycryptodome bundle
 %global pycryptodome		pycryptodome
 %global pycryptodome_version	3.6.4
 %global pycryptodome_dir	%{bundled_lib_dir}/aliyun/%{pycryptodome}
 # python-aliyun-sdk-core bundle
 %global aliyunsdkcore		aliyun-python-sdk-core
-%global aliyunsdkcore_version	2.8.5
+%global aliyunsdkcore_version	2.13.1
 %global aliyunsdkcore_dir	%{bundled_lib_dir}/aliyun/%{aliyunsdkcore}
 # python-aliyun-sdk-ecs bundle
 %global aliyunsdkecs		aliyun-python-sdk-ecs
@@ -76,7 +72,7 @@
 Name:		resource-agents
 Summary:	Open Source HA Reusable Cluster Resource Scripts
 Version:	4.1.1
-Release:	17%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist}
+Release:	17%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist}.3
 License:	GPLv2+ and LGPLv2+
 URL:		https://github.com/ClusterLabs/resource-agents
 %if 0%{?fedora} || 0%{?centos_version} || 0%{?rhel}
@@ -90,12 +86,11 @@ Source2:	%{saphana_prefix}-%{saphana_hash}.tar.gz
 Source3:	%{googlecloudsdk}-%{googlecloudsdk_version}-linux-x86_64.tar.gz
 Source4:	%{pyroute2}-%{pyroute2_version}.tar.gz
 Source5:	%{colorama}-%{colorama_version}.tar.gz
-Source6:	%{jmespath}-%{jmespath_version}.tar.gz
-Source7:	%{pycryptodome}-%{pycryptodome_version}.tar.gz
-Source8:	%{aliyunsdkcore}-%{aliyunsdkcore_version}.tar.gz
-Source9:	%{aliyunsdkecs}-%{aliyunsdkecs_version}.tar.gz
-Source10:	%{aliyunsdkvpc}-%{aliyunsdkvpc_version}.tar.gz
-Source11:	%{aliyuncli}-%{aliyuncli_version}.tar.gz
+Source6:	%{pycryptodome}-%{pycryptodome_version}.tar.gz
+Source7:	%{aliyunsdkcore}-%{aliyunsdkcore_version}.tar.gz
+Source8:	%{aliyunsdkecs}-%{aliyunsdkecs_version}.tar.gz
+Source9:	%{aliyunsdkvpc}-%{aliyunsdkvpc_version}.tar.gz
+Source10:	%{aliyuncli}-%{aliyuncli_version}.tar.gz
 Patch0:		nova-compute-wait-NovaEvacuate.patch
 Patch1:		LVM-volume_group_check_only.patch
 Patch2:		bz1552330-vdo-vol.patch
@@ -132,20 +127,29 @@ Patch32:	bz1642027-nfsserver-var-lib-nfs-fix.patch
 Patch33:	bz1662466-vdo-vol-fix-monitor-action.patch
 Patch34:	bz1643307-LVM-activate-dont-fail-initial-probe.patch
 Patch35:	bz1658664-LVM-activate-dont-require-locking_type.patch
+Patch36:	bz1710058-Squid-1-fix-pidfile-issue.patch
+Patch37:	bz1710063-1-gcp-vpc-move-route-vip-fix-python3-encoding.patch
+Patch38:	bz1710061-aws-vpc-move-ip-avoid-possible-race-condition.patch
+Patch39:	bz1714104-aws-vpc-move-ip-1-multi-route-table-support.patch
+Patch40:	bz1714104-aws-vpc-move-ip-2-fix-route-update-multi-NICs.patch
+Patch41:	bz1710058-Squid-2-dont-run-pgrep-without-PID.patch
 # bundle patches
 Patch1000:	7-gcp-bundled.patch
 Patch1001:	8-google-cloud-sdk-fixes.patch
 Patch1002:	9-google-cloud-sdk-oauth2client-python-rsa-to-cryptography.patch
 Patch1003:	10-gcloud-support-info.patch
-Patch1004:	aliyun-vpc-move-ip-4-bundled.patch
-Patch1005:	python3-syntax-fixes.patch
+Patch1004:	bz1710060-gcloud-dont-detect-python2.patch
+Patch1005:	aliyun-vpc-move-ip-4-bundled.patch
+Patch1006:	python3-syntax-fixes.patch
+Patch1007:	aliyuncli-python3-fixes.patch
+Patch1008:	bz1710063-2-oauth2client-fix-python3-encoding.patch
 
 Obsoletes:	heartbeat-resources <= %{version}
 Provides:	heartbeat-resources = %{version}
 
 # Build dependencies
 BuildRequires: automake autoconf gcc
-BuildRequires: perl-interpreter perl-generators python-devel
+BuildRequires: perl-interpreter python3-devel
 BuildRequires: libxslt glib2-devel
 BuildRequires: systemd
 BuildRequires: which
@@ -205,12 +209,10 @@ Group:		System Environment/Base
 Group:		Productivity/Clustering/HA
 %endif
 Requires:	%{name} = %{version}-%{release}
+Requires:	python3-jmespath >= 0.9.0
+Requires:	python3-urllib3
 # python-colorama bundle
 Provides:	bundled(python-%{colorama}) = %{colorama_version}
-# python-jmespath bundle
-Provides:	bundled(python-jmespath) = %{jmespath_version}
-Requires:	python3-dateutil >= 1.4
-Requires:	python3-docutils >= 0.10
 # python-pycryptodome bundle
 Provides:	bundled(python-%{pycryptodome}) = %{pycryptodome_version}
 # python-aliyun-sdk-core bundle
@@ -237,6 +239,7 @@ Group:		System Environment/Base
 Group:		Productivity/Clustering/HA
 %endif
 Requires:	%{name} = %{version}-%{release}
+Requires:	python3-google-api-client
 # google-cloud-sdk bundle
 Requires:	python3-cryptography >= 1.7.2
 Requires:	python3-dateutil >= 2.6.0
@@ -246,6 +249,7 @@ Provides:	bundled(python-appdirs) = 1.4.0
 Provides:	bundled(python-argparse) = 1.2.1
 Provides:	bundled(python-chardet) = 2.3.0
 Provides:	bundled(python-dulwich) = 0.10.2
+Provides:	bundled(python-httplib2) = 0.11.3
 Provides:	bundled(python-ipaddress) = 1.0.16
 Provides:	bundled(python-ipaddr) = 2.1.11
 Provides:	bundled(python-mako) = 1.0.7
@@ -348,6 +352,12 @@ exit 1
 %patch33 -p1
 %patch34 -p1
 %patch35 -p1
+%patch36 -p1
+%patch37 -p1
+%patch38 -p1 -F2
+%patch39 -p1
+%patch40 -p1
+%patch41 -p1
 
 chmod 755 heartbeat/nova-compute-wait
 chmod 755 heartbeat/NovaEvacuate
@@ -372,14 +382,16 @@ tar -xzf %SOURCE3 -C %{bundled_lib_dir}/gcp
 %patch1002 -p1
 # gcloud support info
 %patch1003 -p1
+# gcloud remove python 2 detection
+%patch1004 -p1
 # rename gcloud
 mv %{googlecloudsdk_dir}/bin/gcloud %{googlecloudsdk_dir}/bin/gcloud-ra
 # keep googleapiclient
 mv %{googlecloudsdk_dir}/platform/bq/third_party/googleapiclient %{googlecloudsdk_dir}/lib/third_party
 # only keep gcloud
 rm -rf %{googlecloudsdk_dir}/bin/{bootstrapping,bq,dev_appserver.py,docker-credential-gcloud,endpointscfg.py,git-credential-gcloud.sh,gsutil,java_dev_appserver.sh} %{googlecloudsdk_dir}/{completion.*,deb,install.*,path.*,platform,properties,RELEASE_NOTES,rpm,VERSION}
-# remove Python 3 code
-rm -rf %{googlecloudsdk_dir}/lib/third_party/*/python3
+# remove Python 2 code
+rm -rf %{googlecloudsdk_dir}/lib/third_party/*/python2
 # remove python-rsa
 rm -rf %{googlecloudsdk_dir}/lib/third_party/rsa
 # remove grpc
@@ -420,7 +432,6 @@ cp %{googlecloudsdk_dir}/lib/third_party/ruamel/LICENSE %{googlecloudsdk}_ruamel
 cp %{googlecloudsdk_dir}/lib/third_party/appdirs/LICENSE %{googlecloudsdk}_appdirs_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/argcomplete/LICENSE %{googlecloudsdk}_argcomplete_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/pyasn1_modules/LICENSE %{googlecloudsdk}_pyasn1_modules_LICENSE
-cp %{googlecloudsdk_dir}/lib/third_party/typing/LICENSE %{googlecloudsdk}_typing_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/setuptools/LICENSE %{googlecloudsdk}_setuptools_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/google/LICENSE %{googlecloudsdk}_google_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/google/protobuf/LICENSE %{googlecloudsdk}_protobuf_LICENSE
@@ -432,7 +443,6 @@ cp %{googlecloudsdk_dir}/lib/third_party/fancy_urllib/LICENSE %{googlecloudsdk}_
 cp %{googlecloudsdk_dir}/lib/third_party/pyasn1/LICENSE %{googlecloudsdk}_pyasn1_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/apitools/LICENSE %{googlecloudsdk}_apitools_LICENSE
 cp %{googlecloudsdk_dir}/lib/third_party/containerregistry/LICENSE %{googlecloudsdk}_containerregistry_LICENSE
-cp %{googlecloudsdk_dir}/lib/third_party/prompt_toolkit/LICENSE %{googlecloudsdk}_prompt_toolkit_LICENSE
 
 # python-pyroute2 bundle
 tar -xzf %SOURCE4 -C %{bundled_lib_dir}/gcp
@@ -453,47 +463,41 @@ pushd %{colorama_dir}
 rm -rf *.egg-info
 popd
 
-# python-jmespath bundle
-tar -xzf %SOURCE6 -C %{bundled_lib_dir}/aliyun
-mv %{bundled_lib_dir}/aliyun/jmespath.py-%{jmespath_version} %{jmespath_dir}
-cp %{jmespath_dir}/LICENSE.txt %{jmespath}_LICENSE.txt
-cp %{jmespath_dir}/README.rst %{jmespath}_README.rst
-
-pushd %{jmespath_dir}
-rm -rf jmespath.egg-info
-popd
-
 # python-pycryptodome bundle
-tar -xzf %SOURCE7 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE6 -C %{bundled_lib_dir}/aliyun
 mv %{bundled_lib_dir}/aliyun/%{pycryptodome}-%{pycryptodome_version} %{pycryptodome_dir}
 cp %{pycryptodome_dir}/README.rst %{pycryptodome}_README.rst
 cp %{pycryptodome_dir}/LICENSE.rst %{pycryptodome}_LICENSE.rst
 
 # python-aliyun-sdk-core bundle
-tar -xzf %SOURCE8 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE7 -C %{bundled_lib_dir}/aliyun
 mv %{bundled_lib_dir}/aliyun/%{aliyunsdkcore}-%{aliyunsdkcore_version} %{aliyunsdkcore_dir}
 cp %{aliyunsdkcore_dir}/README.rst %{aliyunsdkcore}_README.rst
 
 # python-aliyun-sdk-ecs bundle
-tar -xzf %SOURCE9 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE8 -C %{bundled_lib_dir}/aliyun
 mv %{bundled_lib_dir}/aliyun/%{aliyunsdkecs}-%{aliyunsdkecs_version} %{aliyunsdkecs_dir}
 cp %{aliyunsdkecs_dir}/README.rst %{aliyunsdkecs}_README.rst
 
 # python-aliyun-sdk-vpc bundle
-tar -xzf %SOURCE10 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE9 -C %{bundled_lib_dir}/aliyun
 mv %{bundled_lib_dir}/aliyun/%{aliyunsdkvpc}-%{aliyunsdkvpc_version} %{aliyunsdkvpc_dir}
 cp %{aliyunsdkvpc_dir}/README.rst %{aliyunsdkvpc}_README.rst
 
 # aliyuncli bundle
-tar -xzf %SOURCE11 -C %{bundled_lib_dir}/aliyun
+tar -xzf %SOURCE10 -C %{bundled_lib_dir}/aliyun
 mv %{bundled_lib_dir}/aliyun/%{aliyuncli}-%{aliyuncli_version} %{aliyuncli_dir}
 cp %{aliyuncli_dir}/README.rst %{aliyuncli}_README.rst
 cp %{aliyuncli_dir}/LICENSE %{aliyuncli}_LICENSE
 # aliyun*: use bundled libraries
-%patch1004 -p1
+%patch1005 -p1
 
 # aliyun Python 3 fixes
-%patch1005 -p1
+%patch1006 -p1
+%patch1007 -p1
+
+# google-cloud-sdk oauth2client fix Python 3 encoding issue
+%patch1008 -p1
 %endif
 
 %build
@@ -553,11 +557,6 @@ pushd %{colorama_dir}
 %{__python3} setup.py build
 popd
 
-# python-jmespath bundle
-pushd %{jmespath_dir}
-CFLAGS="%{optflags}" %{__python3} setup.py %{?py_setup_args} build --executable="%{__python3} -s"
-popd
-
 # python-pycryptodome bundle
 pushd %{pycryptodome_dir}
 %{__python3} setup.py build
@@ -588,6 +587,9 @@ popd
 rm -rf %{buildroot}
 make install DESTDIR=%{buildroot}
 
+# byte compile ocf.py
+%py_byte_compile %{__python3} %{buildroot}%{_usr}/lib/ocf/lib/heartbeat
+
 mv %{sap_script_prefix}-%{sap_script_hash}/redhat/sap_redhat_cluster_connector %{buildroot}/%{_sbindir}
 
 # google-cloud-sdk bundle
@@ -609,12 +611,6 @@ pushd %{colorama_dir}
 %{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/aliyun
 popd
 
-# python-jmespath bundle
-pushd %{jmespath_dir}
-CFLAGS="%{optflags}" %{__python3} setup.py %{?py_setup_args} install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/aliyun
-popd
-rm %{buildroot}/%{_bindir}/jp.py
-
 # python-pycryptodome bundle
 pushd %{pycryptodome_dir}
 %{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/aliyun
@@ -638,7 +634,7 @@ popd
 # aliyuncli bundle
 pushd %{aliyuncli_dir}
 %{__python3} setup.py install -O1 --skip-build --root %{buildroot} --install-lib /usr/lib/%{name}/%{bundled_lib_dir}/aliyun
-sed -i -e "/^import sys/asys.path.insert(0, '/usr/lib/%{name}/%{bundled_lib_dir}/aliyun')" %{buildroot}/%{_bindir}/aliyuncli
+sed -i -e "/^import sys/asys.path.insert(0, '/usr/lib/%{name}/%{bundled_lib_dir}/aliyun')\nsys.path.insert(1, '/usr/lib/%{name}/%{bundled_lib_dir}/aliyun/aliyuncli')" %{buildroot}/%{_bindir}/aliyuncli
 mv %{buildroot}/%{_bindir}/aliyuncli %{buildroot}/%{_bindir}/aliyuncli-ra
 # aliyun_completer / aliyun_zsh_complete.sh
 rm %{buildroot}/%{_bindir}/aliyun_*
@@ -791,6 +787,8 @@ rm -rf %{buildroot}
 %exclude /usr/lib/ocf/resource.d/heartbeat/rsyslog
 %exclude /usr/lib/ocf/resource.d/heartbeat/vsftpd
 %exclude /usr/lib/ocf/resource.d/heartbeat/ZFS
+%exclude %{_mandir}/man7/ocf_heartbeat_clvm
+%exclude %{_mandir}/man7/ocf_heartbeat_LVM
 %exclude %{_mandir}/man7/ocf_heartbeat_AoEtarget.7.gz
 %exclude %{_mandir}/man7/ocf_heartbeat_AudibleAlarm.7.gz
 %exclude %{_mandir}/man7/ocf_heartbeat_ClusterMon.7.gz
@@ -880,8 +878,8 @@ ccs_update_schema > /dev/null 2>&1 ||:
 
 %ifarch x86_64
 %files aliyun
-%doc %{aliyuncli}_README.rst %{colorama}_README.rst %{jmespath}_README.rst %{pycryptodome}_README.rst aliyun*_README*
-%license %{aliyuncli}_LICENSE %{colorama}_LICENSE.txt %{jmespath}_LICENSE.txt %{pycryptodome}_LICENSE.rst
+%doc %{aliyuncli}_README.rst %{colorama}_README.rst %{pycryptodome}_README.rst aliyun*_README*
+%license %{aliyuncli}_LICENSE %{colorama}_LICENSE.txt %{pycryptodome}_LICENSE.rst
 %defattr(-,root,root)
 /usr/lib/ocf/resource.d/heartbeat/aliyun-vpc-move-ip*
 %{_mandir}/man7/*aliyun-vpc-move-ip*
@@ -927,6 +925,28 @@ ccs_update_schema > /dev/null 2>&1 ||:
 %endif
 
 %changelog
+* Wed May 29 2019 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-17.3
+- Squid: fix PID file issue
+
+  Resolves: rhbz#1710058
+
+* Wed May 29 2019 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-17.2
+- gcp-vpc-move-route/gcp-vpc-move-vip: fix Python 3 encoding issue
+- aws-vpc-move-ip: add multi route-table support and fix issue
+  w/multiple NICs
+
+  Resolves: rhbz#1710063
+  Resolves: rhbz#1714104
+
+* Wed May 15 2019 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-17.1
+- gcloud-ra: fix Python 3 issue and remove Python 2 detection
+- aliyuncli-ra: upgrade bundled python-aliyun-sdk-core and fix Python 3 issues
+- aws-vpc-move-ip: use "--query" to avoid a possible race condition
+
+  Resolves: rhbz#1710060
+  Resolves: rhbz#1710057
+  Resolves: rhbz#1710061
+
 * Tue Feb  5 2019 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.1.1-17
 - LVM-activate: dont require locking_type