Replace and delete Network ACL Entries
This commit is contained in:
parent
af9c65c5cc
commit
b6d9b4f584
@ -118,21 +118,18 @@ def validate_resource_ids(resource_ids):
|
|||||||
|
|
||||||
|
|
||||||
class InstanceState(object):
|
class InstanceState(object):
|
||||||
|
|
||||||
def __init__(self, name='pending', code=0):
|
def __init__(self, name='pending', code=0):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.code = code
|
self.code = code
|
||||||
|
|
||||||
|
|
||||||
class StateReason(object):
|
class StateReason(object):
|
||||||
|
|
||||||
def __init__(self, message="", code=""):
|
def __init__(self, message="", code=""):
|
||||||
self.message = message
|
self.message = message
|
||||||
self.code = code
|
self.code = code
|
||||||
|
|
||||||
|
|
||||||
class TaggedEC2Resource(BaseModel):
|
class TaggedEC2Resource(BaseModel):
|
||||||
|
|
||||||
def get_tags(self, *args, **kwargs):
|
def get_tags(self, *args, **kwargs):
|
||||||
tags = self.ec2_backend.describe_tags(
|
tags = self.ec2_backend.describe_tags(
|
||||||
filters={'resource-id': [self.id]})
|
filters={'resource-id': [self.id]})
|
||||||
@ -164,7 +161,6 @@ class TaggedEC2Resource(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkInterface(TaggedEC2Resource):
|
class NetworkInterface(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, subnet, private_ip_address, device_index=0,
|
def __init__(self, ec2_backend, subnet, private_ip_address, device_index=0,
|
||||||
public_ip_auto_assign=True, group_ids=None):
|
public_ip_auto_assign=True, group_ids=None):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
@ -277,7 +273,6 @@ class NetworkInterface(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkInterfaceBackend(object):
|
class NetworkInterfaceBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.enis = {}
|
self.enis = {}
|
||||||
super(NetworkInterfaceBackend, self).__init__()
|
super(NetworkInterfaceBackend, self).__init__()
|
||||||
@ -621,7 +616,6 @@ class Instance(TaggedEC2Resource, BotoInstance):
|
|||||||
|
|
||||||
|
|
||||||
class InstanceBackend(object):
|
class InstanceBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.reservations = OrderedDict()
|
self.reservations = OrderedDict()
|
||||||
super(InstanceBackend, self).__init__()
|
super(InstanceBackend, self).__init__()
|
||||||
@ -791,7 +785,6 @@ class InstanceBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class KeyPairBackend(object):
|
class KeyPairBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.keypairs = defaultdict(dict)
|
self.keypairs = defaultdict(dict)
|
||||||
super(KeyPairBackend, self).__init__()
|
super(KeyPairBackend, self).__init__()
|
||||||
@ -830,7 +823,6 @@ class KeyPairBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class TagBackend(object):
|
class TagBackend(object):
|
||||||
|
|
||||||
VALID_TAG_FILTERS = ['key',
|
VALID_TAG_FILTERS = ['key',
|
||||||
'resource-id',
|
'resource-id',
|
||||||
'resource-type',
|
'resource-type',
|
||||||
@ -957,7 +949,6 @@ class TagBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class Ami(TaggedEC2Resource):
|
class Ami(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, ami_id, instance=None, source_ami=None,
|
def __init__(self, ec2_backend, ami_id, instance=None, source_ami=None,
|
||||||
name=None, description=None):
|
name=None, description=None):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
@ -1036,7 +1027,6 @@ class Ami(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class AmiBackend(object):
|
class AmiBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.amis = {}
|
self.amis = {}
|
||||||
super(AmiBackend, self).__init__()
|
super(AmiBackend, self).__init__()
|
||||||
@ -1141,14 +1131,12 @@ class AmiBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class Region(object):
|
class Region(object):
|
||||||
|
|
||||||
def __init__(self, name, endpoint):
|
def __init__(self, name, endpoint):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.endpoint = endpoint
|
self.endpoint = endpoint
|
||||||
|
|
||||||
|
|
||||||
class Zone(object):
|
class Zone(object):
|
||||||
|
|
||||||
def __init__(self, name, region_name):
|
def __init__(self, name, region_name):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.region_name = region_name
|
self.region_name = region_name
|
||||||
@ -1191,7 +1179,6 @@ class RegionsAndZonesBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class SecurityRule(object):
|
class SecurityRule(object):
|
||||||
|
|
||||||
def __init__(self, ip_protocol, from_port, to_port, ip_ranges, source_groups):
|
def __init__(self, ip_protocol, from_port, to_port, ip_ranges, source_groups):
|
||||||
self.ip_protocol = ip_protocol
|
self.ip_protocol = ip_protocol
|
||||||
self.from_port = from_port
|
self.from_port = from_port
|
||||||
@ -1214,7 +1201,6 @@ class SecurityRule(object):
|
|||||||
|
|
||||||
|
|
||||||
class SecurityGroup(TaggedEC2Resource):
|
class SecurityGroup(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, group_id, name, description, vpc_id=None):
|
def __init__(self, ec2_backend, group_id, name, description, vpc_id=None):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = group_id
|
self.id = group_id
|
||||||
@ -1353,7 +1339,6 @@ class SecurityGroup(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class SecurityGroupBackend(object):
|
class SecurityGroupBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# the key in the dict group is the vpc_id or None (non-vpc)
|
# the key in the dict group is the vpc_id or None (non-vpc)
|
||||||
self.groups = defaultdict(dict)
|
self.groups = defaultdict(dict)
|
||||||
@ -1597,7 +1582,6 @@ class SecurityGroupBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class SecurityGroupIngress(object):
|
class SecurityGroupIngress(object):
|
||||||
|
|
||||||
def __init__(self, security_group, properties):
|
def __init__(self, security_group, properties):
|
||||||
self.security_group = security_group
|
self.security_group = security_group
|
||||||
self.properties = properties
|
self.properties = properties
|
||||||
@ -1656,7 +1640,6 @@ class SecurityGroupIngress(object):
|
|||||||
|
|
||||||
|
|
||||||
class VolumeAttachment(object):
|
class VolumeAttachment(object):
|
||||||
|
|
||||||
def __init__(self, volume, instance, device, status):
|
def __init__(self, volume, instance, device, status):
|
||||||
self.volume = volume
|
self.volume = volume
|
||||||
self.attach_time = utc_date_and_time()
|
self.attach_time = utc_date_and_time()
|
||||||
@ -1681,7 +1664,6 @@ class VolumeAttachment(object):
|
|||||||
|
|
||||||
|
|
||||||
class Volume(TaggedEC2Resource):
|
class Volume(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, volume_id, size, zone, snapshot_id=None, encrypted=False):
|
def __init__(self, ec2_backend, volume_id, size, zone, snapshot_id=None, encrypted=False):
|
||||||
self.id = volume_id
|
self.id = volume_id
|
||||||
self.size = size
|
self.size = size
|
||||||
@ -1755,7 +1737,6 @@ class Volume(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class Snapshot(TaggedEC2Resource):
|
class Snapshot(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, snapshot_id, volume, description, encrypted=False):
|
def __init__(self, ec2_backend, snapshot_id, volume, description, encrypted=False):
|
||||||
self.id = snapshot_id
|
self.id = snapshot_id
|
||||||
self.volume = volume
|
self.volume = volume
|
||||||
@ -1799,7 +1780,6 @@ class Snapshot(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class EBSBackend(object):
|
class EBSBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.volumes = {}
|
self.volumes = {}
|
||||||
self.attachments = {}
|
self.attachments = {}
|
||||||
@ -1916,7 +1896,6 @@ class EBSBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class VPC(TaggedEC2Resource):
|
class VPC(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, vpc_id, cidr_block, is_default, instance_tenancy='default'):
|
def __init__(self, ec2_backend, vpc_id, cidr_block, is_default, instance_tenancy='default'):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = vpc_id
|
self.id = vpc_id
|
||||||
@ -1972,7 +1951,6 @@ class VPC(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class VPCBackend(object):
|
class VPCBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.vpcs = {}
|
self.vpcs = {}
|
||||||
super(VPCBackend, self).__init__()
|
super(VPCBackend, self).__init__()
|
||||||
@ -2015,7 +1993,7 @@ class VPCBackend(object):
|
|||||||
if len(route_tables) > 1:
|
if len(route_tables) > 1:
|
||||||
raise DependencyViolationError(
|
raise DependencyViolationError(
|
||||||
"The vpc {0} has dependencies and cannot be deleted."
|
"The vpc {0} has dependencies and cannot be deleted."
|
||||||
.format(vpc_id)
|
.format(vpc_id)
|
||||||
)
|
)
|
||||||
for route_table in route_tables:
|
for route_table in route_tables:
|
||||||
self.delete_route_table(route_table.id)
|
self.delete_route_table(route_table.id)
|
||||||
@ -2052,7 +2030,6 @@ class VPCBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class VPCPeeringConnectionStatus(object):
|
class VPCPeeringConnectionStatus(object):
|
||||||
|
|
||||||
def __init__(self, code='initiating-request', message=''):
|
def __init__(self, code='initiating-request', message=''):
|
||||||
self.code = code
|
self.code = code
|
||||||
self.message = message
|
self.message = message
|
||||||
@ -2075,7 +2052,6 @@ class VPCPeeringConnectionStatus(object):
|
|||||||
|
|
||||||
|
|
||||||
class VPCPeeringConnection(TaggedEC2Resource):
|
class VPCPeeringConnection(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, vpc_pcx_id, vpc, peer_vpc):
|
def __init__(self, vpc_pcx_id, vpc, peer_vpc):
|
||||||
self.id = vpc_pcx_id
|
self.id = vpc_pcx_id
|
||||||
self.vpc = vpc
|
self.vpc = vpc
|
||||||
@ -2100,7 +2076,6 @@ class VPCPeeringConnection(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class VPCPeeringConnectionBackend(object):
|
class VPCPeeringConnectionBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.vpc_pcxs = {}
|
self.vpc_pcxs = {}
|
||||||
super(VPCPeeringConnectionBackend, self).__init__()
|
super(VPCPeeringConnectionBackend, self).__init__()
|
||||||
@ -2142,7 +2117,6 @@ class VPCPeeringConnectionBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class Subnet(TaggedEC2Resource):
|
class Subnet(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, subnet_id, vpc_id, cidr_block, availability_zone, default_for_az,
|
def __init__(self, ec2_backend, subnet_id, vpc_id, cidr_block, availability_zone, default_for_az,
|
||||||
map_public_ip_on_launch):
|
map_public_ip_on_launch):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
@ -2226,7 +2200,6 @@ class Subnet(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class SubnetBackend(object):
|
class SubnetBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# maps availability zone to dict of (subnet_id, subnet)
|
# maps availability zone to dict of (subnet_id, subnet)
|
||||||
self.subnets = defaultdict(dict)
|
self.subnets = defaultdict(dict)
|
||||||
@ -2280,7 +2253,6 @@ class SubnetBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class SubnetRouteTableAssociation(object):
|
class SubnetRouteTableAssociation(object):
|
||||||
|
|
||||||
def __init__(self, route_table_id, subnet_id):
|
def __init__(self, route_table_id, subnet_id):
|
||||||
self.route_table_id = route_table_id
|
self.route_table_id = route_table_id
|
||||||
self.subnet_id = subnet_id
|
self.subnet_id = subnet_id
|
||||||
@ -2301,7 +2273,6 @@ class SubnetRouteTableAssociation(object):
|
|||||||
|
|
||||||
|
|
||||||
class SubnetRouteTableAssociationBackend(object):
|
class SubnetRouteTableAssociationBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.subnet_associations = {}
|
self.subnet_associations = {}
|
||||||
super(SubnetRouteTableAssociationBackend, self).__init__()
|
super(SubnetRouteTableAssociationBackend, self).__init__()
|
||||||
@ -2315,7 +2286,6 @@ class SubnetRouteTableAssociationBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class RouteTable(TaggedEC2Resource):
|
class RouteTable(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, route_table_id, vpc_id, main=False):
|
def __init__(self, ec2_backend, route_table_id, vpc_id, main=False):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = route_table_id
|
self.id = route_table_id
|
||||||
@ -2368,7 +2338,6 @@ class RouteTable(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class RouteTableBackend(object):
|
class RouteTableBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.route_tables = {}
|
self.route_tables = {}
|
||||||
super(RouteTableBackend, self).__init__()
|
super(RouteTableBackend, self).__init__()
|
||||||
@ -2408,7 +2377,7 @@ class RouteTableBackend(object):
|
|||||||
if route_table.associations:
|
if route_table.associations:
|
||||||
raise DependencyViolationError(
|
raise DependencyViolationError(
|
||||||
"The routeTable '{0}' has dependencies and cannot be deleted."
|
"The routeTable '{0}' has dependencies and cannot be deleted."
|
||||||
.format(route_table_id)
|
.format(route_table_id)
|
||||||
)
|
)
|
||||||
self.route_tables.pop(route_table_id)
|
self.route_tables.pop(route_table_id)
|
||||||
return True
|
return True
|
||||||
@ -2454,7 +2423,6 @@ class RouteTableBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class Route(object):
|
class Route(object):
|
||||||
|
|
||||||
def __init__(self, route_table, destination_cidr_block, local=False,
|
def __init__(self, route_table, destination_cidr_block, local=False,
|
||||||
gateway=None, instance=None, interface=None, vpc_pcx=None):
|
gateway=None, instance=None, interface=None, vpc_pcx=None):
|
||||||
self.id = generate_route_id(route_table.id, destination_cidr_block)
|
self.id = generate_route_id(route_table.id, destination_cidr_block)
|
||||||
@ -2489,7 +2457,6 @@ class Route(object):
|
|||||||
|
|
||||||
|
|
||||||
class RouteBackend(object):
|
class RouteBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(RouteBackend, self).__init__()
|
super(RouteBackend, self).__init__()
|
||||||
|
|
||||||
@ -2514,7 +2481,8 @@ class RouteBackend(object):
|
|||||||
instance=self.get_instance(
|
instance=self.get_instance(
|
||||||
instance_id) if instance_id else None,
|
instance_id) if instance_id else None,
|
||||||
interface=None,
|
interface=None,
|
||||||
vpc_pcx=self.get_vpc_peering_connection(vpc_peering_connection_id) if vpc_peering_connection_id else None)
|
vpc_pcx=self.get_vpc_peering_connection(
|
||||||
|
vpc_peering_connection_id) if vpc_peering_connection_id else None)
|
||||||
route_table.routes[route.id] = route
|
route_table.routes[route.id] = route
|
||||||
return route
|
return route
|
||||||
|
|
||||||
@ -2560,7 +2528,6 @@ class RouteBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class InternetGateway(TaggedEC2Resource):
|
class InternetGateway(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend):
|
def __init__(self, ec2_backend):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = random_internet_gateway_id()
|
self.id = random_internet_gateway_id()
|
||||||
@ -2584,7 +2551,6 @@ class InternetGateway(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class InternetGatewayBackend(object):
|
class InternetGatewayBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.internet_gateways = {}
|
self.internet_gateways = {}
|
||||||
super(InternetGatewayBackend, self).__init__()
|
super(InternetGatewayBackend, self).__init__()
|
||||||
@ -2613,7 +2579,7 @@ class InternetGatewayBackend(object):
|
|||||||
if igw.vpc:
|
if igw.vpc:
|
||||||
raise DependencyViolationError(
|
raise DependencyViolationError(
|
||||||
"{0} is being utilized by {1}"
|
"{0} is being utilized by {1}"
|
||||||
.format(internet_gateway_id, igw.vpc.id)
|
.format(internet_gateway_id, igw.vpc.id)
|
||||||
)
|
)
|
||||||
self.internet_gateways.pop(internet_gateway_id)
|
self.internet_gateways.pop(internet_gateway_id)
|
||||||
return True
|
return True
|
||||||
@ -2639,7 +2605,6 @@ class InternetGatewayBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class VPCGatewayAttachment(BaseModel):
|
class VPCGatewayAttachment(BaseModel):
|
||||||
|
|
||||||
def __init__(self, gateway_id, vpc_id):
|
def __init__(self, gateway_id, vpc_id):
|
||||||
self.gateway_id = gateway_id
|
self.gateway_id = gateway_id
|
||||||
self.vpc_id = vpc_id
|
self.vpc_id = vpc_id
|
||||||
@ -2663,7 +2628,6 @@ class VPCGatewayAttachment(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class VPCGatewayAttachmentBackend(object):
|
class VPCGatewayAttachmentBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.gateway_attachments = {}
|
self.gateway_attachments = {}
|
||||||
super(VPCGatewayAttachmentBackend, self).__init__()
|
super(VPCGatewayAttachmentBackend, self).__init__()
|
||||||
@ -2675,7 +2639,6 @@ class VPCGatewayAttachmentBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
|
class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, spot_request_id, price, image_id, type,
|
def __init__(self, ec2_backend, spot_request_id, price, image_id, type,
|
||||||
valid_from, valid_until, launch_group, availability_zone_group,
|
valid_from, valid_until, launch_group, availability_zone_group,
|
||||||
key_name, security_groups, user_data, instance_type, placement,
|
key_name, security_groups, user_data, instance_type, placement,
|
||||||
@ -2746,7 +2709,6 @@ class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
|
|||||||
|
|
||||||
@six.add_metaclass(Model)
|
@six.add_metaclass(Model)
|
||||||
class SpotRequestBackend(object):
|
class SpotRequestBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.spot_instance_requests = {}
|
self.spot_instance_requests = {}
|
||||||
super(SpotRequestBackend, self).__init__()
|
super(SpotRequestBackend, self).__init__()
|
||||||
@ -2782,7 +2744,6 @@ class SpotRequestBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class SpotFleetLaunchSpec(object):
|
class SpotFleetLaunchSpec(object):
|
||||||
|
|
||||||
def __init__(self, ebs_optimized, group_set, iam_instance_profile, image_id,
|
def __init__(self, ebs_optimized, group_set, iam_instance_profile, image_id,
|
||||||
instance_type, key_name, monitoring, spot_price, subnet_id, user_data,
|
instance_type, key_name, monitoring, spot_price, subnet_id, user_data,
|
||||||
weighted_capacity):
|
weighted_capacity):
|
||||||
@ -2800,7 +2761,6 @@ class SpotFleetLaunchSpec(object):
|
|||||||
|
|
||||||
|
|
||||||
class SpotFleetRequest(TaggedEC2Resource):
|
class SpotFleetRequest(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, spot_fleet_request_id, spot_price,
|
def __init__(self, ec2_backend, spot_fleet_request_id, spot_price,
|
||||||
target_capacity, iam_fleet_role, allocation_strategy, launch_specs):
|
target_capacity, iam_fleet_role, allocation_strategy, launch_specs):
|
||||||
|
|
||||||
@ -2857,7 +2817,8 @@ class SpotFleetRequest(TaggedEC2Resource):
|
|||||||
]
|
]
|
||||||
|
|
||||||
spot_fleet_request = ec2_backend.request_spot_fleet(spot_price,
|
spot_fleet_request = ec2_backend.request_spot_fleet(spot_price,
|
||||||
target_capacity, iam_fleet_role, allocation_strategy, launch_specs)
|
target_capacity, iam_fleet_role, allocation_strategy,
|
||||||
|
launch_specs)
|
||||||
|
|
||||||
return spot_fleet_request
|
return spot_fleet_request
|
||||||
|
|
||||||
@ -2913,7 +2874,6 @@ class SpotFleetRequest(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class SpotFleetBackend(object):
|
class SpotFleetBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.spot_fleet_requests = {}
|
self.spot_fleet_requests = {}
|
||||||
super(SpotFleetBackend, self).__init__()
|
super(SpotFleetBackend, self).__init__()
|
||||||
@ -2954,7 +2914,6 @@ class SpotFleetBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class ElasticAddress(object):
|
class ElasticAddress(object):
|
||||||
|
|
||||||
def __init__(self, domain):
|
def __init__(self, domain):
|
||||||
self.public_ip = random_ip()
|
self.public_ip = random_ip()
|
||||||
self.allocation_id = random_eip_allocation_id() if domain == "vpc" else None
|
self.allocation_id = random_eip_allocation_id() if domain == "vpc" else None
|
||||||
@ -2995,7 +2954,6 @@ class ElasticAddress(object):
|
|||||||
|
|
||||||
|
|
||||||
class ElasticAddressBackend(object):
|
class ElasticAddressBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.addresses = []
|
self.addresses = []
|
||||||
super(ElasticAddressBackend, self).__init__()
|
super(ElasticAddressBackend, self).__init__()
|
||||||
@ -3102,7 +3060,6 @@ class ElasticAddressBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class DHCPOptionsSet(TaggedEC2Resource):
|
class DHCPOptionsSet(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, domain_name_servers=None, domain_name=None,
|
def __init__(self, ec2_backend, domain_name_servers=None, domain_name=None,
|
||||||
ntp_servers=None, netbios_name_servers=None,
|
ntp_servers=None, netbios_name_servers=None,
|
||||||
netbios_node_type=None):
|
netbios_node_type=None):
|
||||||
@ -3153,7 +3110,6 @@ class DHCPOptionsSet(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class DHCPOptionsSetBackend(object):
|
class DHCPOptionsSetBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.dhcp_options_sets = {}
|
self.dhcp_options_sets = {}
|
||||||
super(DHCPOptionsSetBackend, self).__init__()
|
super(DHCPOptionsSetBackend, self).__init__()
|
||||||
@ -3220,7 +3176,6 @@ class DHCPOptionsSetBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class VPNConnection(TaggedEC2Resource):
|
class VPNConnection(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, id, type,
|
def __init__(self, ec2_backend, id, type,
|
||||||
customer_gateway_id, vpn_gateway_id):
|
customer_gateway_id, vpn_gateway_id):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
@ -3236,7 +3191,6 @@ class VPNConnection(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class VPNConnectionBackend(object):
|
class VPNConnectionBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.vpn_connections = {}
|
self.vpn_connections = {}
|
||||||
super(VPNConnectionBackend, self).__init__()
|
super(VPNConnectionBackend, self).__init__()
|
||||||
@ -3287,7 +3241,6 @@ class VPNConnectionBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkAclBackend(object):
|
class NetworkAclBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.network_acls = {}
|
self.network_acls = {}
|
||||||
super(NetworkAclBackend, self).__init__()
|
super(NetworkAclBackend, self).__init__()
|
||||||
@ -3338,6 +3291,24 @@ class NetworkAclBackend(object):
|
|||||||
network_acl.network_acl_entries.append(network_acl_entry)
|
network_acl.network_acl_entries.append(network_acl_entry)
|
||||||
return network_acl_entry
|
return network_acl_entry
|
||||||
|
|
||||||
|
def delete_network_acl_entry(self, network_acl_id, rule_number, egress):
|
||||||
|
network_acl = self.get_network_acl(network_acl_id)
|
||||||
|
entry = next(entry for entry in network_acl.netword_acl_entries
|
||||||
|
if entry.egress == egress and entry.rule_number == rule_number)
|
||||||
|
if entry is not None:
|
||||||
|
network_acl.netword_acl_entries.remove(entry)
|
||||||
|
return entry
|
||||||
|
|
||||||
|
def replace_network_acl_entry(self, network_acl_id, rule_number, protocol, rule_action, egress,
|
||||||
|
cidr_block, icmp_code, icmp_type, port_range_from, port_range_to):
|
||||||
|
|
||||||
|
self.delete_network_acl_entry(network_acl_id, rule_number, egress)
|
||||||
|
network_acl_entry = self.create_network_acl_entry(network_acl_id, rule_number,
|
||||||
|
protocol, rule_action, egress,
|
||||||
|
cidr_block, icmp_code, icmp_type,
|
||||||
|
port_range_from, port_range_to)
|
||||||
|
return network_acl_entry
|
||||||
|
|
||||||
def replace_network_acl_association(self, association_id,
|
def replace_network_acl_association(self, association_id,
|
||||||
network_acl_id):
|
network_acl_id):
|
||||||
|
|
||||||
@ -3369,7 +3340,6 @@ class NetworkAclBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkAclAssociation(object):
|
class NetworkAclAssociation(object):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, new_association_id,
|
def __init__(self, ec2_backend, new_association_id,
|
||||||
subnet_id, network_acl_id):
|
subnet_id, network_acl_id):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
@ -3381,7 +3351,6 @@ class NetworkAclAssociation(object):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkAcl(TaggedEC2Resource):
|
class NetworkAcl(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, network_acl_id, vpc_id, default=False):
|
def __init__(self, ec2_backend, network_acl_id, vpc_id, default=False):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = network_acl_id
|
self.id = network_acl_id
|
||||||
@ -3410,7 +3379,6 @@ class NetworkAcl(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class NetworkAclEntry(TaggedEC2Resource):
|
class NetworkAclEntry(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, network_acl_id, rule_number,
|
def __init__(self, ec2_backend, network_acl_id, rule_number,
|
||||||
protocol, rule_action, egress, cidr_block,
|
protocol, rule_action, egress, cidr_block,
|
||||||
icmp_code, icmp_type, port_range_from,
|
icmp_code, icmp_type, port_range_from,
|
||||||
@ -3429,7 +3397,6 @@ class NetworkAclEntry(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class VpnGateway(TaggedEC2Resource):
|
class VpnGateway(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, id, type):
|
def __init__(self, ec2_backend, id, type):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = id
|
self.id = id
|
||||||
@ -3439,7 +3406,6 @@ class VpnGateway(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class VpnGatewayAttachment(object):
|
class VpnGatewayAttachment(object):
|
||||||
|
|
||||||
def __init__(self, vpc_id, state):
|
def __init__(self, vpc_id, state):
|
||||||
self.vpc_id = vpc_id
|
self.vpc_id = vpc_id
|
||||||
self.state = state
|
self.state = state
|
||||||
@ -3447,7 +3413,6 @@ class VpnGatewayAttachment(object):
|
|||||||
|
|
||||||
|
|
||||||
class VpnGatewayBackend(object):
|
class VpnGatewayBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.vpn_gateways = {}
|
self.vpn_gateways = {}
|
||||||
super(VpnGatewayBackend, self).__init__()
|
super(VpnGatewayBackend, self).__init__()
|
||||||
@ -3491,7 +3456,6 @@ class VpnGatewayBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class CustomerGateway(TaggedEC2Resource):
|
class CustomerGateway(TaggedEC2Resource):
|
||||||
|
|
||||||
def __init__(self, ec2_backend, id, type, ip_address, bgp_asn):
|
def __init__(self, ec2_backend, id, type, ip_address, bgp_asn):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = id
|
self.id = id
|
||||||
@ -3503,7 +3467,6 @@ class CustomerGateway(TaggedEC2Resource):
|
|||||||
|
|
||||||
|
|
||||||
class CustomerGatewayBackend(object):
|
class CustomerGatewayBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.customer_gateways = {}
|
self.customer_gateways = {}
|
||||||
super(CustomerGatewayBackend, self).__init__()
|
super(CustomerGatewayBackend, self).__init__()
|
||||||
@ -3534,7 +3497,6 @@ class CustomerGatewayBackend(object):
|
|||||||
|
|
||||||
|
|
||||||
class NatGateway(object):
|
class NatGateway(object):
|
||||||
|
|
||||||
def __init__(self, backend, subnet_id, allocation_id):
|
def __init__(self, backend, subnet_id, allocation_id):
|
||||||
# public properties
|
# public properties
|
||||||
self.id = random_nat_gateway_id()
|
self.id = random_nat_gateway_id()
|
||||||
@ -3583,7 +3545,6 @@ class NatGateway(object):
|
|||||||
|
|
||||||
|
|
||||||
class NatGatewayBackend(object):
|
class NatGatewayBackend(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.nat_gateways = {}
|
self.nat_gateways = {}
|
||||||
|
|
||||||
@ -3609,7 +3570,6 @@ class EC2Backend(BaseBackend, InstanceBackend, TagBackend, AmiBackend,
|
|||||||
SpotRequestBackend, ElasticAddressBackend, KeyPairBackend,
|
SpotRequestBackend, ElasticAddressBackend, KeyPairBackend,
|
||||||
DHCPOptionsSetBackend, NetworkAclBackend, VpnGatewayBackend,
|
DHCPOptionsSetBackend, NetworkAclBackend, VpnGatewayBackend,
|
||||||
CustomerGatewayBackend, NatGatewayBackend):
|
CustomerGatewayBackend, NatGatewayBackend):
|
||||||
|
|
||||||
def __init__(self, region_name):
|
def __init__(self, region_name):
|
||||||
super(EC2Backend, self).__init__()
|
super(EC2Backend, self).__init__()
|
||||||
self.region_name = region_name
|
self.region_name = region_name
|
||||||
|
@ -39,8 +39,32 @@ class NetworkACLs(BaseResponse):
|
|||||||
return template.render()
|
return template.render()
|
||||||
|
|
||||||
def delete_network_acl_entry(self):
|
def delete_network_acl_entry(self):
|
||||||
raise NotImplementedError(
|
network_acl_id = self.querystring.get('NetworkAclId')[0]
|
||||||
'NetworkACLs(AmazonVPC).delete_network_acl_entry is not yet implemented')
|
rule_number = self.querystring.get('RuleNumber')[0]
|
||||||
|
egress = self.querystring.get('Egress')[0]
|
||||||
|
self.ec2_backend.delete_network_acl(network_acl_id, rule_number, egress)
|
||||||
|
template = self.response_template(DELETE_NETWORK_ACL_ENTRY_RESPONSE)
|
||||||
|
return template.render()
|
||||||
|
|
||||||
|
def replace_network_acl_entry(self):
|
||||||
|
network_acl_id = self.querystring.get('NetworkAclId')[0]
|
||||||
|
rule_number = self.querystring.get('RuleNumber')[0]
|
||||||
|
protocol = self.querystring.get('Protocol')[0]
|
||||||
|
rule_action = self.querystring.get('RuleAction')[0]
|
||||||
|
egress = self.querystring.get('Egress')[0]
|
||||||
|
cidr_block = self.querystring.get('CidrBlock')[0]
|
||||||
|
icmp_code = self.querystring.get('Icmp.Code', [None])[0]
|
||||||
|
icmp_type = self.querystring.get('Icmp.Type', [None])[0]
|
||||||
|
port_range_from = self.querystring.get('PortRange.From')[0]
|
||||||
|
port_range_to = self.querystring.get('PortRange.To')[0]
|
||||||
|
|
||||||
|
self.ec2_backend.replace_network_acl_entry(
|
||||||
|
network_acl_id, rule_number, protocol, rule_action,
|
||||||
|
egress, cidr_block, icmp_code, icmp_type,
|
||||||
|
port_range_from, port_range_to)
|
||||||
|
|
||||||
|
template = self.response_template(REPLACE_NETWORK_ACL_ENTRY_RESPONSE)
|
||||||
|
return template.render()
|
||||||
|
|
||||||
def describe_network_acls(self):
|
def describe_network_acls(self):
|
||||||
network_acl_ids = network_acl_ids_from_querystring(self.querystring)
|
network_acl_ids = network_acl_ids_from_querystring(self.querystring)
|
||||||
@ -61,9 +85,7 @@ class NetworkACLs(BaseResponse):
|
|||||||
template = self.response_template(REPLACE_NETWORK_ACL_ASSOCIATION)
|
template = self.response_template(REPLACE_NETWORK_ACL_ASSOCIATION)
|
||||||
return template.render(association=association)
|
return template.render(association=association)
|
||||||
|
|
||||||
def replace_network_acl_entry(self):
|
|
||||||
raise NotImplementedError(
|
|
||||||
'NetworkACLs(AmazonVPC).replace_network_acl_entry is not yet implemented')
|
|
||||||
|
|
||||||
|
|
||||||
CREATE_NETWORK_ACL_RESPONSE = """
|
CREATE_NETWORK_ACL_RESPONSE = """
|
||||||
@ -147,6 +169,13 @@ CREATE_NETWORK_ACL_ENTRY_RESPONSE = """
|
|||||||
</CreateNetworkAclEntryResponse>
|
</CreateNetworkAclEntryResponse>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
REPLACE_NETWORK_ACL_ENTRY_RESPONSE = """
|
||||||
|
<ReplaceNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</ReplaceNetworkAclEntryResponse>
|
||||||
|
"""
|
||||||
|
|
||||||
REPLACE_NETWORK_ACL_ASSOCIATION = """
|
REPLACE_NETWORK_ACL_ASSOCIATION = """
|
||||||
<ReplaceNetworkAclAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
<ReplaceNetworkAclAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
@ -160,3 +189,10 @@ DELETE_NETWORK_ACL_ASSOCIATION = """
|
|||||||
<return>true</return>
|
<return>true</return>
|
||||||
</DeleteNetworkAclResponse>
|
</DeleteNetworkAclResponse>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
DELETE_NETWORK_ACL_ENTRY_RESPONSE = """
|
||||||
|
<DeleteNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</DeleteNetworkAclEntryResponse>
|
||||||
|
"""
|
@ -62,6 +62,61 @@ def test_network_acl_entries():
|
|||||||
entries[0].rule_action.should.equal('ALLOW')
|
entries[0].rule_action.should.equal('ALLOW')
|
||||||
|
|
||||||
|
|
||||||
|
@mock_ec2_deprecated
|
||||||
|
def test_delete_network_acl_entry():
|
||||||
|
conn = boto.connect_vpc('the_key', 'the secret')
|
||||||
|
vpc = conn.create_vpc("10.0.0.0/16")
|
||||||
|
|
||||||
|
network_acl = conn.create_network_acl(vpc.id)
|
||||||
|
|
||||||
|
conn.create_network_acl_entry(
|
||||||
|
network_acl.id, 110, 6,
|
||||||
|
'ALLOW', '0.0.0.0/0', False,
|
||||||
|
port_range_from='443',
|
||||||
|
port_range_to='443'
|
||||||
|
)
|
||||||
|
conn.delete_network_acl_entry(
|
||||||
|
network_acl.id, 110, False
|
||||||
|
)
|
||||||
|
|
||||||
|
all_network_acls = conn.get_all_network_acls()
|
||||||
|
|
||||||
|
test_network_acl = next(na for na in all_network_acls
|
||||||
|
if na.id == network_acl.id)
|
||||||
|
entries = test_network_acl.network_acl_entries
|
||||||
|
entries.should.have.length_of(0)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_ec2_deprecated
|
||||||
|
def test_replace_network_acl_entry():
|
||||||
|
conn = boto.connect_vpc('the_key', 'the secret')
|
||||||
|
vpc = conn.create_vpc("10.0.0.0/16")
|
||||||
|
|
||||||
|
network_acl = conn.create_network_acl(vpc.id)
|
||||||
|
|
||||||
|
conn.create_network_acl_entry(
|
||||||
|
network_acl.id, 110, 6,
|
||||||
|
'ALLOW', '0.0.0.0/0', False,
|
||||||
|
port_range_from='443',
|
||||||
|
port_range_to='443'
|
||||||
|
)
|
||||||
|
conn.replace_network_acl_entry(
|
||||||
|
network_acl.id, 110, -1,
|
||||||
|
'DENY', '0.0.0.0/0', False,
|
||||||
|
port_range_from='22',
|
||||||
|
port_range_to='22'
|
||||||
|
)
|
||||||
|
|
||||||
|
all_network_acls = conn.get_all_network_acls()
|
||||||
|
|
||||||
|
test_network_acl = next(na for na in all_network_acls
|
||||||
|
if na.id == network_acl.id)
|
||||||
|
entries = test_network_acl.network_acl_entries
|
||||||
|
entries.should.have.length_of(1)
|
||||||
|
entries[0].rule_number.should.equal('110')
|
||||||
|
entries[0].protocol.should.equal('-1')
|
||||||
|
entries[0].rule_action.should.equal('DENY')
|
||||||
|
|
||||||
@mock_ec2_deprecated
|
@mock_ec2_deprecated
|
||||||
def test_associate_new_network_acl_with_subnet():
|
def test_associate_new_network_acl_with_subnet():
|
||||||
conn = boto.connect_vpc('the_key', 'the secret')
|
conn = boto.connect_vpc('the_key', 'the secret')
|
||||||
|
Loading…
Reference in New Issue
Block a user