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…
Reference in New Issue
Block a user