Fix:Ec2-VPC:Added functionality describe-vpc-endpoint (#3524)
* Fix:Ec2:Added fucntionality describe-vpc-endpoint * Refactor * Added test cases for errors
This commit is contained in:
		
							parent
							
								
									e1fc3a9596
								
							
						
					
					
						commit
						af60306371
					
				@ -607,3 +607,11 @@ class InvalidAssociationIDIamProfileAssociationError(EC2ClientError):
 | 
				
			|||||||
            "InvalidAssociationID.NotFound",
 | 
					            "InvalidAssociationID.NotFound",
 | 
				
			||||||
            "An invalid association-id of '{0}' was given".format(association_id),
 | 
					            "An invalid association-id of '{0}' was given".format(association_id),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InvalidVpcEndPointIdError(EC2ClientError):
 | 
				
			||||||
 | 
					    def __init__(self, vpc_end_point_id):
 | 
				
			||||||
 | 
					        super(InvalidVpcEndPointIdError, self).__init__(
 | 
				
			||||||
 | 
					            "InvalidVpcEndPointId.NotFound",
 | 
				
			||||||
 | 
					            "The VpcEndPoint ID '{0}' does not exist".format(vpc_end_point_id),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
				
			|||||||
@ -108,6 +108,7 @@ from .exceptions import (
 | 
				
			|||||||
    InvalidParameterDependency,
 | 
					    InvalidParameterDependency,
 | 
				
			||||||
    IncorrectStateIamProfileAssociationError,
 | 
					    IncorrectStateIamProfileAssociationError,
 | 
				
			||||||
    InvalidAssociationIDIamProfileAssociationError,
 | 
					    InvalidAssociationIDIamProfileAssociationError,
 | 
				
			||||||
 | 
					    InvalidVpcEndPointIdError,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from .utils import (
 | 
					from .utils import (
 | 
				
			||||||
    EC2_RESOURCE_TO_PREFIX,
 | 
					    EC2_RESOURCE_TO_PREFIX,
 | 
				
			||||||
@ -3222,6 +3223,25 @@ class VPCBackend(object):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return vpc_end_point
 | 
					        return vpc_end_point
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_vpc_end_point(self, vpc_end_point_ids, filters=None):
 | 
				
			||||||
 | 
					        vpc_end_points = self.vpc_end_points.values()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if vpc_end_point_ids:
 | 
				
			||||||
 | 
					            vpc_end_points = [
 | 
				
			||||||
 | 
					                vpc_end_point
 | 
				
			||||||
 | 
					                for vpc_end_point in vpc_end_points
 | 
				
			||||||
 | 
					                if vpc_end_point.id in vpc_end_point_ids
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					            if len(vpc_end_points) != len(vpc_end_point_ids):
 | 
				
			||||||
 | 
					                invalid_id = list(
 | 
				
			||||||
 | 
					                    set(vpc_end_point_ids).difference(
 | 
				
			||||||
 | 
					                        set([vpc_end_point.id for vpc_end_point in vpc_end_points])
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                )[0]
 | 
				
			||||||
 | 
					                raise InvalidVpcEndPointIdError(invalid_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return generic_filter(filters, vpc_end_points)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_vpc_end_point_services(self):
 | 
					    def get_vpc_end_point_services(self):
 | 
				
			||||||
        vpc_end_point_services = self.vpc_end_points.values()
 | 
					        vpc_end_point_services = self.vpc_end_points.values()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -198,9 +198,18 @@ class VPCs(BaseResponse):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def describe_vpc_endpoint_services(self):
 | 
					    def describe_vpc_endpoint_services(self):
 | 
				
			||||||
        vpc_end_point_services = self.ec2_backend.get_vpc_end_point_services()
 | 
					        vpc_end_point_services = self.ec2_backend.get_vpc_end_point_services()
 | 
				
			||||||
        template = self.response_template(DESCRIBE_VPC_ENDPOINT_RESPONSE)
 | 
					        template = self.response_template(DESCRIBE_VPC_ENDPOINT_SERVICES_RESPONSE)
 | 
				
			||||||
        return template.render(vpc_end_points=vpc_end_point_services)
 | 
					        return template.render(vpc_end_points=vpc_end_point_services)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def describe_vpc_endpoints(self):
 | 
				
			||||||
 | 
					        vpc_end_points_ids = self._get_multi_param("VpcEndpointId")
 | 
				
			||||||
 | 
					        filters = filters_from_querystring(self.querystring)
 | 
				
			||||||
 | 
					        vpc_end_points = self.ec2_backend.get_vpc_end_point(
 | 
				
			||||||
 | 
					            vpc_end_point_ids=vpc_end_points_ids, filters=filters
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        template = self.response_template(DESCRIBE_VPC_ENDPOINT_RESPONSE)
 | 
				
			||||||
 | 
					        return template.render(vpc_end_points=vpc_end_points)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE_VPC_RESPONSE = """
 | 
					CREATE_VPC_RESPONSE = """
 | 
				
			||||||
<CreateVpcResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
 | 
					<CreateVpcResponse xmlns="http://ec2.amazonaws.com/doc/{{doc_date}}/">
 | 
				
			||||||
@ -460,7 +469,7 @@ CREATE_VPC_END_POINT = """ <CreateVpcEndpointResponse xmlns="http://monitoring.a
 | 
				
			|||||||
    </vpcEndpoint>
 | 
					    </vpcEndpoint>
 | 
				
			||||||
</CreateVpcEndpointResponse>"""
 | 
					</CreateVpcEndpointResponse>"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DESCRIBE_VPC_ENDPOINT_RESPONSE = """<DescribeVpcEndpointServicesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
 | 
					DESCRIBE_VPC_ENDPOINT_SERVICES_RESPONSE = """<DescribeVpcEndpointServicesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
 | 
				
			||||||
    <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
 | 
					    <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
 | 
				
			||||||
    <serviceNameSet>
 | 
					    <serviceNameSet>
 | 
				
			||||||
        {% for serviceName in vpc_end_points.services %}
 | 
					        {% for serviceName in vpc_end_points.services %}
 | 
				
			||||||
@ -491,3 +500,69 @@ DESCRIBE_VPC_ENDPOINT_RESPONSE = """<DescribeVpcEndpointServicesResponse xmlns="
 | 
				
			|||||||
        </item>
 | 
					        </item>
 | 
				
			||||||
    </serviceDetailSet>
 | 
					    </serviceDetailSet>
 | 
				
			||||||
</DescribeVpcEndpointServicesResponse>"""
 | 
					</DescribeVpcEndpointServicesResponse>"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIBE_VPC_ENDPOINT_RESPONSE = """<DescribeVpcEndpointsResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
 | 
				
			||||||
 | 
					    <requestId>19a9ff46-7df6-49b8-9726-3df27527089d</requestId>
 | 
				
			||||||
 | 
					    <vpcEndpointSet>
 | 
				
			||||||
 | 
					        {% for vpc_end_point in vpc_end_points %}
 | 
				
			||||||
 | 
					            <item>
 | 
				
			||||||
 | 
					                {% if vpc_end_point.policy_document %}
 | 
				
			||||||
 | 
					                    <policyDocument>{{ vpc_end_point.policy_document }}</policyDocument>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                <state>available</state>
 | 
				
			||||||
 | 
					                <privateDnsEnabled>{{ vpc_end_point.private_dns_enabled }}</privateDnsEnabled>
 | 
				
			||||||
 | 
					                <serviceName>{{ vpc_end_point.service_name }}</serviceName>
 | 
				
			||||||
 | 
					                <vpcId>{{ vpc_end_point.vpc_id }}</vpcId>
 | 
				
			||||||
 | 
					                <vpcEndpointId>{{ vpc_end_point.id }}</vpcEndpointId>
 | 
				
			||||||
 | 
					                <vpcEndpointType>{{ vpc_end_point.type }}</vpcEndpointType>
 | 
				
			||||||
 | 
					                {% if vpc_end_point.subnet_ids %}
 | 
				
			||||||
 | 
					                    <subnetIdSet>
 | 
				
			||||||
 | 
					                        {% for subnet_id in vpc_end_point.subnet_ids %}
 | 
				
			||||||
 | 
					                            <item>{{ subnet_id }}</item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </subnetIdSet>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% if vpc_end_point.route_table_ids %}
 | 
				
			||||||
 | 
					                    <routeTableIdSet>
 | 
				
			||||||
 | 
					                        {% for route_table_id in vpc_end_point.route_table_ids %}
 | 
				
			||||||
 | 
					                            <item>{{ route_table_id }}</item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </routeTableIdSet>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% if vpc_end_point.network_interface_ids %}
 | 
				
			||||||
 | 
					                    <networkInterfaceIdSet>
 | 
				
			||||||
 | 
					                        {% for network_interface_id in vpc_end_point.network_interface_ids %}
 | 
				
			||||||
 | 
					                            <item>{{ network_interface_id }}</item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </networkInterfaceIdSet>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% if vpc_end_point.dns_entries %}
 | 
				
			||||||
 | 
					                    <dnsEntries>
 | 
				
			||||||
 | 
					                        {% for dns_entry in vpc_end_point.dns_entries %}
 | 
				
			||||||
 | 
					                            <item>{{ dns_entry }}</item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </dnsEntries>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% if vpc_end_point.groups %}
 | 
				
			||||||
 | 
					                    <groups>
 | 
				
			||||||
 | 
					                        {% for group in vpc_end_point.groups %}
 | 
				
			||||||
 | 
					                            <item>{{ group }}</item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </groups>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% if vpc_end_point.tag_specifications %}
 | 
				
			||||||
 | 
					                    <tagSet>
 | 
				
			||||||
 | 
					                        {% for tag in vpc_end_point.tag_specifications %}
 | 
				
			||||||
 | 
					                          <item>
 | 
				
			||||||
 | 
					                            <key>{{ tag.key }}</key>
 | 
				
			||||||
 | 
					                            <value>{{ tag.value }}</value>
 | 
				
			||||||
 | 
					                          </item>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </tagSet>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                <ownerId>123456789012</ownerId>
 | 
				
			||||||
 | 
					                <creationTimestamp>{{ vpc_end_point.created_at }}</creationTimestamp>
 | 
				
			||||||
 | 
					            </item>
 | 
				
			||||||
 | 
					        {% endfor %}
 | 
				
			||||||
 | 
					    </vpcEndpointSet>
 | 
				
			||||||
 | 
					</DescribeVpcEndpointsResponse>"""
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,8 @@ from botocore.exceptions import ClientError
 | 
				
			|||||||
import boto3
 | 
					import boto3
 | 
				
			||||||
import boto
 | 
					import boto
 | 
				
			||||||
from boto.exception import EC2ResponseError
 | 
					from boto.exception import EC2ResponseError
 | 
				
			||||||
import sure  # noqa
 | 
					
 | 
				
			||||||
 | 
					# import sure  # noqa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from moto import mock_ec2, mock_ec2_deprecated
 | 
					from moto import mock_ec2, mock_ec2_deprecated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -868,3 +869,50 @@ def test_describe_vpc_end_point_services():
 | 
				
			|||||||
        "us-west-1a",
 | 
					        "us-west-1a",
 | 
				
			||||||
        "us-west-1b",
 | 
					        "us-west-1b",
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mock_ec2
 | 
				
			||||||
 | 
					def test_describe_vpc_end_points():
 | 
				
			||||||
 | 
					    ec2 = boto3.client("ec2", region_name="us-west-1")
 | 
				
			||||||
 | 
					    vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    route_table = ec2.create_route_table(VpcId=vpc["Vpc"]["VpcId"])
 | 
				
			||||||
 | 
					    vpc_end_point = ec2.create_vpc_endpoint(
 | 
				
			||||||
 | 
					        VpcId=vpc["Vpc"]["VpcId"],
 | 
				
			||||||
 | 
					        ServiceName="com.amazonaws.us-east-1.s3",
 | 
				
			||||||
 | 
					        RouteTableIds=[route_table["RouteTable"]["RouteTableId"]],
 | 
				
			||||||
 | 
					        VpcEndpointType="gateway",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vpc_endpoints = ec2.describe_vpc_endpoints()
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get(
 | 
				
			||||||
 | 
					        "VpcEndpointId"
 | 
				
			||||||
 | 
					    ) == vpc_end_point.get("VpcEndpoint").get("VpcEndpointId")
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get("VpcId") == vpc["Vpc"]["VpcId"]
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get("RouteTableIds") == [
 | 
				
			||||||
 | 
					        route_table.get("RouteTable").get("RouteTableId")
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					    assert "VpcEndpointType" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					    assert "ServiceName" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					    assert "State" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vpc_endpoints = ec2.describe_vpc_endpoints(
 | 
				
			||||||
 | 
					        VpcEndpointIds=[vpc_end_point.get("VpcEndpoint").get("VpcEndpointId")]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get(
 | 
				
			||||||
 | 
					        "VpcEndpointId"
 | 
				
			||||||
 | 
					    ) == vpc_end_point.get("VpcEndpoint").get("VpcEndpointId")
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get("VpcId") == vpc["Vpc"]["VpcId"]
 | 
				
			||||||
 | 
					    assert vpc_endpoints.get("VpcEndpoints")[0].get("RouteTableIds") == [
 | 
				
			||||||
 | 
					        route_table.get("RouteTable").get("RouteTableId")
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					    assert "VpcEndpointType" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					    assert "ServiceName" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					    assert "State" in vpc_endpoints.get("VpcEndpoints")[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        ec2.describe_vpc_endpoints(
 | 
				
			||||||
 | 
					            VpcEndpointIds=[route_table.get("RouteTable").get("RouteTableId")]
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    except ClientError as err:
 | 
				
			||||||
 | 
					        assert err.response["Error"]["Code"] == "InvalidVpcEndPointId.NotFound"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user