Fix SecuirtyGroupRules and added default Ec2-VPC support for SG. (#4267)
This commit is contained in:
parent
b3b326f578
commit
eef21767f8
@ -963,7 +963,7 @@ class InstanceBackend(object):
|
|||||||
new_reservation.id = random_reservation_id()
|
new_reservation.id = random_reservation_id()
|
||||||
|
|
||||||
security_groups = [
|
security_groups = [
|
||||||
self.get_security_group_from_name(name) for name in security_group_names
|
self.get_security_group_by_name_or_id(name) for name in security_group_names
|
||||||
]
|
]
|
||||||
security_groups.extend(
|
security_groups.extend(
|
||||||
self.get_security_group_from_id(sg_id)
|
self.get_security_group_from_id(sg_id)
|
||||||
@ -2102,7 +2102,14 @@ class SecurityRule(object):
|
|||||||
|
|
||||||
class SecurityGroup(TaggedEC2Resource, CloudFormationModel):
|
class SecurityGroup(TaggedEC2Resource, CloudFormationModel):
|
||||||
def __init__(
|
def __init__(
|
||||||
self, ec2_backend, group_id, name, description, vpc_id=None, tags=None
|
self,
|
||||||
|
ec2_backend,
|
||||||
|
group_id,
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
vpc_id=None,
|
||||||
|
tags=None,
|
||||||
|
is_default=None,
|
||||||
):
|
):
|
||||||
self.ec2_backend = ec2_backend
|
self.ec2_backend = ec2_backend
|
||||||
self.id = group_id
|
self.id = group_id
|
||||||
@ -2114,6 +2121,7 @@ class SecurityGroup(TaggedEC2Resource, CloudFormationModel):
|
|||||||
self.vpc_id = vpc_id
|
self.vpc_id = vpc_id
|
||||||
self.owner_id = ACCOUNT_ID
|
self.owner_id = ACCOUNT_ID
|
||||||
self.add_tags(tags or {})
|
self.add_tags(tags or {})
|
||||||
|
self.is_default = is_default or False
|
||||||
|
|
||||||
# Append default IPv6 egress rule for VPCs with IPv6 support
|
# Append default IPv6 egress rule for VPCs with IPv6 support
|
||||||
if vpc_id:
|
if vpc_id:
|
||||||
@ -2198,7 +2206,9 @@ class SecurityGroup(TaggedEC2Resource, CloudFormationModel):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def _delete_security_group_given_vpc_id(cls, resource_name, vpc_id, region_name):
|
def _delete_security_group_given_vpc_id(cls, resource_name, vpc_id, region_name):
|
||||||
ec2_backend = ec2_backends[region_name]
|
ec2_backend = ec2_backends[region_name]
|
||||||
security_group = ec2_backend.get_security_group_from_name(resource_name, vpc_id)
|
security_group = ec2_backend.get_security_group_by_name_or_id(
|
||||||
|
resource_name, vpc_id
|
||||||
|
)
|
||||||
if security_group:
|
if security_group:
|
||||||
security_group.delete(region_name)
|
security_group.delete(region_name)
|
||||||
|
|
||||||
@ -2285,24 +2295,28 @@ class SecurityGroupBackend(object):
|
|||||||
self.sg_old_ingress_ruls = {}
|
self.sg_old_ingress_ruls = {}
|
||||||
self.sg_old_egress_ruls = {}
|
self.sg_old_egress_ruls = {}
|
||||||
|
|
||||||
# Create the default security group
|
|
||||||
self.create_security_group("default", "default group")
|
|
||||||
|
|
||||||
super(SecurityGroupBackend, self).__init__()
|
super(SecurityGroupBackend, self).__init__()
|
||||||
|
|
||||||
def create_security_group(
|
def create_security_group(
|
||||||
self, name, description, vpc_id=None, tags=None, force=False
|
self, name, description, vpc_id=None, tags=None, force=False, is_default=None
|
||||||
):
|
):
|
||||||
|
vpc_id = vpc_id or self.default_vpc.id
|
||||||
if not description:
|
if not description:
|
||||||
raise MissingParameterError("GroupDescription")
|
raise MissingParameterError("GroupDescription")
|
||||||
|
|
||||||
group_id = random_security_group_id()
|
group_id = random_security_group_id()
|
||||||
if not force:
|
if not force:
|
||||||
existing_group = self.get_security_group_from_name(name, vpc_id)
|
existing_group = self.get_security_group_by_name_or_id(name, vpc_id)
|
||||||
if existing_group:
|
if existing_group:
|
||||||
raise InvalidSecurityGroupDuplicateError(name)
|
raise InvalidSecurityGroupDuplicateError(name)
|
||||||
group = SecurityGroup(
|
group = SecurityGroup(
|
||||||
self, group_id, name, description, vpc_id=vpc_id, tags=tags
|
self,
|
||||||
|
group_id,
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
vpc_id=vpc_id,
|
||||||
|
tags=tags,
|
||||||
|
is_default=is_default,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.groups[vpc_id][group_id] = group
|
self.groups[vpc_id][group_id] = group
|
||||||
@ -2326,6 +2340,7 @@ class SecurityGroupBackend(object):
|
|||||||
return matches
|
return matches
|
||||||
|
|
||||||
def _delete_security_group(self, vpc_id, group_id):
|
def _delete_security_group(self, vpc_id, group_id):
|
||||||
|
vpc_id = vpc_id or self.default_vpc.id
|
||||||
if self.groups[vpc_id][group_id].enis:
|
if self.groups[vpc_id][group_id].enis:
|
||||||
raise DependencyViolationError(
|
raise DependencyViolationError(
|
||||||
"{0} is being utilized by {1}".format(group_id, "ENIs")
|
"{0} is being utilized by {1}".format(group_id, "ENIs")
|
||||||
@ -2342,7 +2357,7 @@ class SecurityGroupBackend(object):
|
|||||||
elif name:
|
elif name:
|
||||||
# Group Name. Has to be in standard EC2, VPC needs to be
|
# Group Name. Has to be in standard EC2, VPC needs to be
|
||||||
# identified by group_id
|
# identified by group_id
|
||||||
group = self.get_security_group_from_name(name)
|
group = self.get_security_group_by_name_or_id(name)
|
||||||
if group:
|
if group:
|
||||||
return self._delete_security_group(None, group.id)
|
return self._delete_security_group(None, group.id)
|
||||||
raise InvalidSecurityGroupNotFoundError(name)
|
raise InvalidSecurityGroupNotFoundError(name)
|
||||||
@ -2367,7 +2382,8 @@ class SecurityGroupBackend(object):
|
|||||||
if group.name == name:
|
if group.name == name:
|
||||||
return group
|
return group
|
||||||
|
|
||||||
def get_security_group_by_name_or_id(self, group_name_or_id, vpc_id):
|
def get_security_group_by_name_or_id(self, group_name_or_id, vpc_id=None):
|
||||||
|
|
||||||
# try searching by id, fallbacks to name search
|
# try searching by id, fallbacks to name search
|
||||||
group = self.get_security_group_from_id(group_name_or_id)
|
group = self.get_security_group_from_id(group_name_or_id)
|
||||||
if group is None:
|
if group is None:
|
||||||
@ -2675,6 +2691,128 @@ class SecurityGroupBackend(object):
|
|||||||
return security_rule
|
return security_rule
|
||||||
raise InvalidPermissionNotFoundError()
|
raise InvalidPermissionNotFoundError()
|
||||||
|
|
||||||
|
def update_security_group_rule_descriptions_ingress(
|
||||||
|
self,
|
||||||
|
group_name_or_id,
|
||||||
|
ip_protocol,
|
||||||
|
from_port,
|
||||||
|
to_port,
|
||||||
|
ip_ranges,
|
||||||
|
source_groups=[],
|
||||||
|
prefix_list_ids=[],
|
||||||
|
vpc_id=None,
|
||||||
|
):
|
||||||
|
|
||||||
|
group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
|
||||||
|
if group is None:
|
||||||
|
raise InvalidSecurityGroupNotFoundError(group_name_or_id)
|
||||||
|
if ip_ranges and not isinstance(ip_ranges, list):
|
||||||
|
|
||||||
|
if isinstance(ip_ranges, str) and "CidrIp" not in ip_ranges:
|
||||||
|
ip_ranges = [{"CidrIp": ip_ranges}]
|
||||||
|
else:
|
||||||
|
ip_ranges = [json.loads(ip_ranges)]
|
||||||
|
if ip_ranges:
|
||||||
|
for cidr in ip_ranges:
|
||||||
|
if (
|
||||||
|
type(cidr) is dict
|
||||||
|
and not any(
|
||||||
|
[
|
||||||
|
is_valid_cidr(cidr.get("CidrIp", "")),
|
||||||
|
is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
) or (
|
||||||
|
type(cidr) is str
|
||||||
|
and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
|
||||||
|
):
|
||||||
|
raise InvalidCIDRSubnetError(cidr=cidr)
|
||||||
|
_source_groups = self._add_source_group(source_groups, vpc_id)
|
||||||
|
|
||||||
|
security_rule = SecurityRule(
|
||||||
|
ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
|
||||||
|
)
|
||||||
|
for rule in group.ingress_rules:
|
||||||
|
if (
|
||||||
|
security_rule.from_port == rule.from_port
|
||||||
|
and security_rule.to_port == rule.to_port
|
||||||
|
and security_rule.ip_protocol == rule.ip_protocol
|
||||||
|
):
|
||||||
|
self._sg_update_description(security_rule, rule)
|
||||||
|
return group
|
||||||
|
|
||||||
|
def update_security_group_rule_descriptions_egress(
|
||||||
|
self,
|
||||||
|
group_name_or_id,
|
||||||
|
ip_protocol,
|
||||||
|
from_port,
|
||||||
|
to_port,
|
||||||
|
ip_ranges,
|
||||||
|
source_groups=[],
|
||||||
|
prefix_list_ids=[],
|
||||||
|
vpc_id=None,
|
||||||
|
):
|
||||||
|
|
||||||
|
group = self.get_security_group_by_name_or_id(group_name_or_id, vpc_id)
|
||||||
|
if group is None:
|
||||||
|
raise InvalidSecurityGroupNotFoundError(group_name_or_id)
|
||||||
|
if ip_ranges and not isinstance(ip_ranges, list):
|
||||||
|
|
||||||
|
if isinstance(ip_ranges, str) and "CidrIp" not in ip_ranges:
|
||||||
|
ip_ranges = [{"CidrIp": ip_ranges}]
|
||||||
|
else:
|
||||||
|
ip_ranges = [json.loads(ip_ranges)]
|
||||||
|
if ip_ranges:
|
||||||
|
for cidr in ip_ranges:
|
||||||
|
if (
|
||||||
|
type(cidr) is dict
|
||||||
|
and not any(
|
||||||
|
[
|
||||||
|
is_valid_cidr(cidr.get("CidrIp", "")),
|
||||||
|
is_valid_ipv6_cidr(cidr.get("CidrIpv6", "")),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
) or (
|
||||||
|
type(cidr) is str
|
||||||
|
and not any([is_valid_cidr(cidr), is_valid_ipv6_cidr(cidr)])
|
||||||
|
):
|
||||||
|
raise InvalidCIDRSubnetError(cidr=cidr)
|
||||||
|
_source_groups = self._add_source_group(source_groups, vpc_id)
|
||||||
|
|
||||||
|
security_rule = SecurityRule(
|
||||||
|
ip_protocol, from_port, to_port, ip_ranges, _source_groups, prefix_list_ids
|
||||||
|
)
|
||||||
|
for rule in group.egress_rules:
|
||||||
|
if (
|
||||||
|
security_rule.from_port == rule.from_port
|
||||||
|
and security_rule.to_port == rule.to_port
|
||||||
|
and security_rule.ip_protocol == rule.ip_protocol
|
||||||
|
):
|
||||||
|
self._sg_update_description(security_rule, rule)
|
||||||
|
return group
|
||||||
|
|
||||||
|
def _sg_update_description(self, security_rule, rule):
|
||||||
|
for item in security_rule.ip_ranges:
|
||||||
|
for cidr_item in rule.ip_ranges:
|
||||||
|
if cidr_item.get("CidrIp") == item.get("CidrIp"):
|
||||||
|
cidr_item["Description"] = item.get("Description")
|
||||||
|
if cidr_item.get("CidrIp6") == item.get("CidrIp6"):
|
||||||
|
cidr_item["Description"] = item.get("Description")
|
||||||
|
|
||||||
|
for item in security_rule.source_groups:
|
||||||
|
for source_group in rule.source_groups:
|
||||||
|
if source_group.get("GroupId") == item.get(
|
||||||
|
"GroupId"
|
||||||
|
) or source_group.get("GroupName") == item.get("GroupName"):
|
||||||
|
source_group["Description"] = item.get("Description")
|
||||||
|
|
||||||
|
for item in security_rule.source_groups:
|
||||||
|
for source_group in rule.source_groups:
|
||||||
|
if source_group.get("GroupId") == item.get(
|
||||||
|
"GroupId"
|
||||||
|
) or source_group.get("GroupName") == item.get("GroupName"):
|
||||||
|
source_group["Description"] = item.get("Description")
|
||||||
|
|
||||||
def _remove_items_from_rule(self, ip_ranges, _source_groups, prefix_list_ids, rule):
|
def _remove_items_from_rule(self, ip_ranges, _source_groups, prefix_list_ids, rule):
|
||||||
for item in ip_ranges:
|
for item in ip_ranges:
|
||||||
if item not in rule.ip_ranges:
|
if item not in rule.ip_ranges:
|
||||||
@ -2702,26 +2840,27 @@ class SecurityGroupBackend(object):
|
|||||||
item["OwnerId"] = ACCOUNT_ID
|
item["OwnerId"] = ACCOUNT_ID
|
||||||
# for VPCs
|
# for VPCs
|
||||||
if "GroupId" in item:
|
if "GroupId" in item:
|
||||||
if not self.get_security_group_from_id(item.get("GroupId")):
|
if not self.get_security_group_by_name_or_id(
|
||||||
|
item.get("GroupId"), vpc_id
|
||||||
|
):
|
||||||
raise InvalidSecurityGroupNotFoundError(item.get("GroupId"))
|
raise InvalidSecurityGroupNotFoundError(item.get("GroupId"))
|
||||||
if "GroupName" in item:
|
if "GroupName" in item:
|
||||||
source_group = self.get_security_group_from_name(
|
source_group = self.get_security_group_by_name_or_id(
|
||||||
item.get("GroupName"), vpc_id
|
item.get("GroupName"), vpc_id
|
||||||
)
|
)
|
||||||
if not source_group:
|
if not source_group:
|
||||||
raise InvalidSecurityGroupNotFoundError(item.get("GroupName"))
|
raise InvalidSecurityGroupNotFoundError(item.get("GroupName"))
|
||||||
else:
|
else:
|
||||||
item["GroupId"] = source_group.id
|
item["GroupId"] = source_group.id
|
||||||
|
item.pop("GroupName")
|
||||||
|
|
||||||
if vpc_id:
|
|
||||||
item["VpcId"] = vpc_id
|
|
||||||
_source_groups.append(item)
|
_source_groups.append(item)
|
||||||
return _source_groups
|
return _source_groups
|
||||||
|
|
||||||
def _verify_group_will_respect_rule_count_limit(
|
def _verify_group_will_respect_rule_count_limit(
|
||||||
self, group, current_rule_nb, ip_ranges, source_groups=None, egress=False,
|
self, group, current_rule_nb, ip_ranges, source_groups=None, egress=False,
|
||||||
):
|
):
|
||||||
max_nb_rules = 50 if group.vpc_id else 100
|
max_nb_rules = 60 if group.vpc_id else 100
|
||||||
future_group_nb_rules = current_rule_nb
|
future_group_nb_rules = current_rule_nb
|
||||||
if ip_ranges:
|
if ip_ranges:
|
||||||
future_group_nb_rules += len(ip_ranges)
|
future_group_nb_rules += len(ip_ranges)
|
||||||
@ -3408,7 +3547,7 @@ class VPCBackend(object):
|
|||||||
default = self.get_security_group_from_name("default", vpc_id=vpc_id)
|
default = self.get_security_group_from_name("default", vpc_id=vpc_id)
|
||||||
if not default:
|
if not default:
|
||||||
self.create_security_group(
|
self.create_security_group(
|
||||||
"default", "default VPC security group", vpc_id=vpc_id
|
"default", "default VPC security group", vpc_id=vpc_id, is_default=True
|
||||||
)
|
)
|
||||||
|
|
||||||
return vpc
|
return vpc
|
||||||
@ -3447,7 +3586,7 @@ class VPCBackend(object):
|
|||||||
self.delete_route_table(route_table.id)
|
self.delete_route_table(route_table.id)
|
||||||
|
|
||||||
# Delete default security group if exists.
|
# Delete default security group if exists.
|
||||||
default = self.get_security_group_from_name("default", vpc_id=vpc_id)
|
default = self.get_security_group_by_name_or_id("default", vpc_id=vpc_id)
|
||||||
if default:
|
if default:
|
||||||
self.delete_security_group(group_id=default.id)
|
self.delete_security_group(group_id=default.id)
|
||||||
|
|
||||||
@ -5285,12 +5424,12 @@ class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Resource):
|
|||||||
|
|
||||||
if security_groups:
|
if security_groups:
|
||||||
for group_name in security_groups:
|
for group_name in security_groups:
|
||||||
group = self.ec2_backend.get_security_group_from_name(group_name)
|
group = self.ec2_backend.get_security_group_by_name_or_id(group_name)
|
||||||
if group:
|
if group:
|
||||||
ls.groups.append(group)
|
ls.groups.append(group)
|
||||||
else:
|
else:
|
||||||
# If not security groups, add the default
|
# If not security groups, add the default
|
||||||
default_group = self.ec2_backend.get_security_group_from_name("default")
|
default_group = self.ec2_backend.get_security_group_by_name_or_id("default")
|
||||||
ls.groups.append(default_group)
|
ls.groups.append(default_group)
|
||||||
|
|
||||||
self.instance = self.launch_instance()
|
self.instance = self.launch_instance()
|
||||||
@ -7717,8 +7856,8 @@ class EC2Backend(
|
|||||||
TagBackend,
|
TagBackend,
|
||||||
EBSBackend,
|
EBSBackend,
|
||||||
RegionsAndZonesBackend,
|
RegionsAndZonesBackend,
|
||||||
SecurityGroupBackend,
|
|
||||||
AmiBackend,
|
AmiBackend,
|
||||||
|
SecurityGroupBackend,
|
||||||
VPCBackend,
|
VPCBackend,
|
||||||
ManagedPrefixListBackend,
|
ManagedPrefixListBackend,
|
||||||
SubnetBackend,
|
SubnetBackend,
|
||||||
@ -7765,6 +7904,8 @@ class EC2Backend(
|
|||||||
# backward-compatibility issues
|
# backward-compatibility issues
|
||||||
vpc = self.vpcs.values()[0]
|
vpc = self.vpcs.values()[0]
|
||||||
|
|
||||||
|
self.default_vpc = vpc
|
||||||
|
|
||||||
# Create default subnet for each availability zone
|
# Create default subnet for each availability zone
|
||||||
ip, _ = vpc.cidr_block.split("/")
|
ip, _ = vpc.cidr_block.split("/")
|
||||||
ip = ip.split(".")
|
ip = ip.split(".")
|
||||||
|
@ -218,6 +218,22 @@ class SecurityGroups(BaseResponse):
|
|||||||
self.ec2_backend.revoke_security_group_ingress(*args)
|
self.ec2_backend.revoke_security_group_ingress(*args)
|
||||||
return REVOKE_SECURITY_GROUP_INGRESS_RESPONSE
|
return REVOKE_SECURITY_GROUP_INGRESS_RESPONSE
|
||||||
|
|
||||||
|
def update_security_group_rule_descriptions_ingress(self):
|
||||||
|
for args in self._process_rules_from_querystring():
|
||||||
|
group = self.ec2_backend.update_security_group_rule_descriptions_ingress(
|
||||||
|
*args
|
||||||
|
)
|
||||||
|
self.ec2_backend.sg_old_ingress_ruls[group.id] = group.ingress_rules.copy()
|
||||||
|
return UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_INGRESS
|
||||||
|
|
||||||
|
def update_security_group_rule_descriptions_egress(self):
|
||||||
|
for args in self._process_rules_from_querystring():
|
||||||
|
group = self.ec2_backend.update_security_group_rule_descriptions_egress(
|
||||||
|
*args
|
||||||
|
)
|
||||||
|
self.ec2_backend.sg_old_egress_ruls[group.id] = group.egress_rules.copy()
|
||||||
|
return UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_EGRESS
|
||||||
|
|
||||||
|
|
||||||
CREATE_SECURITY_GROUP_RESPONSE = """<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
CREATE_SECURITY_GROUP_RESPONSE = """<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
@ -552,3 +568,13 @@ REVOKE_SECURITY_GROUP_EGRESS_RESPONSE = """<RevokeSecurityGroupEgressResponse xm
|
|||||||
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
<return>true</return>
|
<return>true</return>
|
||||||
</RevokeSecurityGroupEgressResponse>"""
|
</RevokeSecurityGroupEgressResponse>"""
|
||||||
|
|
||||||
|
UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_INGRESS = """<UpdateSecurityGroupRuleDescriptionsIngressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</UpdateSecurityGroupRuleDescriptionsIngressResponse>"""
|
||||||
|
|
||||||
|
UPDATE_SECURITY_GROUP_RULE_DESCRIPTIONS_EGRESS = """<UpdateSecurityGroupRuleDescriptionsEgressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</UpdateSecurityGroupRuleDescriptionsEgressResponse>"""
|
||||||
|
@ -81,7 +81,7 @@ def random_reservation_id():
|
|||||||
|
|
||||||
|
|
||||||
def random_security_group_id():
|
def random_security_group_id():
|
||||||
return random_id(prefix=EC2_RESOURCE_TO_PREFIX["security-group"])
|
return random_id(prefix=EC2_RESOURCE_TO_PREFIX["security-group"], size=17)
|
||||||
|
|
||||||
|
|
||||||
def random_security_group_rule_id():
|
def random_security_group_rule_id():
|
||||||
|
@ -6,3 +6,4 @@ TestAccAWSFms
|
|||||||
TestAccAWSIAMRolePolicy
|
TestAccAWSIAMRolePolicy
|
||||||
TestAccAWSSecurityGroup_forceRevokeRules_
|
TestAccAWSSecurityGroup_forceRevokeRules_
|
||||||
TestAccAWSSSMDocument_package
|
TestAccAWSSSMDocument_package
|
||||||
|
TestAccAWSDefaultSecurityGroup_Classic_
|
||||||
|
@ -23,7 +23,7 @@ TestAccAWSDataSourceIAMPolicyDocument
|
|||||||
TestAccAWSDataSourceIAMRole
|
TestAccAWSDataSourceIAMRole
|
||||||
TestAccAWSDataSourceIAMSessionContext
|
TestAccAWSDataSourceIAMSessionContext
|
||||||
TestAccAWSDataSourceIAMUser
|
TestAccAWSDataSourceIAMUser
|
||||||
TestAccAWSDefaultSecurityGroup
|
TestAccAWSDefaultSecurityGroup_
|
||||||
TestAccAWSDefaultSubnet
|
TestAccAWSDefaultSubnet
|
||||||
TestAccAWSDefaultTagsDataSource
|
TestAccAWSDefaultTagsDataSource
|
||||||
TestAccAWSDynamoDbTableItem
|
TestAccAWSDynamoDbTableItem
|
||||||
@ -116,3 +116,4 @@ TestAccAwsEc2ManagedPrefixList
|
|||||||
TestAccAWSEgressOnlyInternetGateway
|
TestAccAWSEgressOnlyInternetGateway
|
||||||
TestAccAWSSecurityGroup_
|
TestAccAWSSecurityGroup_
|
||||||
TestAccAWSInternetGateway
|
TestAccAWSInternetGateway
|
||||||
|
TestAccAWSSecurityGroupRule_
|
||||||
|
@ -48,7 +48,7 @@ def test_create_and_describe_security_group():
|
|||||||
|
|
||||||
all_groups = conn.get_all_security_groups()
|
all_groups = conn.get_all_security_groups()
|
||||||
# The default group gets created automatically
|
# The default group gets created automatically
|
||||||
all_groups.should.have.length_of(3)
|
all_groups.should.have.length_of(2)
|
||||||
group_names = [group.name for group in all_groups]
|
group_names = [group.name for group in all_groups]
|
||||||
set(group_names).should.equal(set(["default", "test security group"]))
|
set(group_names).should.equal(set(["default", "test security group"]))
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ def test_create_security_group_without_description_raises_error():
|
|||||||
def test_default_security_group():
|
def test_default_security_group():
|
||||||
conn = boto.ec2.connect_to_region("us-east-1")
|
conn = boto.ec2.connect_to_region("us-east-1")
|
||||||
groups = conn.get_all_security_groups()
|
groups = conn.get_all_security_groups()
|
||||||
groups.should.have.length_of(2)
|
groups.should.have.length_of(1)
|
||||||
groups[0].name.should.equal("default")
|
groups[0].name.should.equal("default")
|
||||||
|
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ def test_create_two_security_groups_with_same_name_in_different_vpc():
|
|||||||
|
|
||||||
all_groups = conn.get_all_security_groups()
|
all_groups = conn.get_all_security_groups()
|
||||||
|
|
||||||
all_groups.should.have.length_of(4)
|
all_groups.should.have.length_of(3)
|
||||||
group_names = [group.name for group in all_groups]
|
group_names = [group.name for group in all_groups]
|
||||||
# The default group is created automatically
|
# The default group is created automatically
|
||||||
set(group_names).should.equal(set(["default", "test security group"]))
|
set(group_names).should.equal(set(["default", "test security group"]))
|
||||||
@ -143,7 +143,7 @@ def test_deleting_security_groups():
|
|||||||
security_group1 = conn.create_security_group("test1", "test1")
|
security_group1 = conn.create_security_group("test1", "test1")
|
||||||
conn.create_security_group("test2", "test2")
|
conn.create_security_group("test2", "test2")
|
||||||
|
|
||||||
conn.get_all_security_groups().should.have.length_of(4)
|
conn.get_all_security_groups().should.have.length_of(3)
|
||||||
|
|
||||||
# Deleting a group that doesn't exist should throw an error
|
# Deleting a group that doesn't exist should throw an error
|
||||||
with pytest.raises(EC2ResponseError) as cm:
|
with pytest.raises(EC2ResponseError) as cm:
|
||||||
@ -162,11 +162,11 @@ def test_deleting_security_groups():
|
|||||||
)
|
)
|
||||||
|
|
||||||
conn.delete_security_group("test2")
|
conn.delete_security_group("test2")
|
||||||
conn.get_all_security_groups().should.have.length_of(3)
|
conn.get_all_security_groups().should.have.length_of(2)
|
||||||
|
|
||||||
# Delete by group id
|
# Delete by group id
|
||||||
conn.delete_security_group(group_id=security_group1.id)
|
conn.delete_security_group(group_id=security_group1.id)
|
||||||
conn.get_all_security_groups().should.have.length_of(2)
|
conn.get_all_security_groups().should.have.length_of(1)
|
||||||
|
|
||||||
|
|
||||||
@mock_ec2_deprecated
|
@mock_ec2_deprecated
|
||||||
@ -384,12 +384,14 @@ def test_authorize_other_group_egress_and_revoke():
|
|||||||
"Ipv6Ranges": [],
|
"Ipv6Ranges": [],
|
||||||
"PrefixListIds": [],
|
"PrefixListIds": [],
|
||||||
}
|
}
|
||||||
|
org_ip_permission = ip_permission.copy()
|
||||||
|
ip_permission["UserIdGroupPairs"][0].pop("GroupName")
|
||||||
|
|
||||||
sg01.authorize_egress(IpPermissions=[ip_permission])
|
sg01.authorize_egress(IpPermissions=[org_ip_permission])
|
||||||
sg01.ip_permissions_egress.should.have.length_of(2)
|
sg01.ip_permissions_egress.should.have.length_of(2)
|
||||||
sg01.ip_permissions_egress.should.contain(ip_permission)
|
sg01.ip_permissions_egress.should.contain(ip_permission)
|
||||||
|
|
||||||
sg01.revoke_egress(IpPermissions=[ip_permission])
|
sg01.revoke_egress(IpPermissions=[org_ip_permission])
|
||||||
sg01.ip_permissions_egress.should.have.length_of(1)
|
sg01.ip_permissions_egress.should.have.length_of(1)
|
||||||
|
|
||||||
|
|
||||||
@ -467,7 +469,7 @@ def test_get_all_security_groups():
|
|||||||
resp[0].id.should.equal(sg1.id)
|
resp[0].id.should.equal(sg1.id)
|
||||||
|
|
||||||
resp = conn.get_all_security_groups()
|
resp = conn.get_all_security_groups()
|
||||||
resp.should.have.length_of(4)
|
resp.should.have.length_of(3)
|
||||||
|
|
||||||
|
|
||||||
@mock_ec2_deprecated
|
@mock_ec2_deprecated
|
||||||
@ -557,7 +559,7 @@ def test_sec_group_rule_limit():
|
|||||||
success = ec2_conn.authorize_security_group(
|
success = ec2_conn.authorize_security_group(
|
||||||
group_id=sg.id,
|
group_id=sg.id,
|
||||||
ip_protocol="-1",
|
ip_protocol="-1",
|
||||||
cidr_ip=["{0}.0.0.0/0".format(i) for i in range(99)],
|
cidr_ip=["{0}.0.0.0/0".format(i) for i in range(1, 60)],
|
||||||
)
|
)
|
||||||
success.should.be.true
|
success.should.be.true
|
||||||
# verify that we cannot authorize past the limit for a CIDR IP
|
# verify that we cannot authorize past the limit for a CIDR IP
|
||||||
@ -578,8 +580,8 @@ def test_sec_group_rule_limit():
|
|||||||
ec2_conn.authorize_security_group_egress(
|
ec2_conn.authorize_security_group_egress(
|
||||||
group_id=sg.id, ip_protocol="-1", src_group_id=other_sg.id
|
group_id=sg.id, ip_protocol="-1", src_group_id=other_sg.id
|
||||||
)
|
)
|
||||||
# fill the rules up the limit
|
# fill the rules up the limit, 59 + 1 default rule
|
||||||
for i in range(1, 100):
|
for i in range(1, 59):
|
||||||
ec2_conn.authorize_security_group_egress(
|
ec2_conn.authorize_security_group_egress(
|
||||||
group_id=sg.id, ip_protocol="-1", cidr_ip="{0}.0.0.0/0".format(i)
|
group_id=sg.id, ip_protocol="-1", cidr_ip="{0}.0.0.0/0".format(i)
|
||||||
)
|
)
|
||||||
@ -626,7 +628,7 @@ def test_sec_group_rule_limit_vpc():
|
|||||||
success = ec2_conn.authorize_security_group(
|
success = ec2_conn.authorize_security_group(
|
||||||
group_id=sg.id,
|
group_id=sg.id,
|
||||||
ip_protocol="-1",
|
ip_protocol="-1",
|
||||||
cidr_ip=["{0}.0.0.0/0".format(i) for i in range(49)],
|
cidr_ip=["{0}.0.0.0/0".format(i) for i in range(59)],
|
||||||
)
|
)
|
||||||
# verify that we cannot authorize past the limit for a CIDR IP
|
# verify that we cannot authorize past the limit for a CIDR IP
|
||||||
success.should.be.true
|
success.should.be.true
|
||||||
@ -650,7 +652,7 @@ def test_sec_group_rule_limit_vpc():
|
|||||||
# fill the rules up the limit
|
# fill the rules up the limit
|
||||||
# remember that by default, when created a sec group contains 1 egress rule
|
# remember that by default, when created a sec group contains 1 egress rule
|
||||||
# so our other_sg rule + 48 CIDR IP rules + 1 by default == 50 the limit
|
# so our other_sg rule + 48 CIDR IP rules + 1 by default == 50 the limit
|
||||||
for i in range(1, 49):
|
for i in range(1, 59):
|
||||||
ec2_conn.authorize_security_group_egress(
|
ec2_conn.authorize_security_group_egress(
|
||||||
group_id=sg.id, ip_protocol="-1", cidr_ip="{0}.0.0.0/0".format(i)
|
group_id=sg.id, ip_protocol="-1", cidr_ip="{0}.0.0.0/0".format(i)
|
||||||
)
|
)
|
||||||
@ -857,9 +859,7 @@ def test_authorize_and_revoke_in_bulk():
|
|||||||
"IpProtocol": "tcp",
|
"IpProtocol": "tcp",
|
||||||
"FromPort": 27017,
|
"FromPort": 27017,
|
||||||
"ToPort": 27017,
|
"ToPort": 27017,
|
||||||
"UserIdGroupPairs": [
|
"UserIdGroupPairs": [{"GroupId": sg02.id, "UserId": sg02.owner_id}],
|
||||||
{"GroupId": sg02.id, "GroupName": "sg02", "UserId": sg02.owner_id}
|
|
||||||
],
|
|
||||||
"IpRanges": [],
|
"IpRanges": [],
|
||||||
"Ipv6Ranges": [],
|
"Ipv6Ranges": [],
|
||||||
"PrefixListIds": [],
|
"PrefixListIds": [],
|
||||||
@ -877,7 +877,7 @@ def test_authorize_and_revoke_in_bulk():
|
|||||||
"IpProtocol": "tcp",
|
"IpProtocol": "tcp",
|
||||||
"FromPort": 27017,
|
"FromPort": 27017,
|
||||||
"ToPort": 27017,
|
"ToPort": 27017,
|
||||||
"UserIdGroupPairs": [{"GroupName": "sg03", "UserId": sg03.owner_id}],
|
"UserIdGroupPairs": [{"GroupId": sg03.id, "UserId": sg03.owner_id}],
|
||||||
"IpRanges": [],
|
"IpRanges": [],
|
||||||
"Ipv6Ranges": [],
|
"Ipv6Ranges": [],
|
||||||
"PrefixListIds": [],
|
"PrefixListIds": [],
|
||||||
@ -886,7 +886,7 @@ def test_authorize_and_revoke_in_bulk():
|
|||||||
"IpProtocol": "tcp",
|
"IpProtocol": "tcp",
|
||||||
"FromPort": 27015,
|
"FromPort": 27015,
|
||||||
"ToPort": 27015,
|
"ToPort": 27015,
|
||||||
"UserIdGroupPairs": [{"GroupName": "sg04", "UserId": sg04.owner_id}],
|
"UserIdGroupPairs": [{"GroupId": sg04.id, "UserId": sg04.owner_id}],
|
||||||
"IpRanges": [
|
"IpRanges": [
|
||||||
{"CidrIp": "10.10.10.0/24", "Description": "Some Description"}
|
{"CidrIp": "10.10.10.0/24", "Description": "Some Description"}
|
||||||
],
|
],
|
||||||
|
Loading…
Reference in New Issue
Block a user