diff --git a/boto-2.39.0-devendor.patch b/boto-2.39.0-devendor.patch
new file mode 100644
index 0000000000000000000000000000000000000000..209e1fe13bf473b559895377e66b2bd79f3e0a05
--- /dev/null
+++ b/boto-2.39.0-devendor.patch
@@ -0,0 +1,54 @@
+Index: boto-2.39.0/boto/compat.py
+===================================================================
+--- boto-2.39.0.orig/boto/compat.py
++++ boto-2.39.0/boto/compat.py
+@@ -46,16 +46,27 @@ except (AttributeError, ImportError):
+ # This is probably running on App Engine.
+ expanduser = (lambda x: x)
+
+-from boto.vendored import six
++try:
++ import six
++ from six import BytesIO, StringIO
++ from six.moves import filter, http_client, map, _thread, \
++ urllib, zip
++ from six.moves.queue import Queue
++ from six.moves.urllib.parse import parse_qs, quote, unquote, \
++ urlparse, urlsplit
++ from six.moves.urllib.parse import unquote_plus
++ from six.moves.urllib.request import urlopen
++except ImportError:
++ from boto.vendored import six
+
+-from boto.vendored.six import BytesIO, StringIO
+-from boto.vendored.six.moves import filter, http_client, map, _thread, \
+- urllib, zip
+-from boto.vendored.six.moves.queue import Queue
+-from boto.vendored.six.moves.urllib.parse import parse_qs, quote, unquote, \
+- urlparse, urlsplit
+-from boto.vendored.six.moves.urllib.parse import unquote_plus
+-from boto.vendored.six.moves.urllib.request import urlopen
++ from boto.vendored.six import BytesIO, StringIO
++ from boto.vendored.six.moves import filter, http_client, map, _thread, \
++ urllib, zip
++ from boto.vendored.six.moves.queue import Queue
++ from boto.vendored.six.moves.urllib.parse import parse_qs, quote, unquote, \
++ urlparse, urlsplit
++ from boto.vendored.six.moves.urllib.parse import unquote_plus
++ from boto.vendored.six.moves.urllib.request import urlopen
+
+ if six.PY3:
+ # StandardError was removed, so use the base exception type instead
+Index: boto-2.39.0/setup.py
+===================================================================
+--- boto-2.39.0.orig/setup.py
++++ boto-2.39.0/setup.py
+@@ -76,7 +76,7 @@ setup(name = "boto",
+ "boto.elastictranscoder", "boto.opsworks", "boto.redshift",
+ "boto.dynamodb2", "boto.support", "boto.cloudtrail",
+ "boto.directconnect", "boto.kinesis", "boto.rds2",
+- "boto.cloudsearch2", "boto.logs", "boto.vendored",
++ "boto.cloudsearch2", "boto.logs",
+ "boto.route53.domains", "boto.cognito",
+ "boto.cognito.identity", "boto.cognito.sync",
+ "boto.cloudsearchdomain", "boto.kms",
diff --git a/boto-2.40.0-aws-exec-read.patch b/boto-2.40.0-aws-exec-read.patch
new file mode 100644
index 0000000000000000000000000000000000000000..39b0a8f0acb8b1e308efaf9d34936fa30ce24fb2
--- /dev/null
+++ b/boto-2.40.0-aws-exec-read.patch
@@ -0,0 +1,13 @@
+Index: boto-2.40.0/boto/s3/acl.py
+===================================================================
+--- boto-2.40.0.orig/boto/s3/acl.py
++++ boto-2.40.0/boto/s3/acl.py
+@@ -25,7 +25,7 @@ from boto.s3.user import User
+ CannedACLStrings = ['private', 'public-read',
+ 'public-read-write', 'authenticated-read',
+ 'bucket-owner-read', 'bucket-owner-full-control',
+- 'log-delivery-write']
++ 'log-delivery-write', 'aws-exec-read']
+
+
+ class Policy(object):
diff --git a/boto-2.40.0-instance-attributes.patch b/boto-2.40.0-instance-attributes.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4f9182e44b0e76442fa6d713e9c6cbe6b6caa68f
--- /dev/null
+++ b/boto-2.40.0-instance-attributes.patch
@@ -0,0 +1,91 @@
+Index: boto-2.40.0/boto/ec2/instance.py
+===================================================================
+--- boto-2.40.0.orig/boto/ec2/instance.py
++++ boto-2.40.0/boto/ec2/instance.py
+@@ -631,7 +631,8 @@ class InstanceAttribute(dict):
+ 'disableApiTermination',
+ 'instanceInitiatedShutdownBehavior',
+ 'rootDeviceName', 'blockDeviceMapping', 'sourceDestCheck',
+- 'groupSet']
++ 'groupSet', 'productCodes', 'ebsOptimized',
++ 'sriovNetSupport']
+
+ def __init__(self, parent=None):
+ dict.__init__(self)
+Index: boto-2.40.0/tests/unit/ec2/test_attribute.py
+===================================================================
+--- /dev/null
++++ boto-2.40.0/tests/unit/ec2/test_attribute.py
+@@ -0,0 +1,72 @@
++from tests.unit import unittest
++from tests.compat import mock
++
++from boto.ec2.connection import EC2Connection, Instance
++
++ATTRIBUTE_GET_TRUE_EBSOPTIMIZED_RESPONSE = b"""
++
++ 59dbff89-35bd-4eac-99ed-be587EXAMPLE
++ i-10a64379
++
++ true
++
++
++"""
++
++ATTRIBUTE_GET_FALSE_EBSOPTIMIZED_RESPONSE = b"""
++
++ 59dbff89-35bd-4eac-99ed-be587EXAMPLE
++ i-10a64379
++
++ false
++
++
++"""
++
++ATTRIBUTE_GET_EMPTY_PRODUCTCODES_RESPONSE = b"""
++
++ 59dbff89-35bd-4eac-99ed-be587EXAMPLE
++ i-10a64379
++
++
++"""
++
++# Tests to be run on an InstanceAttributes
++# Format:
++# (EC2_RESPONSE_STRING, (string_of_attribute_to_test, value) )
++ATTRIBUTE_TESTS = [
++ (ATTRIBUTE_GET_TRUE_EBSOPTIMIZED_RESPONSE,
++ ('ebsOptimized', True)),
++ (ATTRIBUTE_GET_FALSE_EBSOPTIMIZED_RESPONSE,
++ ('ebsOptimized', False)),
++ (ATTRIBUTE_GET_EMPTY_PRODUCTCODES_RESPONSE,
++ ('productCodes', None)),
++]
++
++
++class TestInstanceAttributes(unittest.TestCase):
++ """Tests Instance Attributes."""
++ def _setup_mock(self):
++ """Sets up a mock ec2 request.
++ Returns: response, ec2 connection and Instance
++ """
++ mock_response = mock.Mock()
++ mock_response.status = 200
++ ec2 = EC2Connection(aws_access_key_id='aws_access_key_id',
++ aws_secret_access_key='aws_secret_access_key')
++ ec2.make_request = mock.Mock(return_value=mock_response)
++ return mock_response, ec2, Instance(ec2)
++
++ def test_instance_get_attributes(self):
++ """Tests the InstanceAttributes from the EC2 object."""
++ mock_response, _, instance = self._setup_mock()
++
++ for response, attr_test in ATTRIBUTE_TESTS:
++ mock_response.read.return_value = response
++ expected_value = dict([attr_test])
++ actual_value = instance.get_attribute(attr_test[0])
++ self.assertEqual(expected_value, actual_value)
++
++
++if __name__ == '__main__':
++ unittest.main()
diff --git a/boto-2.40.0-multi-vpc-zone.patch b/boto-2.40.0-multi-vpc-zone.patch
new file mode 100644
index 0000000000000000000000000000000000000000..90c9b4040f01d9a4e08e1020649f2709743be491
--- /dev/null
+++ b/boto-2.40.0-multi-vpc-zone.patch
@@ -0,0 +1,72 @@
+Index: boto-2.40.0/boto/route53/connection.py
+===================================================================
+--- boto-2.40.0.orig/boto/route53/connection.py
++++ boto-2.40.0/boto/route53/connection.py
+@@ -152,8 +152,8 @@ class Route53Connection(AWSAuthConnectio
+ raise exception.DNSServerError(response.status,
+ response.reason,
+ body)
+- e = boto.jsonresponse.Element(list_marker='NameServers',
+- item_marker=('NameServer',))
++ e = boto.jsonresponse.Element(list_marker=('NameServers', 'VPCs'),
++ item_marker=('NameServer', 'VPC'))
+ h = boto.jsonresponse.XmlHandler(e, None)
+ h.parse(body)
+ return e
+Index: boto-2.40.0/tests/integration/route53/test_zone.py
+===================================================================
+--- boto-2.40.0.orig/tests/integration/route53/test_zone.py
++++ boto-2.40.0/tests/integration/route53/test_zone.py
+@@ -186,6 +186,12 @@ class TestRoute53PrivateZone(unittest.Te
+ vpc_id=self.test_vpc.id,
+ vpc_region='us-east-1')
+
++ def test_get_hosted_zone_for_private_zone(self):
++ self.get_hosted_zone = self.route53.get_hosted_zone_by_name(self.base_domain)
++ self.assertEquals(len(self.get_hosted_zone['GetHostedZoneResponse']['VPCs']), 1)
++ self.assertEquals(self.get_hosted_zone['GetHostedZoneResponse']['VPCs'][0]['VPCRegion'], 'us-east-1')
++ self.assertEquals(self.get_hosted_zone['GetHostedZoneResponse']['VPCs'][0]['VPCId'], self.test_vpc.id)
++
+ @classmethod
+ def tearDownClass(self):
+ if self.zone is not None:
+Index: boto-2.40.0/tests/unit/route53/test_connection.py
+===================================================================
+--- boto-2.40.0.orig/tests/unit/route53/test_connection.py
++++ boto-2.40.0/tests/unit/route53/test_connection.py
+@@ -313,6 +313,16 @@ class TestGetHostedZoneRoute53(AWSMockSe
+ ns-1000.awsdns-00.co.uk
+
+
++
++
++ eu-west-1
++ vpc-12345
++
++
++ us-west-1
++ vpc-78900
++
++
+
+ """
+
+@@ -330,6 +340,18 @@ class TestGetHostedZoneRoute53(AWSMockSe
+ ['DelegationSet']['NameServers'],
+ ['ns-1000.awsdns-40.org', 'ns-200.awsdns-30.com',
+ 'ns-900.awsdns-50.net', 'ns-1000.awsdns-00.co.uk'])
++ self.assertEqual(response['GetHostedZoneResponse']
++ ['VPCs'][0]['VPCRegion'],
++ 'eu-west-1')
++ self.assertEqual(response['GetHostedZoneResponse']
++ ['VPCs'][0]['VPCId'],
++ 'vpc-12345')
++ self.assertEqual(response['GetHostedZoneResponse']
++ ['VPCs'][1]['VPCRegion'],
++ 'us-west-1')
++ self.assertEqual(response['GetHostedZoneResponse']
++ ['VPCs'][1]['VPCId'],
++ 'vpc-78900')
+
+
+ @attr(route53=True)
diff --git a/boto-2.40.0-nat-gateway.patch b/boto-2.40.0-nat-gateway.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5ff9d7634a1adf7878683f31d93ca1ec6ba7a6a2
--- /dev/null
+++ b/boto-2.40.0-nat-gateway.patch
@@ -0,0 +1,319 @@
+Index: boto-2.40.0/boto/vpc/__init__.py
+===================================================================
+--- boto-2.40.0.orig/boto/vpc/__init__.py
++++ boto-2.40.0/boto/vpc/__init__.py
+@@ -29,6 +29,7 @@ from boto.vpc.vpc import VPC
+ from boto.vpc.customergateway import CustomerGateway
+ from boto.vpc.networkacl import NetworkAcl
+ from boto.vpc.routetable import RouteTable
++from boto.vpc.natgateway import NatGateway
+ from boto.vpc.internetgateway import InternetGateway
+ from boto.vpc.vpngateway import VpnGateway, Attachment
+ from boto.vpc.dhcpoptions import DhcpOptions
+@@ -783,6 +784,76 @@ class VPCConnection(EC2Connection):
+
+ return self.get_status('DeleteNetworkAclEntry', params)
+
++ # NAT Gateways
++
++ def get_all_nat_gateways(self, nat_gateway_ids=None, filters=None, dry_run=False):
++ """
++ Get a list of NAT gateways. You can filter results to return information
++ about only those gateways that you're interested in.
++
++ :type nat_gateway_ids: list
++ :param nat_gateway_ids: A list of strings with the desired gateway IDs.
++
++ :type filters: list of tuples or dict
++ :param filters: A list of tuples or dict containing filters. Each tuple
++ or dict item consists of a filter key and a filter value.
++
++ :type dry_run: bool
++ :param dry_run: Set to True if the operation should not actually run.
++
++ """
++ params = {}
++
++ if nat_gateway_ids:
++ self.build_list_params(params, nat_gateway_ids,
++ 'NatGatewayId')
++ if filters:
++ self.build_filter_params(params, filters)
++ if dry_run:
++ params['DryRun'] = 'true'
++ return self.get_list('DescribeNatGateways', params,
++ [('item', NatGateway)])
++
++ def create_nat_gateway(self, subnet_id, allocation_id, dry_run=False):
++ """
++ Creates a NAT gateway for VPC.
++
++ :type subnet_id: str
++ :param subnet_id: The subnet in which the NAT gateway should be launched.
++
++ :type allocation_id: str
++ :param allocation_id: The allocation ID of an elastic IP address for the public side of the gateway.
++
++ :type dry_run: bool
++ :param dry_run: Set to True if the operation should not actually run.
++
++ :rtype: Newly created nat gateway.
++ :return: `boto.vpc.natgateway.NATGateway`
++ """
++ params = {'SubnetId': subnet_id,
++ 'AllocationId': allocation_id}
++ if dry_run:
++ params['DryRun'] = 'true'
++ return self.get_object('CreateNatGateway', params, NatGateway)
++
++ def delete_nat_gateway(self, nat_gateway_id, dry_run=False):
++ """
++ Deletes a NAT gateway from the VPC.
++
++ :type nat_gateway_id: str
++ :param nat_gateway_id: The ID of the NAT gateway to delete.
++
++ :type dry_run: bool
++ :param dry_run: Set to True if the operation should not actually run.
++
++ :rtype: Bool
++ :return: True if successful
++ """
++ params = {'NatGatewayId': nat_gateway_id}
++ if dry_run:
++ params['DryRun'] = 'true'
++ return self.get_status('DeleteNatGateway', params)
++
+ # Internet Gateways
+
+ def get_all_internet_gateways(self, internet_gateway_ids=None,
+Index: boto-2.40.0/boto/vpc/natgateway.py
+===================================================================
+--- /dev/null
++++ boto-2.40.0/boto/vpc/natgateway.py
+@@ -0,0 +1,89 @@
++# Copyright (c) 2009-2010 Mitch Garnaat http://garnaat.org/
++#
++# Permission is hereby granted, free of charge, to any person obtaining a
++# copy of this software and associated documentation files (the
++# "Software"), to deal in the Software without restriction, including
++# without limitation the rights to use, copy, modify, merge, publish, dis-
++# tribute, sublicense, and/or sell copies of the Software, and to permit
++# persons to whom the Software is furnished to do so, subject to the fol-
++# lowing conditions:
++#
++# The above copyright notice and this permission notice shall be included
++# in all copies or substantial portions of the Software.
++#
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
++# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
++# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
++# IN THE SOFTWARE.
++
++"""
++Represents a NAT Gateway
++"""
++
++from boto.ec2.ec2object import TaggedEC2Object
++from boto.resultset import ResultSet
++
++
++class NatGateway(TaggedEC2Object):
++ def __init__(self, connection=None):
++ super(NatGateway, self).__init__(connection)
++ self.id = None
++ self.vpc_id = None
++ self.subnet_id = None
++ self.state = None
++ self.addresses = []
++
++ def __repr__(self):
++ return 'NatGateway:%s' % self.id
++
++ def startElement(self, name, attrs, connection):
++ result = super(NatGateway, self).startElement(name, attrs, connection)
++
++ if result is not None:
++ # Parent found an interested element, just return it
++ return result
++
++ if name == 'natGatewayAddressSet':
++ self.addresses = ResultSet([('item', NatGatewayAddress)])
++ return self.addresses
++ else:
++ return None
++
++ def endElement(self, name, value, connection):
++ if name == 'natGatewayId':
++ self.id = value
++ elif name == 'vpcId':
++ self.vpc_id = value
++ elif name == 'subnetId':
++ self.subnet_id = value
++ elif name == 'state':
++ self.state = value
++ else:
++ setattr(self, name, value)
++
++
++class NatGatewayAddress(object):
++ def __init__(self, connection=None):
++ self.interface_id = None
++ self.allocation_id = None
++ self.ip_public = None
++ self.ip_private = None
++
++ def __repr__(self):
++ return 'NatGatewayAddress:%s' % self.interface_id
++
++ def startElement(self, name, attrs, connection):
++ return None
++
++ def endElement(self, name, value, connection):
++ if name == 'networkInterfaceId':
++ self.interface_id = value
++ elif name == 'publicIp':
++ self.ip_public = value
++ elif name == 'allocationId':
++ self.allocation_id = value
++ elif name == 'privateIp':
++ self.ip_private = value
+Index: boto-2.40.0/docs/source/ref/vpc.rst
+===================================================================
+--- boto-2.40.0.orig/docs/source/ref/vpc.rst
++++ boto-2.40.0/docs/source/ref/vpc.rst
+@@ -32,6 +32,13 @@ boto.vpc.internetgateway
+ :members:
+ :undoc-members:
+
++boto.vpc.natgateway
++-------------------
++
++.. automodule:: boto.vpc.natgateway
++ :members:
++ :undoc-members:
++
+ boto.vpc.routetable
+ -------------------
+
+Index: boto-2.40.0/tests/unit/vpc/test_natgateway.py
+===================================================================
+--- /dev/null
++++ boto-2.40.0/tests/unit/vpc/test_natgateway.py
+@@ -0,0 +1,113 @@
++from tests.unit import unittest
++from tests.unit import AWSMockServiceTestCase
++
++from boto.vpc import VPCConnection, NatGateway
++
++
++class TestDescribeNatGateway(AWSMockServiceTestCase):
++
++ connection_class = VPCConnection
++
++ def default_body(self):
++ return b"""
++
++ bfed02c6-dae9-47c0-86a2-example
++
++ -
++ subnet-1a2a3a4a
++
++
-
++ eni-00e37850
++ 198.18.125.129
++ eipalloc-37fc1a52
++ 10.0.2.147
++
++
++ 2015-11-25T14:00:55.416Z
++ vpc-4e20d42b
++ nat-04e77a5e9c34432f9
++ available
++
++
++
++ """
++
++ def test_describe_nat_gateway(self):
++ self.set_http_response(status_code=200)
++ api_response = self.service_connection.get_all_nat_gateways(
++ 'nat-04e77a5e9c34432f9', filters=[('natGatewayAddress.allocationId', ['eipalloc-37fc1a52'])])
++ self.assert_request_parameters({
++ 'Action': 'DescribeNatGateways',
++ 'NatGatewayId.1': 'nat-04e77a5e9c34432f9',
++ 'Filter.1.Name': 'natGatewayAddress.allocationId',
++ 'Filter.1.Value.1': 'eipalloc-37fc1a52'},
++ ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
++ 'SignatureVersion', 'Timestamp',
++ 'Version'])
++ self.assertEquals(len(api_response), 1)
++ self.assertIsInstance(api_response[0], NatGateway)
++ self.assertEqual(api_response[0].id, 'nat-04e77a5e9c34432f9')
++
++
++class TestCreateNatGateway(AWSMockServiceTestCase):
++
++ connection_class = VPCConnection
++
++ def default_body(self):
++ return b"""
++
++ 1b74dc5c-bcda-403f-867d-example
++
++ subnet-1a2b3c4d
++
++ -
++ eipalloc-37fc1a52
++
++
++ 2015-11-25T14:00:55.416Z
++ vpc-4e20d42b
++ nat-04e77a5e9c34432f9
++ pending
++
++
++ """
++
++ def test_create_nat_gateway(self):
++ self.set_http_response(status_code=200)
++ api_response = self.service_connection.create_nat_gateway('subnet-1a2b3c4d', 'eipalloc-37fc1a52')
++ self.assert_request_parameters({
++ 'Action': 'CreateNatGateway',
++ 'SubnetId': 'subnet-1a2b3c4d',
++ 'AllocationId': 'eipalloc-37fc1a52'},
++ ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
++ 'SignatureVersion', 'Timestamp',
++ 'Version'])
++ self.assertIsInstance(api_response, NatGateway)
++ self.assertEqual(api_response.id, 'nat-04e77a5e9c34432f9')
++
++
++class TestDeleteNatGateway(AWSMockServiceTestCase):
++
++ connection_class = VPCConnection
++
++ def default_body(self):
++ return b"""
++
++ 741fc8ab-6ebe-452b-b92b-example
++ nat-04ae55e711cec5680
++
++ """
++
++ def test_delete_nat_gateway(self):
++ self.set_http_response(status_code=200)
++ api_response = self.service_connection.delete_nat_gateway('nat-04ae55e711cec5680')
++ self.assert_request_parameters({
++ 'Action': 'DeleteNatGateway',
++ 'NatGatewayId': 'nat-04ae55e711cec5680'},
++ ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
++ 'SignatureVersion', 'Timestamp',
++ 'Version'])
++ self.assertEquals(api_response, True)
++
++if __name__ == '__main__':
++ unittest.main()
diff --git a/boto-2.40.0-retry-float.patch b/boto-2.40.0-retry-float.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6fd1002bdddd18f872bde303cd317857ce3901f9
--- /dev/null
+++ b/boto-2.40.0-retry-float.patch
@@ -0,0 +1,13 @@
+Index: boto-2.40.0/boto/connection.py
+===================================================================
+--- boto-2.40.0.orig/boto/connection.py
++++ boto-2.40.0/boto/connection.py
+@@ -920,7 +920,7 @@ class AWSAuthConnection(object):
+ while i <= num_retries:
+ # Use binary exponential backoff to desynchronize client requests.
+ next_sleep = min(random.random() * (2 ** i),
+- boto.config.get('Boto', 'max_retry_delay', 60))
++ boto.config.getfloat('Boto', 'max_retry_delay', 60))
+ try:
+ # we now re-sign each request before it is retried
+ boto.log.debug('Token: %s' % self.provider.security_token)
diff --git a/boto-2.40.0-route53-no-resourcepath.patch b/boto-2.40.0-route53-no-resourcepath.patch
new file mode 100644
index 0000000000000000000000000000000000000000..38ac8b3212936ea512b932ed5a473e8741bd7352
--- /dev/null
+++ b/boto-2.40.0-route53-no-resourcepath.patch
@@ -0,0 +1,41 @@
+Index: boto-2.40.0/boto/route53/healthcheck.py
+===================================================================
+--- boto-2.40.0.orig/boto/route53/healthcheck.py
++++ boto-2.40.0/boto/route53/healthcheck.py
+@@ -56,7 +56,7 @@ class HealthCheck(object):
+ %(ip_addr_part)s
+ %(port)s
+ %(type)s
+- %(resource_path)s
++ %(resource_path)s
+ %(fqdn_part)s
+ %(string_match_part)s
+ %(request_interval)s
+@@ -72,6 +72,8 @@ class HealthCheck(object):
+
+ XMLRequestIntervalPart = """%(request_interval)d"""
+
++ XMLResourcePath = """%(resource_path)s"""
++
+ valid_request_intervals = (10, 30)
+
+ def __init__(self, ip_addr, port, hc_type, resource_path, fqdn=None, string_match=None, request_interval=30, failure_threshold=3):
+@@ -127,7 +129,7 @@ class HealthCheck(object):
+ 'ip_addr_part': '',
+ 'port': self.port,
+ 'type': self.hc_type,
+- 'resource_path': self.resource_path,
++ 'resource_path': "",
+ 'fqdn_part': "",
+ 'string_match_part': "",
+ 'request_interval': (self.XMLRequestIntervalPart %
+@@ -140,6 +142,9 @@ class HealthCheck(object):
+ if self.ip_addr:
+ params['ip_addr_part'] = self.XMLIpAddrPart % {'ip_addr': self.ip_addr}
+
++ if self.resource_path is not None:
++ params['resource_path'] = self.XMLResourcePath % {'resource_path': self.resource_path}
++
+ if self.string_match is not None:
+ params['string_match_part'] = self.XMLStringMatchPart % {'string_match': self.string_match}
+
diff --git a/boto-2.40.0-s3-requestlog.patch b/boto-2.40.0-s3-requestlog.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5629befd37923d204783f85ef5c404429007c1d9
--- /dev/null
+++ b/boto-2.40.0-s3-requestlog.patch
@@ -0,0 +1,13 @@
+Index: boto-2.40.0/boto/requestlog.py
+===================================================================
+--- boto-2.40.0.orig/boto/requestlog.py
++++ boto-2.40.0/boto/requestlog.py
+@@ -25,7 +25,7 @@ class RequestLogger(RequestHook):
+ duration = (td.microseconds + long_type(td.seconds + td.days * 24 * 3600) * 1e6) / 1e6
+
+ # write output including timestamp, status code, response time, response size, request action
+- self.request_log_queue.put("'%s', '%s', '%s', '%s', '%s'\n" % (time, response.status, duration, len, request.params['Action']))
++ self.request_log_queue.put("'%s', '%s', '%s', '%s', '%s'\n" % (time, response.status, duration, len, request.params.get('Action')))
+
+ def _request_log_worker(self):
+ while True:
diff --git a/boto-2.45.0-modifysubnetattribute.patch b/boto-2.45.0-modifysubnetattribute.patch
new file mode 100644
index 0000000000000000000000000000000000000000..705fe37c7c63752262bdeb22f104c08b3376ffa0
--- /dev/null
+++ b/boto-2.45.0-modifysubnetattribute.patch
@@ -0,0 +1,73 @@
+Index: boto-2.45.0/boto/vpc/__init__.py
+===================================================================
+--- boto-2.45.0.orig/boto/vpc/__init__.py
++++ boto-2.45.0/boto/vpc/__init__.py
+@@ -1269,6 +1269,33 @@ class VPCConnection(EC2Connection):
+ params['DryRun'] = 'true'
+ return self.get_status('DeleteSubnet', params)
+
++ def modify_subnet_attribute(self, subnet_id, map_public_ip_on_launch,
++ dry_run=False):
++ """
++ :type subnet_id: str
++ :param subnet_id: The ID of the subnet.
++
++ :type map_public_ip_on_launch: bool
++ :param map_public_ip_on_launch: Specifies whether public IP addresses
++ are provided for the instances launched into this subnet.
++
++ :type dry_run: bool
++ :param dry_run: Set to True if the operation should not actually run.
++
++ :rtype: bool
++ :return: True if successful
++ """
++ params = {
++ 'SubnetId': subnet_id
++ }
++
++ params['MapPublicIpOnLaunch.Value'] = (
++ 'true' if map_public_ip_on_launch else 'false')
++
++ if dry_run:
++ params['DryRun'] = 'true'
++ return self.get_status('ModifySubnetAttribute', params)
++
+ # DHCP Options
+
+ def get_all_dhcp_options(self, dhcp_options_ids=None, filters=None, dry_run=False):
+Index: boto-2.45.0/tests/unit/vpc/test_subnet.py
+===================================================================
+--- boto-2.45.0.orig/tests/unit/vpc/test_subnet.py
++++ boto-2.45.0/tests/unit/vpc/test_subnet.py
+@@ -129,5 +129,30 @@ class TestDeleteSubnet(AWSMockServiceTes
+ self.assertEquals(api_response, True)
+
+
++class TestModifySubnetAttribute(AWSMockServiceTestCase):
++
++ connection_class = VPCConnection
++
++ def default_body(self):
++ return b"""
++
++ 7a62c49f-347e-4fc4-9331-6e8eEXAMPLE
++ true
++
++ """
++
++ def test_modify_subnet_attribute(self):
++ self.set_http_response(status_code=200)
++ api_response = self.service_connection.modify_subnet_attribute('subnet-a605r929',
++ True)
++ self.assert_request_parameters({
++ 'Action': 'ModifySubnetAttribute',
++ 'SubnetId': 'subnet-a605r929', 'MapPublicIpOnLaunch.Value': 'true'},
++ ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
++ 'SignatureVersion', 'Timestamp',
++ 'Version'])
++ self.assertEquals(api_response, True)
++
++
+ if __name__ == '__main__':
+ unittest.main()
diff --git a/boto-2.49.0.tar.gz b/boto-2.49.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..dd7b549bb26df4368d1450d7fc44a5d22ba841d6
Binary files /dev/null and b/boto-2.49.0.tar.gz differ
diff --git a/boto-mit-license.txt b/boto-mit-license.txt
new file mode 100644
index 0000000000000000000000000000000000000000..88d3464fe99ad818a1e30c90842803483baf3f14
--- /dev/null
+++ b/boto-mit-license.txt
@@ -0,0 +1,37 @@
+# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
+# All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+#
+# Parts of this code were copied or derived from sample code supplied by AWS.
+# The following notice applies to that code.
+#
+# This software code is made available "AS IS" without warranties of any
+# kind. You may copy, display, modify and redistribute the software
+# code either by itself or as incorporated into your code; provided that
+# you do not remove any proprietary notices. Your use of this software
+# code is at your own risk and you waive any claim against Amazon
+# Digital Services, Inc. or its affiliates with respect to your use of
+# this software code. (c) 2006 Amazon Digital Services, Inc. or its
+# affiliates.
+
diff --git a/python-boto.spec b/python-boto.spec
new file mode 100644
index 0000000000000000000000000000000000000000..b8be9aa0f560a14771e6fdbb7ba56f4cee408143
--- /dev/null
+++ b/python-boto.spec
@@ -0,0 +1,373 @@
+%{?python_enable_dependency_generator}
+Summary: A simple, lightweight interface to Amazon Web Services
+Name: python-boto
+Version: 2.49.0
+Release: 4%{?dist}
+License: MIT
+URL: https://github.com/boto/boto
+Source0: https://pypi.io/packages/source/b/boto/boto-%{version}.tar.gz
+# Taken from sourcecode 2014-07-31
+Source1: boto-mit-license.txt
+
+# Unbundle python-six
+# https://github.com/boto/boto/pull/3086
+Patch1: boto-2.39.0-devendor.patch
+
+# Add NAT gateway support
+# https://github.com/boto/boto/pull/3472
+Patch2: boto-2.40.0-nat-gateway.patch
+
+# Fix max_retry_delay config option
+# https://github.com/boto/boto/pull/3506
+# https://github.com/boto/boto/pull/3508
+Patch4: boto-2.40.0-retry-float.patch
+
+# Add aws-exec-read to S3's canned ACL list
+# https://github.com/boto/boto/pull/3332
+Patch5: boto-2.40.0-aws-exec-read.patch
+
+# Add new instance attributes
+# https://github.com/boto/boto/pull/3077
+# https://github.com/boto/boto/pull/3131
+Patch6: boto-2.40.0-instance-attributes.patch
+
+# Fix multi-VPC hosted zone parsing
+# https://github.com/boto/boto/pull/2882
+Patch7: boto-2.40.0-multi-vpc-zone.patch
+
+# Fix request logging for S3 requests
+# https://github.com/boto/boto/issues/2722
+# https://github.com/boto/boto/pull/2875
+Patch8: boto-2.40.0-s3-requestlog.patch
+
+# Allow route53 health check resource paths to be none
+# https://github.com/boto/boto/pull/2866
+Patch9: boto-2.40.0-route53-no-resourcepath.patch
+
+# Add ModifySubnetAttribute support
+# https://github.com/boto/boto/pull/3111
+Patch10: boto-2.45.0-modifysubnetattribute.patch
+
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-six
+BuildRequires: python3-httpretty
+BuildRequires: python3-mock
+BuildRequires: python3-nose
+BuildRequires: python3-requests
+
+BuildArch: noarch
+
+
+%description
+Boto is a Python package that provides interfaces to Amazon Web Services.
+It supports over thirty services, such as S3 (Simple Storage Service),
+SQS (Simple Queue Service), and EC2 (Elastic Compute Cloud) via their
+REST and Query APIs. The goal of boto is to support the full breadth
+and depth of Amazon Web Services. In addition, boto provides support
+for other public services such as Google Storage in addition to private
+cloud systems like Eucalyptus, OpenStack and Open Nebula.
+
+
+%package -n python3-boto
+Summary: A simple, lightweight interface to Amazon Web Services
+
+Requires: python3-requests
+Requires: python3-six
+Requires: python3-rsa
+
+
+%description -n python3-boto
+Boto is a Python package that provides interfaces to Amazon Web Services.
+It supports over thirty services, such as S3 (Simple Storage Service),
+SQS (Simple Queue Service), and EC2 (Elastic Compute Cloud) via their
+REST and Query APIs. The goal of boto is to support the full breadth
+and depth of Amazon Web Services. In addition, boto provides support
+for other public services such as Google Storage in addition to private
+cloud systems like Eucalyptus, OpenStack and Open Nebula.
+
+
+%prep
+%autosetup -p1 -n boto-%{version}
+
+#rm -r boto/vendored
+
+cp -p %{SOURCE1} .
+
+
+%build
+%{__python3} setup.py build
+
+
+%install
+%{__python3} setup.py install --skip-build --root $RPM_BUILD_ROOT
+rm -f $RPM_BUILD_ROOT/%{_bindir}/*
+
+
+#%check
+#%{__python3} tests/test.py default
+
+
+%files -n python3-boto
+%license boto-mit-license.txt
+%{python3_sitelib}/boto*
+
+
+%changelog
+* Thu Oct 03 2019 Miro Hrončok - 2.49.0-4
+- Rebuilt for Python 3.8.0rc1 (#1748018)
+
+* Sat Aug 24 2019 Gwyn Ciesla - 2.49.0-3
+- Disable tests.
+
+* Mon Aug 19 2019 Miro Hrončok - 2.49.0-2
+- Rebuilt for Python 3.8
+
+* Tue Aug 13 2019 Gwyn Ciesla - 2.49.0-1
+- 2.49.0
+
+* Tue Aug 13 2019 Gwyn Ciesla - 2.45.0-13
+- Drop python 2.
+
+* Fri Jul 26 2019 Fedora Release Engineering - 2.45.0-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Sat Feb 02 2019 Fedora Release Engineering - 2.45.0-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Fri Jul 13 2018 Fedora Release Engineering - 2.45.0-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Tue Jun 19 2018 Miro Hrončok - 2.45.0-9
+- Rebuilt for Python 3.7
+
+* Wed Feb 21 2018 Iryna Shcherbina - 2.45.0-8
+- Update Python 2 dependency declarations to new packaging standards
+ (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
+
+* Fri Feb 09 2018 Fedora Release Engineering - 2.45.0-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Fri Dec 01 2017 Troy Dawson - 2.45.0-6
+- Update spec file conditionals
+
+* Thu Jul 27 2017 Fedora Release Engineering - 2.45.0-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Sat Feb 11 2017 Fedora Release Engineering - 2.45.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Fri Jan 27 2017 Garrett Holmstrom - 2.45.0-3
+- Added support for ModifySubnetAttribute
+
+* Mon Dec 19 2016 Miro Hrončok - 2.45.0-2
+- Rebuild for Python 3.6
+
+* Thu Dec 15 2016 Jon Ciesla - 2.45.0-1
+- 2.40.0.
+
+* Fri Dec 9 2016 Garrett Holmstrom - 2.44.0-1
+- Updated to 2.44.0 (RH #1403362)
+
+* Tue Oct 25 2016 Garrett Holmstrom - 2.43.0-1
+- Updated to 2.43.0
+
+* Tue Jul 19 2016 Fedora Release Engineering - 2.41.0-2
+- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages
+
+* Tue Jul 5 2016 Garrett Holmstrom - 2.41.0-1
+- Updated to 2.41.0
+
+* Tue Jun 21 2016 Garrett Holmstrom - 2.40.0-2
+- Cleaned up spec file
+- Added NAT gateway support
+- Fixed sigv4 protocol selection
+- Fixed max_retry_delay config option
+- Added aws-exec-read to S3's canned ACL list
+- Added new instance attributes
+- Fixed multi-VPC hosted zone parsing
+- Fixed request logging for S3 requests
+- Allowed route53 health check resource paths to be none
+
+* Mon May 23 2016 Jon Ciesla - 2.40.0-1
+- 2.40.0.
+- Kinesis patch upstreamed.
+
+* Fri Jan 29 2016 Garrett Holmstrom - 2.39.0-1
+- Updated to 2.39.0 (RH #1300424)
+- Switched to systemwide copy of python-six on el7
+- Enabled unit tests on el7
+- Renamed python-boto to python2-boto to comply with current python
+ packaging standards
+
+* Mon Nov 30 2015 Ryan S. Brown - 2.38.0-5
+- Add patch for unittest failure https://github.com/boto/boto/pull/3412
+
+* Tue Nov 10 2015 Fedora Release Engineering - 2.38.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5
+
+* Thu Jun 18 2015 Fedora Release Engineering - 2.38.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Tue Jun 9 2015 Garrett Holmstrom - 2.38.0-2
+- Fixed ImportErrors on RHEL 7 (RH #1229863)
+
+* Fri Apr 10 2015 Garrett Holmstrom - 2.38.0-1
+- Updated to 2.38.0
+- Added BuildRequires for python-six
+- Made sample executables doc files in F23
+
+* Wed Apr 8 2015 Garrett Holmstrom - 2.37.0-1
+- Updated to 2.37.0 (RH #1180861)
+- Dropped executables in F23
+- Unbundled python-six (boto #3086)
+- Enabled unit tests on Fedora (RH #1072946)
+
+* Sun Nov 9 2014 Garrett Holmstrom - 2.34.0-4
+- Fixed python3 requires
+
+* Fri Nov 7 2014 Garrett Holmstrom - 2.34.0-3
+- Re-fix executables (RH #1152444)
+
+* Fri Nov 7 2014 Garrett Holmstrom - 2.34.0-2
+- Added missing python-requests and python-rsa dependencies
+- Disabled unit tests due to rawhide/F21 python regression (RH #1161166:c4)
+
+* Fri Nov 7 2014 Garrett Holmstrom - 2.34.0-1
+- Updated to 2.34.0 (RH #1072925, RH #1072928, RH #1161229)
+- Made executables point to python2 (RH #1152444)
+- Enabled unit tests on Fedora (RH #1072946)
+
+* Thu Aug 21 2014 Garrett Holmstrom - 2.32.1-1
+- Updated to 2.32.1 (RH #1126056, RH #1132348)
+- Added python3-boto (RH #1024363)
+- Added (but did not enable) unit tests (RH #1072946, RH #1072923)
+
+* Thu Jul 31 2014 Tom Callaway - 2.27.0-3
+- fix license handling
+
+* Sat Jun 07 2014 Fedora Release Engineering - 2.27.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Fri Mar 21 2014 Garrett Holmstrom - 2.27.0-1
+- Updated to 2.27.0
+
+* Wed Feb 12 2014 Garrett Holmstrom - 2.25.0-2
+- Fixed roboto parameter type conversion (boto #2094, RH #1064550)
+
+* Mon Feb 10 2014 Garrett Holmstrom - 2.25.0-1
+- Updated to 2.25.0
+- This update makes s3.get_bucket use HEAD instead of GET
+
+* Mon Jan 20 2014 Garrett Holmstrom - 2.23.0-1
+- Updated to 2.23.0
+- Fixed auth for anonymous S3 requests (boto #1988)
+
+* Thu Sep 26 2013 Garrett Holmstrom - 2.13.3-1
+- Updated to 2.13.3
+- Note that this version changes register_image's virtualization_type parameter
+- Fixed auto-scaling PropagateAtLaunch parsing (#1011682)
+
+* Mon Jul 29 2013 Garrett Holmstrom - 2.9.9-2
+- Re-fixed autoscaling policy parsing (boto #1538)
+
+* Thu Jul 25 2013 Orion Poplawski - 2.9.9-1
+- Update to 2.9.9
+
+* Fri Jun 21 2013 Garrett Holmstrom - 2.9.6-2
+- Rebuilt after merge
+
+* Fri Jun 21 2013 Garrett Holmstrom - 2.9.6-1
+- Updated to 2.9.6
+- Fixed autoscaling policy parsing (boto #1538)
+
+* Thu May 9 2013 Orion Poplawski - 2.9.2-1
+- Update to 2.9.2 (bug #948714)
+- Spec cleanup
+
+* Thu Feb 14 2013 Fedora Release Engineering - 2.6.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Tue Jan 8 2013 Garrett Holmstrom - 2.5.2-3
+- Fixed parsing of current/previous instance state data (boto #881)
+
+* Wed Nov 21 2012 Garrett Holmstrom - 2.6.0-2
+- Updated to 2.6.0 (#876517)
+- Note that this version enables SSL cert verification by default.
+
+* Sat Jul 21 2012 Fedora Release Engineering - 2.5.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Fri Jul 6 2012 Garrett Holmstrom - 2.5.2-1
+- Updated to 2.5.2
+- Fixed failure when metadata is empty (#838076)
+
+* Thu Jun 14 2012 Garrett Holmstrom - 2.5.1-1
+- Updated to 2.5.1 (last-minute upstream bugfix)
+
+* Wed Jun 13 2012 Garrett Holmstrom - 2.5.0-1
+- Updated to 2.5.0 (#828912)
+
+* Wed Mar 21 2012 Robert Scheck 2.3.0-1
+- Upgrade to 2.3.0 (#786301 #c10)
+
+* Tue Mar 13 2012 Robert Scheck 2.2.2-1
+- Upgrade to 2.2.2 (#786301, thanks to Bobby Powers)
+
+* Sat Jan 14 2012 Fedora Release Engineering - 2.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Mon Aug 15 2011 Robert Scheck 2.0-1
+- Upgrade to 2.0 (#723088)
+
+* Tue Feb 08 2011 Fedora Release Engineering - 1.9b-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Sun Jan 02 2011 Robert Scheck 1.9b-6
+- Added a patch for python 2.4 support (#656446, #661233)
+
+* Thu Dec 02 2010 Lubomir Rintel 1.9b-5
+- Apply a patch for python 2.7 support (#659248)
+
+* Thu Nov 18 2010 Robert Scheck 1.9b-4
+- Added patch to fix parameter of build_list_params() (#647005)
+
+* Wed Jul 21 2010 David Malcolm - 1.9b-3
+- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
+
+* Tue Feb 09 2010 Robert Scheck 1.9b-2
+- Backported upstream patch for image registration (#561216)
+
+* Sat Jan 09 2010 Robert Scheck 1.9b-1
+- Upgrade to 1.9b
+
+* Fri Jul 24 2009 Robert Scheck 1.8d-1
+- Upgrade to 1.8d (#513560)
+
+* Wed Jun 03 2009 Luke Macken 1.7a-2
+- Add python-setuptools-devel to our build requirements, for egg-info
+
+* Thu Apr 16 2009 Robert Scheck 1.7a-1
+- Upgrade to 1.7a
+
+* Mon Feb 23 2009 Robert Scheck 1.5c-2
+- Rebuild against rpm 4.6
+
+* Sun Dec 07 2008 Robert Scheck 1.5c-1
+- Upgrade to 1.5c
+
+* Fri Dec 05 2008 Jeremy Katz 1.2a-2
+- Rebuild for python 2.6
+
+* Wed May 07 2008 Robert Scheck 1.2a-1
+- Upgrade to 1.2a
+
+* Sat Feb 09 2008 Robert Scheck 1.0a-1
+- Upgrade to 1.0a
+
+* Sat Dec 08 2007 Robert Scheck 0.9d-1
+- Upgrade to 0.9d
+
+* Thu Aug 30 2007 Robert Scheck 0.9b-1
+- Upgrade to 0.9b
+- Initial spec file for Fedora and Red Hat Enterprise Linux