From 17cc46b91e3d872b38d18fdcf0549b878805103f Mon Sep 17 00:00:00 2001 From: Wessel van der Veen Date: Mon, 2 Sep 2019 12:35:16 +0200 Subject: [PATCH 1/8] adds basic support for vpc-classic-link --- IMPLEMENTATION_COVERAGE.md | 6 ++-- moto/ec2/models.py | 27 ++++++++++++-- moto/ec2/responses/vpcs.py | 47 ++++++++++++++++++++++++ tests/test_ec2/test_vpcs.py | 72 +++++++++++++++++++++++++++++++++++-- 4 files changed, 145 insertions(+), 7 deletions(-) diff --git a/IMPLEMENTATION_COVERAGE.md b/IMPLEMENTATION_COVERAGE.md index 2e5f055b..91a37c00 100644 --- a/IMPLEMENTATION_COVERAGE.md +++ b/IMPLEMENTATION_COVERAGE.md @@ -2217,7 +2217,7 @@ - [X] describe_volumes - [ ] describe_volumes_modifications - [X] describe_vpc_attribute -- [ ] describe_vpc_classic_link +- [X] describe_vpc_classic_link - [ ] describe_vpc_classic_link_dns_support - [ ] describe_vpc_endpoint_connection_notifications - [ ] describe_vpc_endpoint_connections @@ -2237,7 +2237,7 @@ - [ ] disable_ebs_encryption_by_default - [ ] disable_transit_gateway_route_table_propagation - [ ] disable_vgw_route_propagation -- [ ] disable_vpc_classic_link +- [X] disable_vpc_classic_link - [ ] disable_vpc_classic_link_dns_support - [X] disassociate_address - [ ] disassociate_client_vpn_target_network @@ -2250,7 +2250,7 @@ - [ ] enable_transit_gateway_route_table_propagation - [ ] enable_vgw_route_propagation - [ ] enable_volume_io -- [ ] enable_vpc_classic_link +- [X] enable_vpc_classic_link - [ ] enable_vpc_classic_link_dns_support - [ ] export_client_vpn_client_certificate_revocation_list - [ ] export_client_vpn_client_configuration diff --git a/moto/ec2/models.py b/moto/ec2/models.py index efbbeb6f..ffe801f4 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -2433,8 +2433,8 @@ class VPC(TaggedEC2Resource): self.dhcp_options = None self.state = "available" self.instance_tenancy = instance_tenancy - self.is_default = "true" if is_default else "false" - self.enable_dns_support = "true" + self.is_default = 'true' if is_default else 'false' + self.enable_dns_support = 'true' # This attribute is set to 'true' only for default VPCs # or VPCs created using the wizard of the VPC console self.enable_dns_hostnames = "true" if is_default else "false" @@ -2531,6 +2531,21 @@ class VPC(TaggedEC2Resource): self.cidr_block_association_set[association_id] = association_set return association_set + def enable_vpc_classic_link(self): + # Check if current cidr block doesn't fall within the 10.0.0.0/8 block, excluding 10.0.0.0/16 and 10.1.0.0/16. + # Doesn't check any route tables, maybe something for in the future? + # See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html#classiclink-limitations + network_address = ipaddress.ip_network(self.cidr_block).network_address + if network_address not in ipaddress.ip_network('10.0.0.0/8') or network_address in ipaddress.ip_network( + '10.0.0.0/16') or network_address in ipaddress.ip_network('10.1.0.0/16'): + self.classic_link_enabled = "true" + + return self.classic_link_enabled + + def disable_vpc_classic_link(self): + self.classic_link_enabled = "false" + return self.classic_link_enabled + def disassociate_vpc_cidr_block(self, association_id): if self.cidr_block == self.cidr_block_association_set.get( association_id, {} @@ -2661,6 +2676,14 @@ class VPCBackend(object): else: raise InvalidParameterValueError(attr_name) + def enable_vpc_classic_link(self, vpc_id): + vpc = self.get_vpc(vpc_id) + return vpc.enable_vpc_classic_link() + + def disable_vpc_classic_link(self, vpc_id): + vpc = self.get_vpc(vpc_id) + return vpc.disable_vpc_classic_link() + def modify_vpc_attribute(self, vpc_id, attr_name, attr_value): vpc = self.get_vpc(vpc_id) if attr_name in ("enable_dns_support", "enable_dns_hostnames"): diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index 1773e4cc..3cac2a6a 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -50,6 +50,28 @@ class VPCs(BaseResponse): template = self.response_template(DESCRIBE_VPC_ATTRIBUTE_RESPONSE) return template.render(vpc_id=vpc_id, attribute=attribute, value=value) + def describe_vpc_classic_link(self): + vpc_ids = self._get_multi_param('VpcId') + filters = filters_from_querystring(self.querystring) + vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_RESPONSE) + return template.render(vpcs=vpcs, doc_date=doc_date) + + def enable_vpc_classic_link(self): + vpc_id = self._get_param('VpcId') + classic_link_enabled = self.ec2_backend.enable_vpc_classic_link(vpc_id=vpc_id) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(ENABLE_VPC_CLASSIC_LINK_RESPONSE) + return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) + + def disable_vpc_classic_link(self): + vpc_id = self._get_param('VpcId') + classic_link_enabled = self.ec2_backend.disable_vpc_classic_link(vpc_id=vpc_id) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(DISABLE_VPC_CLASSIC_LINK_RESPONSE) + return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) + def modify_vpc_attribute(self): vpc_id = self._get_param("VpcId") @@ -149,6 +171,31 @@ CREATE_VPC_RESPONSE = """ """ +DESCRIBE_VPC_CLASSIC_LINK_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + + {% for vpc in vpcs %} + + {{ vpc.id }} + {{ vpc.classic_link_enabled }} + + {% endfor %} + +""" + +ENABLE_VPC_CLASSIC_LINK_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + {{ classic_link_enabled }} +""" + +DISABLE_VPC_CLASSIC_LINK_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + {{ classic_link_enabled }} +""" + DESCRIBE_VPCS_RESPONSE = """ 7a62c442-3484-4f42-9342-6942EXAMPLE diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index 0894a8b8..c7a3a940 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -676,5 +676,73 @@ def test_create_vpc_with_invalid_cidr_range(): vpc = ec2.create_vpc(CidrBlock=vpc_cidr_block) str(ex.exception).should.equal( "An error occurred (InvalidVpc.Range) when calling the CreateVpc " - "operation: The CIDR '{}' is invalid.".format(vpc_cidr_block) - ) + "operation: The CIDR '{}' is invalid.".format(vpc_cidr_block)) + +@mock_ec2 +def test_enable_vpc_classic_link(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.1.0.0/16') + + response = ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) + assert response.get('Return').should.be.true + +@mock_ec2 +def test_enable_vpc_classic_link_failure(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + + response = ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) + assert response.get('Return').should.be.false + + +@mock_ec2 +def test_disable_vpc_classic_link(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) + response = ec2.meta.client.disable_vpc_classic_link(VpcId=vpc.id) + assert response.get('Return').should.be.false + + +@mock_ec2 +def test_describe_classic_link_enabled(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) + response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc.id]) + assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.true + + +@mock_ec2 +def test_describe_classic_link_disabled(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + + response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc.id]) + assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.false + + +@mock_ec2 +def test_describe_classic_link_multiple(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc1 = ec2.create_vpc(CidrBlock='10.90.0.0/16') + vpc2 = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link(VpcId=vpc2.id) + response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc1.id, vpc2.id]) + assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.false + assert response.get('Vpcs')[1].get('ClassicLinkEnabled').should.be.true From 6d52cd06cb74a909dab8732b97acf7b3ba0505fc Mon Sep 17 00:00:00 2001 From: Wessel van der Veen Date: Mon, 2 Sep 2019 13:16:52 +0200 Subject: [PATCH 2/8] Adds support for enable/disable/describe vpc-classic-link-dns-support. --- IMPLEMENTATION_COVERAGE.md | 6 ++-- moto/ec2/models.py | 17 +++++++++++ moto/ec2/responses/vpcs.py | 47 +++++++++++++++++++++++++++++ tests/test_ec2/test_vpcs.py | 60 +++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 3 deletions(-) diff --git a/IMPLEMENTATION_COVERAGE.md b/IMPLEMENTATION_COVERAGE.md index 91a37c00..79337683 100644 --- a/IMPLEMENTATION_COVERAGE.md +++ b/IMPLEMENTATION_COVERAGE.md @@ -2218,7 +2218,7 @@ - [ ] describe_volumes_modifications - [X] describe_vpc_attribute - [X] describe_vpc_classic_link -- [ ] describe_vpc_classic_link_dns_support +- [X] describe_vpc_classic_link_dns_support - [ ] describe_vpc_endpoint_connection_notifications - [ ] describe_vpc_endpoint_connections - [ ] describe_vpc_endpoint_service_configurations @@ -2238,7 +2238,7 @@ - [ ] disable_transit_gateway_route_table_propagation - [ ] disable_vgw_route_propagation - [X] disable_vpc_classic_link -- [ ] disable_vpc_classic_link_dns_support +- [X] disable_vpc_classic_link_dns_support - [X] disassociate_address - [ ] disassociate_client_vpn_target_network - [ ] disassociate_iam_instance_profile @@ -2251,7 +2251,7 @@ - [ ] enable_vgw_route_propagation - [ ] enable_volume_io - [X] enable_vpc_classic_link -- [ ] enable_vpc_classic_link_dns_support +- [X] enable_vpc_classic_link_dns_support - [ ] export_client_vpn_client_certificate_revocation_list - [ ] export_client_vpn_client_configuration - [ ] export_image diff --git a/moto/ec2/models.py b/moto/ec2/models.py index ffe801f4..2adfb138 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -2435,6 +2435,7 @@ class VPC(TaggedEC2Resource): self.instance_tenancy = instance_tenancy self.is_default = 'true' if is_default else 'false' self.enable_dns_support = 'true' + self.classic_link_enabled = 'false' # This attribute is set to 'true' only for default VPCs # or VPCs created using the wizard of the VPC console self.enable_dns_hostnames = "true" if is_default else "false" @@ -2546,6 +2547,14 @@ class VPC(TaggedEC2Resource): self.classic_link_enabled = "false" return self.classic_link_enabled + def enable_vpc_classic_link_dns_support(self): + self.classic_link_dns_supported = 'true' + return self.classic_link_dns_supported + + def disable_vpc_classic_link_dns_support(self): + self.classic_link_dns_supported = 'false' + return self.classic_link_dns_supported + def disassociate_vpc_cidr_block(self, association_id): if self.cidr_block == self.cidr_block_association_set.get( association_id, {} @@ -2684,6 +2693,14 @@ class VPCBackend(object): vpc = self.get_vpc(vpc_id) return vpc.disable_vpc_classic_link() + def enable_vpc_classic_link_dns_support(self, vpc_id): + vpc = self.get_vpc(vpc_id) + return vpc.enable_vpc_classic_link_dns_support() + + def disable_vpc_classic_link_dns_support(self, vpc_id): + vpc = self.get_vpc(vpc_id) + return vpc.disable_vpc_classic_link_dns_support() + def modify_vpc_attribute(self, vpc_id, attr_name, attr_value): vpc = self.get_vpc(vpc_id) if attr_name in ("enable_dns_support", "enable_dns_hostnames"): diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index 3cac2a6a..3c241c4e 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -50,6 +50,28 @@ class VPCs(BaseResponse): template = self.response_template(DESCRIBE_VPC_ATTRIBUTE_RESPONSE) return template.render(vpc_id=vpc_id, attribute=attribute, value=value) + def describe_vpc_classic_link_dns_support(self): + vpc_ids = self._get_multi_param('VpcIds') + filters = filters_from_querystring(self.querystring) + vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) + return template.render(vpcs=vpcs, doc_date=doc_date) + + def enable_vpc_classic_link_dns_support(self): + vpc_id = self._get_param('VpcId') + classic_link_dns_supported = self.ec2_backend.enable_vpc_classic_link_dns_support(vpc_id=vpc_id) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) + return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) + + def disable_vpc_classic_link_dns_support(self): + vpc_id = self._get_param('VpcId') + classic_link_dns_supported = self.ec2_backend.disable_vpc_classic_link_dns_support(vpc_id=vpc_id) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + template = self.response_template(DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) + return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) + def describe_vpc_classic_link(self): vpc_ids = self._get_multi_param('VpcId') filters = filters_from_querystring(self.querystring) @@ -171,6 +193,31 @@ CREATE_VPC_RESPONSE = """ """ +DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + + {% for vpc in vpcs %} + + {{ vpc.id }} + {{ vpc.classic_link_dns_supported }} + + {% endfor %} + +""" + +ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + {{ classic_link_dns_supported }} +""" + +DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE = """ + + 7a62c442-3484-4f42-9342-6942EXAMPLE + {{ classic_link_dns_supported }} +""" + DESCRIBE_VPC_CLASSIC_LINK_RESPONSE = """ 7a62c442-3484-4f42-9342-6942EXAMPLE diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index c7a3a940..2e48fe01 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -746,3 +746,63 @@ def test_describe_classic_link_multiple(): response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc1.id, vpc2.id]) assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.false assert response.get('Vpcs')[1].get('ClassicLinkEnabled').should.be.true + + +@mock_ec2 +def test_enable_vpc_classic_link_dns_support(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.1.0.0/16') + + response = ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) + assert response.get('Return').should.be.true + + +@mock_ec2 +def test_disable_vpc_classic_link_dns_support(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) + response = ec2.meta.client.disable_vpc_classic_link_dns_support(VpcId=vpc.id) + assert response.get('Return').should.be.false + + +@mock_ec2 +def test_describe_classic_link_dns_support_enabled(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) + response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc.id]) + assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.true + + +@mock_ec2 +def test_describe_classic_link_dns_support_disabled(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + + response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc.id]) + assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.false + + +@mock_ec2 +def test_describe_classic_link_dns_support_multiple(): + ec2 = boto3.resource('ec2', region_name='us-west-1') + + # Create VPC + vpc1 = ec2.create_vpc(CidrBlock='10.90.0.0/16') + vpc2 = ec2.create_vpc(CidrBlock='10.0.0.0/16') + + ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc2.id) + response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc1.id, vpc2.id]) + assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.false + assert response.get('Vpcs')[1].get('ClassicLinkDnsSupported').should.be.true From 2b19416ab0fcb09b6835f80c09940cd754e45d4b Mon Sep 17 00:00:00 2001 From: Wessel van der Veen Date: Tue, 3 Sep 2019 13:43:54 +0200 Subject: [PATCH 3/8] Refactored doc_date into method. --- moto/ec2/responses/vpcs.py | 42 +++++++++++++++----------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index 3c241c4e..3729deef 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -5,22 +5,16 @@ from moto.ec2.utils import filters_from_querystring class VPCs(BaseResponse): + def _get_doc_date(self): + return '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + def create_vpc(self): - cidr_block = self._get_param("CidrBlock") - instance_tenancy = self._get_param("InstanceTenancy", if_none="default") - amazon_provided_ipv6_cidr_blocks = self._get_param( - "AmazonProvidedIpv6CidrBlock" - ) - vpc = self.ec2_backend.create_vpc( - cidr_block, - instance_tenancy, - amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_blocks, - ) - doc_date = ( - "2013-10-15" - if "Boto/" in self.headers.get("user-agent", "") - else "2016-11-15" - ) + cidr_block = self._get_param('CidrBlock') + instance_tenancy = self._get_param('InstanceTenancy', if_none='default') + amazon_provided_ipv6_cidr_blocks = self._get_param('AmazonProvidedIpv6CidrBlock') + vpc = self.ec2_backend.create_vpc(cidr_block, instance_tenancy, + amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_blocks) + doc_date = self._get_doc_date() template = self.response_template(CREATE_VPC_RESPONSE) return template.render(vpc=vpc, doc_date=doc_date) @@ -34,11 +28,7 @@ class VPCs(BaseResponse): vpc_ids = self._get_multi_param("VpcId") filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) - doc_date = ( - "2013-10-15" - if "Boto/" in self.headers.get("user-agent", "") - else "2016-11-15" - ) + doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' template = self.response_template(DESCRIBE_VPCS_RESPONSE) return template.render(vpcs=vpcs, doc_date=doc_date) @@ -54,21 +44,21 @@ class VPCs(BaseResponse): vpc_ids = self._get_multi_param('VpcIds') filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) return template.render(vpcs=vpcs, doc_date=doc_date) def enable_vpc_classic_link_dns_support(self): vpc_id = self._get_param('VpcId') classic_link_dns_supported = self.ec2_backend.enable_vpc_classic_link_dns_support(vpc_id=vpc_id) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) def disable_vpc_classic_link_dns_support(self): vpc_id = self._get_param('VpcId') classic_link_dns_supported = self.ec2_backend.disable_vpc_classic_link_dns_support(vpc_id=vpc_id) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) @@ -76,21 +66,21 @@ class VPCs(BaseResponse): vpc_ids = self._get_multi_param('VpcId') filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_RESPONSE) return template.render(vpcs=vpcs, doc_date=doc_date) def enable_vpc_classic_link(self): vpc_id = self._get_param('VpcId') classic_link_enabled = self.ec2_backend.enable_vpc_classic_link(vpc_id=vpc_id) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_RESPONSE) return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) def disable_vpc_classic_link(self): vpc_id = self._get_param('VpcId') classic_link_enabled = self.ec2_backend.disable_vpc_classic_link(vpc_id=vpc_id) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_RESPONSE) return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) From 3398244f140efd93463872f746a0ae51f0d8ac51 Mon Sep 17 00:00:00 2001 From: Cat Cai Date: Mon, 11 Nov 2019 12:09:52 -0800 Subject: [PATCH 4/8] Fix styling problems --- moto/ec2/models.py | 14 +++---- moto/ec2/responses/vpcs.py | 12 +++--- tests/test_ec2/test_vpcs.py | 78 +++++++++++++++++++------------------ 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/moto/ec2/models.py b/moto/ec2/models.py index 2adfb138..5b4ef62f 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -2433,9 +2433,9 @@ class VPC(TaggedEC2Resource): self.dhcp_options = None self.state = "available" self.instance_tenancy = instance_tenancy - self.is_default = 'true' if is_default else 'false' - self.enable_dns_support = 'true' - self.classic_link_enabled = 'false' + self.is_default = "true" if is_default else "false" + self.enable_dns_support = "true" + self.classic_link_enabled = "false" # This attribute is set to 'true' only for default VPCs # or VPCs created using the wizard of the VPC console self.enable_dns_hostnames = "true" if is_default else "false" @@ -2537,8 +2537,8 @@ class VPC(TaggedEC2Resource): # Doesn't check any route tables, maybe something for in the future? # See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html#classiclink-limitations network_address = ipaddress.ip_network(self.cidr_block).network_address - if network_address not in ipaddress.ip_network('10.0.0.0/8') or network_address in ipaddress.ip_network( - '10.0.0.0/16') or network_address in ipaddress.ip_network('10.1.0.0/16'): + if network_address not in ipaddress.ip_network("10.0.0.0/8") or network_address in ipaddress.ip_network( + "10.0.0.0/16") or network_address in ipaddress.ip_network("10.1.0.0/16"): self.classic_link_enabled = "true" return self.classic_link_enabled @@ -2548,11 +2548,11 @@ class VPC(TaggedEC2Resource): return self.classic_link_enabled def enable_vpc_classic_link_dns_support(self): - self.classic_link_dns_supported = 'true' + self.classic_link_dns_supported = "true" return self.classic_link_dns_supported def disable_vpc_classic_link_dns_support(self): - self.classic_link_dns_supported = 'false' + self.classic_link_dns_supported = "false" return self.classic_link_dns_supported def disassociate_vpc_cidr_block(self, association_id): diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index 3729deef..5f0030aa 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -41,7 +41,7 @@ class VPCs(BaseResponse): return template.render(vpc_id=vpc_id, attribute=attribute, value=value) def describe_vpc_classic_link_dns_support(self): - vpc_ids = self._get_multi_param('VpcIds') + vpc_ids = self._get_multi_param("VpcIds") filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) doc_date = self._get_doc_date() @@ -49,21 +49,21 @@ class VPCs(BaseResponse): return template.render(vpcs=vpcs, doc_date=doc_date) def enable_vpc_classic_link_dns_support(self): - vpc_id = self._get_param('VpcId') + vpc_id = self._get_param("VpcId") classic_link_dns_supported = self.ec2_backend.enable_vpc_classic_link_dns_support(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) def disable_vpc_classic_link_dns_support(self): - vpc_id = self._get_param('VpcId') + vpc_id = self._get_param("VpcId") classic_link_dns_supported = self.ec2_backend.disable_vpc_classic_link_dns_support(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) def describe_vpc_classic_link(self): - vpc_ids = self._get_multi_param('VpcId') + vpc_ids = self._get_multi_param("VpcId") filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) doc_date = self._get_doc_date() @@ -71,14 +71,14 @@ class VPCs(BaseResponse): return template.render(vpcs=vpcs, doc_date=doc_date) def enable_vpc_classic_link(self): - vpc_id = self._get_param('VpcId') + vpc_id = self._get_param("VpcId") classic_link_enabled = self.ec2_backend.enable_vpc_classic_link(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_RESPONSE) return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) def disable_vpc_classic_link(self): - vpc_id = self._get_param('VpcId') + vpc_id = self._get_param("VpcId") classic_link_enabled = self.ec2_backend.disable_vpc_classic_link(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_RESPONSE) diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index 2e48fe01..f93ead82 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -676,133 +676,135 @@ def test_create_vpc_with_invalid_cidr_range(): vpc = ec2.create_vpc(CidrBlock=vpc_cidr_block) str(ex.exception).should.equal( "An error occurred (InvalidVpc.Range) when calling the CreateVpc " - "operation: The CIDR '{}' is invalid.".format(vpc_cidr_block)) + "operation: The CIDR '{}' is invalid.".format(vpc_cidr_block) + ) + @mock_ec2 def test_enable_vpc_classic_link(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.1.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.1.0.0/16") response = ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) - assert response.get('Return').should.be.true + assert response.get("Return").should.be.true @mock_ec2 def test_enable_vpc_classic_link_failure(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.90.0.0/16") response = ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) - assert response.get('Return').should.be.false + assert response.get("Return").should.be.false @mock_ec2 def test_disable_vpc_classic_link(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) response = ec2.meta.client.disable_vpc_classic_link(VpcId=vpc.id) - assert response.get('Return').should.be.false + assert response.get("Return").should.be.false @mock_ec2 def test_describe_classic_link_enabled(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc.id]) - assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.true + assert response.get("Vpcs")[0].get("ClassicLinkEnabled").should.be.true @mock_ec2 def test_describe_classic_link_disabled(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.90.0.0/16") response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc.id]) - assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.false + assert response.get("Vpcs")[0].get("ClassicLinkEnabled").should.be.false @mock_ec2 def test_describe_classic_link_multiple(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc1 = ec2.create_vpc(CidrBlock='10.90.0.0/16') - vpc2 = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc1 = ec2.create_vpc(CidrBlock="10.90.0.0/16") + vpc2 = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link(VpcId=vpc2.id) response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc1.id, vpc2.id]) - assert response.get('Vpcs')[0].get('ClassicLinkEnabled').should.be.false - assert response.get('Vpcs')[1].get('ClassicLinkEnabled').should.be.true + assert response.get("Vpcs")[0].get("ClassicLinkEnabled").should.be.false + assert response.get("Vpcs")[1].get("ClassicLinkEnabled").should.be.true @mock_ec2 def test_enable_vpc_classic_link_dns_support(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.1.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.1.0.0/16") response = ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) - assert response.get('Return').should.be.true + assert response.get("Return").should.be.true @mock_ec2 def test_disable_vpc_classic_link_dns_support(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) response = ec2.meta.client.disable_vpc_classic_link_dns_support(VpcId=vpc.id) - assert response.get('Return').should.be.false + assert response.get("Return").should.be.false @mock_ec2 def test_describe_classic_link_dns_support_enabled(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc.id) response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc.id]) - assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.true + assert response.get("Vpcs")[0].get("ClassicLinkDnsSupported").should.be.true @mock_ec2 def test_describe_classic_link_dns_support_disabled(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc = ec2.create_vpc(CidrBlock='10.90.0.0/16') + vpc = ec2.create_vpc(CidrBlock="10.90.0.0/16") response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc.id]) - assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.false + assert response.get("Vpcs")[0].get("ClassicLinkDnsSupported").should.be.false @mock_ec2 def test_describe_classic_link_dns_support_multiple(): - ec2 = boto3.resource('ec2', region_name='us-west-1') + ec2 = boto3.resource("ec2", region_name="us-west-1") # Create VPC - vpc1 = ec2.create_vpc(CidrBlock='10.90.0.0/16') - vpc2 = ec2.create_vpc(CidrBlock='10.0.0.0/16') + vpc1 = ec2.create_vpc(CidrBlock="10.90.0.0/16") + vpc2 = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc2.id) response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc1.id, vpc2.id]) - assert response.get('Vpcs')[0].get('ClassicLinkDnsSupported').should.be.false - assert response.get('Vpcs')[1].get('ClassicLinkDnsSupported').should.be.true + assert response.get("Vpcs")[0].get("ClassicLinkDnsSupported").should.be.false + assert response.get("Vpcs")[1].get("ClassicLinkDnsSupported").should.be.true From 578e8b03951336dfaece46ad933d40768a17a475 Mon Sep 17 00:00:00 2001 From: Cat Cai Date: Mon, 11 Nov 2019 13:43:23 -0800 Subject: [PATCH 5/8] Update style on VPC --- moto/ec2/responses/vpcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index 5f0030aa..f6b20f96 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -6,7 +6,7 @@ from moto.ec2.utils import filters_from_querystring class VPCs(BaseResponse): def _get_doc_date(self): - return '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + return "2013-10-15" if "Boto/" in self.headers.get("user-agent", "") else "2016-11-15" def create_vpc(self): cidr_block = self._get_param('CidrBlock') From 9cb105f5c2ac85800d0f0c9137044a9bc92661d8 Mon Sep 17 00:00:00 2001 From: Cat Cai Date: Tue, 12 Nov 2019 10:32:27 -0800 Subject: [PATCH 6/8] Ensure test is sorted --- tests/test_ec2/test_vpcs.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index f93ead82..3643e219 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -690,6 +690,7 @@ def test_enable_vpc_classic_link(): response = ec2.meta.client.enable_vpc_classic_link(VpcId=vpc.id) assert response.get("Return").should.be.true + @mock_ec2 def test_enable_vpc_classic_link_failure(): ec2 = boto3.resource("ec2", region_name="us-west-1") @@ -746,8 +747,10 @@ def test_describe_classic_link_multiple(): ec2.meta.client.enable_vpc_classic_link(VpcId=vpc2.id) response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc1.id, vpc2.id]) - assert response.get("Vpcs")[0].get("ClassicLinkEnabled").should.be.false - assert response.get("Vpcs")[1].get("ClassicLinkEnabled").should.be.true + expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] + + # Ensure response is sorted, because they can come in random order + assert sorted(response.get("Vpcs")) == sorted(expected) @mock_ec2 @@ -806,5 +809,7 @@ def test_describe_classic_link_dns_support_multiple(): ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc2.id) response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc1.id, vpc2.id]) - assert response.get("Vpcs")[0].get("ClassicLinkDnsSupported").should.be.false - assert response.get("Vpcs")[1].get("ClassicLinkDnsSupported").should.be.true + expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] + + # Ensure response is sorted, because they can come in random order + assert sorted(response.get("Vpcs")) == sorted(expected) From 9169b87748d568b630679cd09cd0cd45ca2da187 Mon Sep 17 00:00:00 2001 From: Cat Cai Date: Tue, 12 Nov 2019 11:16:34 -0800 Subject: [PATCH 7/8] Tests pass --- tests/test_ec2/test_vpcs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index 3643e219..c8a93133 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -750,7 +750,7 @@ def test_describe_classic_link_multiple(): expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] # Ensure response is sorted, because they can come in random order - assert sorted(response.get("Vpcs")) == sorted(expected) + assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort(key=lambda x: x["VpcId"]) @mock_ec2 @@ -812,4 +812,4 @@ def test_describe_classic_link_dns_support_multiple(): expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] # Ensure response is sorted, because they can come in random order - assert sorted(response.get("Vpcs")) == sorted(expected) + assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort(key=lambda x: x["VpcId"]) From 528cf0e21d886c35d14d24c0fb5d6ed69e6a5e59 Mon Sep 17 00:00:00 2001 From: Cat Cai Date: Tue, 12 Nov 2019 14:51:31 -0800 Subject: [PATCH 8/8] Run black to fix linting --- moto/ec2/models.py | 7 +++-- moto/ec2/responses/vpcs.py | 55 +++++++++++++++++++++++++++---------- tests/test_ec2/test_vpcs.py | 22 +++++++++++---- 3 files changed, 63 insertions(+), 21 deletions(-) diff --git a/moto/ec2/models.py b/moto/ec2/models.py index 5b4ef62f..31056e4f 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -2537,8 +2537,11 @@ class VPC(TaggedEC2Resource): # Doesn't check any route tables, maybe something for in the future? # See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html#classiclink-limitations network_address = ipaddress.ip_network(self.cidr_block).network_address - if network_address not in ipaddress.ip_network("10.0.0.0/8") or network_address in ipaddress.ip_network( - "10.0.0.0/16") or network_address in ipaddress.ip_network("10.1.0.0/16"): + if ( + network_address not in ipaddress.ip_network("10.0.0.0/8") + or network_address in ipaddress.ip_network("10.0.0.0/16") + or network_address in ipaddress.ip_network("10.1.0.0/16") + ): self.classic_link_enabled = "true" return self.classic_link_enabled diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index f6b20f96..0fd19837 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -6,14 +6,23 @@ from moto.ec2.utils import filters_from_querystring class VPCs(BaseResponse): def _get_doc_date(self): - return "2013-10-15" if "Boto/" in self.headers.get("user-agent", "") else "2016-11-15" + return ( + "2013-10-15" + if "Boto/" in self.headers.get("user-agent", "") + else "2016-11-15" + ) def create_vpc(self): - cidr_block = self._get_param('CidrBlock') - instance_tenancy = self._get_param('InstanceTenancy', if_none='default') - amazon_provided_ipv6_cidr_blocks = self._get_param('AmazonProvidedIpv6CidrBlock') - vpc = self.ec2_backend.create_vpc(cidr_block, instance_tenancy, - amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_blocks) + cidr_block = self._get_param("CidrBlock") + instance_tenancy = self._get_param("InstanceTenancy", if_none="default") + amazon_provided_ipv6_cidr_blocks = self._get_param( + "AmazonProvidedIpv6CidrBlock" + ) + vpc = self.ec2_backend.create_vpc( + cidr_block, + instance_tenancy, + amazon_provided_ipv6_cidr_block=amazon_provided_ipv6_cidr_blocks, + ) doc_date = self._get_doc_date() template = self.response_template(CREATE_VPC_RESPONSE) return template.render(vpc=vpc, doc_date=doc_date) @@ -28,7 +37,11 @@ class VPCs(BaseResponse): vpc_ids = self._get_multi_param("VpcId") filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) - doc_date = '2013-10-15' if 'Boto/' in self.headers.get('user-agent', '') else '2016-11-15' + doc_date = ( + "2013-10-15" + if "Boto/" in self.headers.get("user-agent", "") + else "2016-11-15" + ) template = self.response_template(DESCRIBE_VPCS_RESPONSE) return template.render(vpcs=vpcs, doc_date=doc_date) @@ -45,22 +58,32 @@ class VPCs(BaseResponse): filters = filters_from_querystring(self.querystring) vpcs = self.ec2_backend.get_all_vpcs(vpc_ids=vpc_ids, filters=filters) doc_date = self._get_doc_date() - template = self.response_template(DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) + template = self.response_template( + DESCRIBE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE + ) return template.render(vpcs=vpcs, doc_date=doc_date) def enable_vpc_classic_link_dns_support(self): vpc_id = self._get_param("VpcId") - classic_link_dns_supported = self.ec2_backend.enable_vpc_classic_link_dns_support(vpc_id=vpc_id) + classic_link_dns_supported = self.ec2_backend.enable_vpc_classic_link_dns_support( + vpc_id=vpc_id + ) doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) - return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) + return template.render( + classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date + ) def disable_vpc_classic_link_dns_support(self): vpc_id = self._get_param("VpcId") - classic_link_dns_supported = self.ec2_backend.disable_vpc_classic_link_dns_support(vpc_id=vpc_id) + classic_link_dns_supported = self.ec2_backend.disable_vpc_classic_link_dns_support( + vpc_id=vpc_id + ) doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_DNS_SUPPORT_RESPONSE) - return template.render(classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date) + return template.render( + classic_link_dns_supported=classic_link_dns_supported, doc_date=doc_date + ) def describe_vpc_classic_link(self): vpc_ids = self._get_multi_param("VpcId") @@ -75,14 +98,18 @@ class VPCs(BaseResponse): classic_link_enabled = self.ec2_backend.enable_vpc_classic_link(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(ENABLE_VPC_CLASSIC_LINK_RESPONSE) - return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) + return template.render( + classic_link_enabled=classic_link_enabled, doc_date=doc_date + ) def disable_vpc_classic_link(self): vpc_id = self._get_param("VpcId") classic_link_enabled = self.ec2_backend.disable_vpc_classic_link(vpc_id=vpc_id) doc_date = self._get_doc_date() template = self.response_template(DISABLE_VPC_CLASSIC_LINK_RESPONSE) - return template.render(classic_link_enabled=classic_link_enabled, doc_date=doc_date) + return template.render( + classic_link_enabled=classic_link_enabled, doc_date=doc_date + ) def modify_vpc_attribute(self): vpc_id = self._get_param("VpcId") diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index c8a93133..1bc3ddd9 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -747,10 +747,15 @@ def test_describe_classic_link_multiple(): ec2.meta.client.enable_vpc_classic_link(VpcId=vpc2.id) response = ec2.meta.client.describe_vpc_classic_link(VpcIds=[vpc1.id, vpc2.id]) - expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] + expected = [ + {"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, + {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}, + ] # Ensure response is sorted, because they can come in random order - assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort(key=lambda x: x["VpcId"]) + assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort( + key=lambda x: x["VpcId"] + ) @mock_ec2 @@ -808,8 +813,15 @@ def test_describe_classic_link_dns_support_multiple(): vpc2 = ec2.create_vpc(CidrBlock="10.0.0.0/16") ec2.meta.client.enable_vpc_classic_link_dns_support(VpcId=vpc2.id) - response = ec2.meta.client.describe_vpc_classic_link_dns_support(VpcIds=[vpc1.id, vpc2.id]) - expected = [{"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}] + response = ec2.meta.client.describe_vpc_classic_link_dns_support( + VpcIds=[vpc1.id, vpc2.id] + ) + expected = [ + {"VpcId": vpc1.id, "ClassicLinkDnsSupported": False}, + {"VpcId": vpc2.id, "ClassicLinkDnsSupported": True}, + ] # Ensure response is sorted, because they can come in random order - assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort(key=lambda x: x["VpcId"]) + assert response.get("Vpcs").sort(key=lambda x: x["VpcId"]) == expected.sort( + key=lambda x: x["VpcId"] + )