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