parent
3a12803124
commit
e892191bb8
@ -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"""
|
||||
+ <DescribeNatGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
|
||||
+ <requestId>bfed02c6-dae9-47c0-86a2-example</requestId>
|
||||
+ <natGatewaySet>
|
||||
+ <item>
|
||||
+ <subnetId>subnet-1a2a3a4a</subnetId>
|
||||
+ <natGatewayAddressSet>
|
||||
+ <item>
|
||||
+ <networkInterfaceId>eni-00e37850</networkInterfaceId>
|
||||
+ <publicIp>198.18.125.129</publicIp>
|
||||
+ <allocationId>eipalloc-37fc1a52</allocationId>
|
||||
+ <privateIp>10.0.2.147</privateIp>
|
||||
+ </item>
|
||||
+ </natGatewayAddressSet>
|
||||
+ <createTime>2015-11-25T14:00:55.416Z</createTime>
|
||||
+ <vpcId>vpc-4e20d42b</vpcId>
|
||||
+ <natGatewayId>nat-04e77a5e9c34432f9</natGatewayId>
|
||||
+ <state>available</state>
|
||||
+ </item>
|
||||
+ </natGatewaySet>
|
||||
+ </DescribeNatGatewaysResponse>
|
||||
+ """
|
||||
+
|
||||
+ 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"""
|
||||
+ <CreateNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
|
||||
+ <requestId>1b74dc5c-bcda-403f-867d-example</requestId>
|
||||
+ <natGateway>
|
||||
+ <subnetId>subnet-1a2b3c4d</subnetId>
|
||||
+ <natGatewayAddressSet>
|
||||
+ <item>
|
||||
+ <allocationId>eipalloc-37fc1a52</allocationId>
|
||||
+ </item>
|
||||
+ </natGatewayAddressSet>
|
||||
+ <createTime>2015-11-25T14:00:55.416Z</createTime>
|
||||
+ <vpcId>vpc-4e20d42b</vpcId>
|
||||
+ <natGatewayId>nat-04e77a5e9c34432f9</natGatewayId>
|
||||
+ <state>pending</state>
|
||||
+ </natGateway>
|
||||
+ </CreateNatGatewayResponse>
|
||||
+ """
|
||||
+
|
||||
+ 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"""
|
||||
+ <DeleteNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
|
||||
+ <requestId>741fc8ab-6ebe-452b-b92b-example</requestId>
|
||||
+ <natGatewayId>nat-04ae55e711cec5680</natGatewayId>
|
||||
+ </DeleteNatGatewayResponse>
|
||||
+ """
|
||||
+
|
||||
+ 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()
|
Loading…
Reference in new issue