added support for carrier gateway (#4280)
This commit is contained in:
parent
99c661781e
commit
39314906bc
@ -703,3 +703,11 @@ class InvalidSubnetCidrBlockAssociationID(EC2ClientError):
|
|||||||
association_id
|
association_id
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidCarrierGatewayID(EC2ClientError):
|
||||||
|
def __init__(self, carrier_gateway_id):
|
||||||
|
super(InvalidCarrierGatewayID, self).__init__(
|
||||||
|
"InvalidCarrierGatewayID.NotFound",
|
||||||
|
"The CarrierGateway ID '{0}' does not exist".format(carrier_gateway_id),
|
||||||
|
)
|
||||||
|
@ -116,6 +116,7 @@ from .exceptions import (
|
|||||||
InvalidVpcEndPointIdError,
|
InvalidVpcEndPointIdError,
|
||||||
InvalidTaggableResourceType,
|
InvalidTaggableResourceType,
|
||||||
InvalidGatewayIDError,
|
InvalidGatewayIDError,
|
||||||
|
InvalidCarrierGatewayID,
|
||||||
)
|
)
|
||||||
from .utils import (
|
from .utils import (
|
||||||
EC2_RESOURCE_TO_PREFIX,
|
EC2_RESOURCE_TO_PREFIX,
|
||||||
@ -160,6 +161,7 @@ from .utils import (
|
|||||||
random_vpc_cidr_association_id,
|
random_vpc_cidr_association_id,
|
||||||
random_vpc_peering_connection_id,
|
random_vpc_peering_connection_id,
|
||||||
random_iam_instance_profile_association_id,
|
random_iam_instance_profile_association_id,
|
||||||
|
random_carrier_gateway_id,
|
||||||
generic_filter,
|
generic_filter,
|
||||||
is_valid_resource_id,
|
is_valid_resource_id,
|
||||||
get_prefix,
|
get_prefix,
|
||||||
@ -5344,6 +5346,66 @@ class InternetGatewayBackend(object):
|
|||||||
return self.describe_internet_gateways(internet_gateway_ids=igw_ids)[0]
|
return self.describe_internet_gateways(internet_gateway_ids=igw_ids)[0]
|
||||||
|
|
||||||
|
|
||||||
|
class CarrierGateway(TaggedEC2Resource):
|
||||||
|
def __init__(self, ec2_backend, vpc_id, tags=None):
|
||||||
|
self.id = random_carrier_gateway_id()
|
||||||
|
self.ec2_backend = ec2_backend
|
||||||
|
self.vpc_id = vpc_id
|
||||||
|
self.state = "available"
|
||||||
|
self.add_tags(tags or {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def physical_resource_id(self):
|
||||||
|
return self.id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def owner_id(self):
|
||||||
|
return ACCOUNT_ID
|
||||||
|
|
||||||
|
|
||||||
|
class CarrierGatewayBackend(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.carrier_gateways = {}
|
||||||
|
super(CarrierGatewayBackend, self).__init__()
|
||||||
|
|
||||||
|
def create_carrier_gateway(self, vpc_id, tags=None):
|
||||||
|
vpc = self.get_vpc(vpc_id)
|
||||||
|
if not vpc:
|
||||||
|
raise InvalidVPCIdError(vpc_id)
|
||||||
|
carrier_gateway = CarrierGateway(self, vpc_id, tags)
|
||||||
|
self.carrier_gateways[carrier_gateway.id] = carrier_gateway
|
||||||
|
return carrier_gateway
|
||||||
|
|
||||||
|
def delete_carrier_gateway(self, id):
|
||||||
|
if not self.carrier_gateways.get(id):
|
||||||
|
raise InvalidCarrierGatewayID(id)
|
||||||
|
carrier_gateway = self.carrier_gateways.pop(id)
|
||||||
|
carrier_gateway.state = "deleted"
|
||||||
|
return carrier_gateway
|
||||||
|
|
||||||
|
def describe_carrier_gateways(self, ids=None, filters=None):
|
||||||
|
carrier_gateways = list(self.carrier_gateways.values())
|
||||||
|
|
||||||
|
if ids:
|
||||||
|
carrier_gateways = [
|
||||||
|
carrier_gateway
|
||||||
|
for carrier_gateway in carrier_gateways
|
||||||
|
if carrier_gateway.id in ids
|
||||||
|
]
|
||||||
|
|
||||||
|
attr_pairs = (
|
||||||
|
("carrier-gateway-id", "id"),
|
||||||
|
("state", "state"),
|
||||||
|
("vpc-id", "vpc_id"),
|
||||||
|
("owner-id", "owner_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
result = carrier_gateways
|
||||||
|
if filters:
|
||||||
|
result = filter_resources(carrier_gateways, filters, attr_pairs)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class EgressOnlyInternetGateway(TaggedEC2Resource):
|
class EgressOnlyInternetGateway(TaggedEC2Resource):
|
||||||
def __init__(self, ec2_backend, vpc_id, tags=None):
|
def __init__(self, ec2_backend, vpc_id, tags=None):
|
||||||
self.id = random_egress_only_internet_gateway_id()
|
self.id = random_egress_only_internet_gateway_id()
|
||||||
@ -7962,6 +8024,7 @@ class EC2Backend(
|
|||||||
TransitGatewayRelationsBackend,
|
TransitGatewayRelationsBackend,
|
||||||
LaunchTemplateBackend,
|
LaunchTemplateBackend,
|
||||||
IamInstanceProfileAssociationBackend,
|
IamInstanceProfileAssociationBackend,
|
||||||
|
CarrierGatewayBackend,
|
||||||
):
|
):
|
||||||
def __init__(self, region_name):
|
def __init__(self, region_name):
|
||||||
self.region_name = region_name
|
self.region_name = region_name
|
||||||
|
@ -39,6 +39,7 @@ from .transit_gateways import TransitGateways
|
|||||||
from .transit_gateway_route_tables import TransitGatewayRouteTable
|
from .transit_gateway_route_tables import TransitGatewayRouteTable
|
||||||
from .transit_gateway_attachments import TransitGatewayAttachment
|
from .transit_gateway_attachments import TransitGatewayAttachment
|
||||||
from .iam_instance_profiles import IamInstanceProfiles
|
from .iam_instance_profiles import IamInstanceProfiles
|
||||||
|
from .carrier_gateways import CarrierGateway
|
||||||
|
|
||||||
|
|
||||||
class EC2Response(
|
class EC2Response(
|
||||||
@ -81,6 +82,7 @@ class EC2Response(
|
|||||||
TransitGatewayRouteTable,
|
TransitGatewayRouteTable,
|
||||||
TransitGatewayAttachment,
|
TransitGatewayAttachment,
|
||||||
IamInstanceProfiles,
|
IamInstanceProfiles,
|
||||||
|
CarrierGateway,
|
||||||
):
|
):
|
||||||
@property
|
@property
|
||||||
def ec2_backend(self):
|
def ec2_backend(self):
|
||||||
|
94
moto/ec2/responses/carrier_gateways.py
Normal file
94
moto/ec2/responses/carrier_gateways.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
from moto.core.responses import BaseResponse
|
||||||
|
from moto.ec2.utils import filters_from_querystring, add_tag_specification
|
||||||
|
|
||||||
|
|
||||||
|
class CarrierGateway(BaseResponse):
|
||||||
|
def create_carrier_gateway(self):
|
||||||
|
vpc_id = self._get_param("VpcId")
|
||||||
|
tags = self._get_multi_param("TagSpecification")
|
||||||
|
tags = add_tag_specification(tags)
|
||||||
|
|
||||||
|
carrier_gateway = self.ec2_backend.create_carrier_gateway(
|
||||||
|
vpc_id=vpc_id, tags=tags
|
||||||
|
)
|
||||||
|
template = self.response_template(CREATE_CARRIER_GATEWAY_RESPONSE)
|
||||||
|
return template.render(carrier_gateway=carrier_gateway)
|
||||||
|
|
||||||
|
def delete_carrier_gateway(self):
|
||||||
|
carrier_gateway_id = self._get_param("CarrierGatewayId")
|
||||||
|
|
||||||
|
carrier_gateway = self.ec2_backend.delete_carrier_gateway(carrier_gateway_id)
|
||||||
|
template = self.response_template(DELETE_CARRIER_GATEWAY_RESPONSE)
|
||||||
|
return template.render(carrier_gateway=carrier_gateway)
|
||||||
|
|
||||||
|
def describe_carrier_gateways(self):
|
||||||
|
carrier_gateway_ids = self._get_multi_param("CarrierGatewayId")
|
||||||
|
filters = filters_from_querystring(self.querystring)
|
||||||
|
|
||||||
|
carrier_gateways = self.ec2_backend.describe_carrier_gateways(
|
||||||
|
carrier_gateway_ids, filters
|
||||||
|
)
|
||||||
|
template = self.response_template(DESCRIBE_CARRIER_GATEWAYS_RESPONSE)
|
||||||
|
return template.render(carrier_gateways=carrier_gateways)
|
||||||
|
|
||||||
|
|
||||||
|
CREATE_CARRIER_GATEWAY_RESPONSE = """<CreateCarrierGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
|
||||||
|
<requestId>c617595f-6c29-4a00-a941-example</requestId>
|
||||||
|
<carrierGateway>
|
||||||
|
<state>{{ carrier_gateway.state }}</state>
|
||||||
|
<vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
|
||||||
|
<carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
|
||||||
|
<ownerId>{{ carrier_gateway.owner_id }}</ownerId>
|
||||||
|
<tagSet>
|
||||||
|
{% for tag in carrier_gateway.get_tags() %}
|
||||||
|
<item>
|
||||||
|
<key>{{ tag.key }}</key>
|
||||||
|
<value>{{ tag.value }}</value>
|
||||||
|
</item>
|
||||||
|
{% endfor %}
|
||||||
|
</tagSet>
|
||||||
|
</carrierGateway>
|
||||||
|
</CreateCarrierGatewayResponse>
|
||||||
|
"""
|
||||||
|
|
||||||
|
DELETE_CARRIER_GATEWAY_RESPONSE = """<DeleteCarrierGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
|
||||||
|
<requestId>c617595f-6c29-4a00-a941-example</requestId>
|
||||||
|
<carrierGateway>
|
||||||
|
<state>{{ carrier_gateway.state }}</state>
|
||||||
|
<vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
|
||||||
|
<carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
|
||||||
|
<ownerId>{{ carrier_gateway.owner_id }}</ownerId>
|
||||||
|
<tagSet>
|
||||||
|
{% for tag in carrier_gateway.get_tags() %}
|
||||||
|
<item>
|
||||||
|
<key>{{ tag.key }}</key>
|
||||||
|
<value>{{ tag.value }}</value>
|
||||||
|
</item>
|
||||||
|
{% endfor %}
|
||||||
|
</tagSet>
|
||||||
|
</carrierGateway>
|
||||||
|
</DeleteCarrierGatewayResponse>
|
||||||
|
"""
|
||||||
|
|
||||||
|
DESCRIBE_CARRIER_GATEWAYS_RESPONSE = """<DescribeCarrierGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
|
||||||
|
<requestId>151283df-f7dc-4317-89b4-01c9888b1d45</requestId>
|
||||||
|
<carrierGatewaySet>
|
||||||
|
{% for carrier_gateway in carrier_gateways %}
|
||||||
|
<item>
|
||||||
|
<state>{{ carrier_gateway.state }}</state>
|
||||||
|
<vpcId>{{ carrier_gateway.vpc_id }}</vpcId>
|
||||||
|
<carrierGatewayId>{{ carrier_gateway.id }}</carrierGatewayId>
|
||||||
|
<ownerId>{{ carrier_gateway.owner_id }}</ownerId>
|
||||||
|
<tagSet>
|
||||||
|
{% for tag in carrier_gateway.get_tags() %}
|
||||||
|
<item>
|
||||||
|
<key>{{ tag.key }}</key>
|
||||||
|
<value>{{ tag.value }}</value>
|
||||||
|
</item>
|
||||||
|
{% endfor %}
|
||||||
|
</tagSet>
|
||||||
|
</item>
|
||||||
|
{% endfor %}
|
||||||
|
</carrierGatewaySet>
|
||||||
|
</DescribeCarrierGatewaysResponse>
|
||||||
|
"""
|
@ -52,6 +52,7 @@ EC2_RESOURCE_TO_PREFIX = {
|
|||||||
"vpn-connection": "vpn",
|
"vpn-connection": "vpn",
|
||||||
"vpn-gateway": "vgw",
|
"vpn-gateway": "vgw",
|
||||||
"iam-instance-profile-association": "iip-assoc",
|
"iam-instance-profile-association": "iip-assoc",
|
||||||
|
"carrier-gateway": "cagw",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -220,6 +221,10 @@ def random_iam_instance_profile_association_id():
|
|||||||
return random_id(prefix=EC2_RESOURCE_TO_PREFIX["iam-instance-profile-association"])
|
return random_id(prefix=EC2_RESOURCE_TO_PREFIX["iam-instance-profile-association"])
|
||||||
|
|
||||||
|
|
||||||
|
def random_carrier_gateway_id():
|
||||||
|
return random_id(prefix=EC2_RESOURCE_TO_PREFIX["carrier-gateway"], size=17)
|
||||||
|
|
||||||
|
|
||||||
def random_public_ip():
|
def random_public_ip():
|
||||||
return "54.214.{0}.{1}".format(random.choice(range(255)), random.choice(range(255)))
|
return "54.214.{0}.{1}".format(random.choice(range(255)), random.choice(range(255)))
|
||||||
|
|
||||||
|
@ -123,3 +123,4 @@ TestAccAWSInternetGateway
|
|||||||
TestAccAWSSecurityGroupRule_
|
TestAccAWSSecurityGroupRule_
|
||||||
TestAccAWSVpnGateway
|
TestAccAWSVpnGateway
|
||||||
TestAccAWSVpnGatewayAttachment
|
TestAccAWSVpnGatewayAttachment
|
||||||
|
TestAccAWSEc2CarrierGateway
|
Loading…
Reference in New Issue
Block a user