mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 20:42:02 +00:00
be347b2428
Co-authored-by: MrCloudSec <hello@mistercloudsec.com>
802 lines
29 KiB
Python
802 lines
29 KiB
Python
import ipaddress
|
|
import re
|
|
from base64 import b64decode, b64encode
|
|
from datetime import datetime
|
|
|
|
import botocore
|
|
import mock
|
|
from boto3 import client, resource
|
|
from dateutil.tz import tzutc
|
|
from freezegun import freeze_time
|
|
from moto import mock_aws
|
|
|
|
from prowler.config.config import encoding_format_utf_8
|
|
from prowler.providers.aws.services.ec2.ec2_service import EC2
|
|
from tests.providers.aws.utils import (
|
|
AWS_ACCOUNT_NUMBER,
|
|
AWS_REGION_EU_WEST_1,
|
|
AWS_REGION_US_EAST_1,
|
|
set_mocked_aws_provider,
|
|
)
|
|
|
|
EXAMPLE_AMI_ID = "ami-12c6146b"
|
|
MOCK_DATETIME = datetime(2023, 1, 4, 7, 27, 30, tzinfo=tzutc())
|
|
|
|
make_api_call = botocore.client.BaseClient._make_api_call
|
|
|
|
|
|
def mock_make_api_call(self, operation_name, kwarg):
|
|
if operation_name == "DescribeLaunchTemplateVersions":
|
|
return {
|
|
"LaunchTemplateVersions": [
|
|
{
|
|
"VersionNumber": 123,
|
|
"LaunchTemplateData": {
|
|
"UserData": b64encode(
|
|
"foobar123".encode(encoding_format_utf_8)
|
|
).decode(encoding_format_utf_8),
|
|
"NetworkInterfaces": [{"AssociatePublicIpAddress": True}],
|
|
"MetadataOptions": {
|
|
"HttpEndpoint": "enabled",
|
|
"HttpTokens": "optional",
|
|
},
|
|
},
|
|
}
|
|
]
|
|
}
|
|
if operation_name == "DescribeClientVpnEndpoints":
|
|
return {
|
|
"ClientVpnEndpoints": [
|
|
{
|
|
"ClientVpnEndpointId": "cvpn-endpoint-1234567890abcdef0",
|
|
"ConnectionLogOptions": {
|
|
"Enabled": True,
|
|
"CloudwatchLogGroup": "string",
|
|
"CloudwatchLogStream": "string",
|
|
},
|
|
"Tags": [{"Key": "vpnendpoint", "Value": "test"}],
|
|
}
|
|
]
|
|
}
|
|
return make_api_call(self, operation_name, kwarg)
|
|
|
|
|
|
class Test_EC2_Service:
|
|
# Test EC2 Service
|
|
@mock_aws
|
|
def test_service(self):
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert ec2.service == "ec2"
|
|
|
|
# Test EC2 Client
|
|
@mock_aws
|
|
def test_client(self):
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
for regional_client in ec2.regional_clients.values():
|
|
assert regional_client.__class__.__name__ == "EC2"
|
|
|
|
# Test EC2 Session
|
|
@mock_aws
|
|
def test__get_session__(self):
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert ec2.session.__class__.__name__ == "Session"
|
|
|
|
# Test EC2 Session
|
|
@mock_aws
|
|
def test_audited_account(self):
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert ec2.audited_account == AWS_ACCOUNT_NUMBER
|
|
|
|
# Test EC2 Describe Instances
|
|
@mock_aws
|
|
@freeze_time(MOCK_DATETIME)
|
|
def test_describe_instances(self):
|
|
# Generate EC2 Client
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Get AMI image
|
|
image_response = ec2_client.describe_images()
|
|
image_id = image_response["Images"][0]["ImageId"]
|
|
# Create EC2 Instances running
|
|
ec2_resource.create_instances(
|
|
MinCount=1,
|
|
MaxCount=1,
|
|
ImageId=image_id,
|
|
)
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert len(ec2.instances) == 1
|
|
assert re.match(r"i-[0-9a-z]{17}", ec2.instances[0].id)
|
|
assert (
|
|
ec2.instances[0].arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:instance/{ec2.instances[0].id}"
|
|
)
|
|
assert ec2.instances[0].type == "m1.small"
|
|
assert ec2.instances[0].state == "running"
|
|
assert re.match(r"ami-[0-9a-z]{8}", ec2.instances[0].image_id)
|
|
assert ec2.instances[0].launch_time == MOCK_DATETIME
|
|
assert not ec2.instances[0].user_data
|
|
assert not ec2.instances[0].http_tokens
|
|
assert not ec2.instances[0].http_endpoint
|
|
assert not ec2.instances[0].instance_profile
|
|
assert ipaddress.ip_address(ec2.instances[0].private_ip).is_private
|
|
assert (
|
|
ec2.instances[0].private_dns
|
|
== f"ip-{ec2.instances[0].private_ip.replace('.', '-')}.ec2.internal"
|
|
)
|
|
assert ipaddress.ip_address(ec2.instances[0].public_ip).is_global
|
|
assert (
|
|
ec2.instances[0].public_dns
|
|
== f"ec2-{ec2.instances[0].public_ip.replace('.', '-')}.compute-1.amazonaws.com"
|
|
)
|
|
|
|
assert ec2.instances[0].network_interfaces is not None
|
|
assert ec2.instances[0].virtualization_type == "hvm"
|
|
|
|
# Test EC2 Describe Security Groups
|
|
@mock_aws
|
|
def test_describe_security_groups(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create EC2 Security Group
|
|
sg_id = ec2_client.create_security_group(
|
|
Description="test-description",
|
|
GroupName="test-security-group",
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "security-group",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)["GroupId"]
|
|
ec2_client.authorize_security_group_ingress(
|
|
GroupId=sg_id,
|
|
IpPermissions=[
|
|
{
|
|
"IpProtocol": "-1",
|
|
"IpRanges": [{"CidrIp": "0.0.0.0/0"}],
|
|
}
|
|
],
|
|
)
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1],
|
|
expected_checks=[
|
|
"ec2_securitygroup_allow_ingress_from_internet_to_all_ports"
|
|
],
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert sg_id in str(ec2.security_groups)
|
|
for sg_arn, security_group in ec2.security_groups.items():
|
|
if security_group.id == sg_id:
|
|
assert security_group.name == "test-security-group"
|
|
assert (
|
|
sg_arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:security-group/{security_group.id}"
|
|
)
|
|
assert re.match(r"sg-[0-9a-z]{17}", security_group.id)
|
|
assert security_group.region == AWS_REGION_US_EAST_1
|
|
assert security_group.network_interfaces == []
|
|
assert security_group.ingress_rules == [
|
|
{
|
|
"IpProtocol": "-1",
|
|
"IpRanges": [{"CidrIp": "0.0.0.0/0"}],
|
|
"Ipv6Ranges": [],
|
|
"PrefixListIds": [],
|
|
"UserIdGroupPairs": [],
|
|
}
|
|
]
|
|
assert security_group.egress_rules == [
|
|
{
|
|
"IpProtocol": "-1",
|
|
"IpRanges": [{"CidrIp": "0.0.0.0/0"}],
|
|
"Ipv6Ranges": [],
|
|
"PrefixListIds": [],
|
|
"UserIdGroupPairs": [],
|
|
}
|
|
]
|
|
assert security_group.tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
|
|
# Test EC2 Describe Nacls
|
|
@mock_aws
|
|
def test_describe_network_acls(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create EC2 VPC and SG
|
|
vpc_id = ec2_client.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"]["VpcId"]
|
|
nacl_id = ec2_resource.create_network_acl(
|
|
VpcId=vpc_id,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "network-acl",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
).id
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert nacl_id in str(ec2.network_acls)
|
|
for arn, acl in ec2.network_acls.items():
|
|
if acl.id == nacl_id:
|
|
assert re.match(r"acl-[0-9a-z]{8}", acl.id)
|
|
assert (
|
|
arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:network-acl/{acl.id}"
|
|
)
|
|
assert acl.entries == []
|
|
assert not acl.in_use
|
|
assert not acl.default
|
|
assert acl.tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
|
|
# Test EC2 Describe Snapshots
|
|
@mock_aws
|
|
def test_describe_snapshots(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create EC2 Volume and Snapshot
|
|
volume_id = ec2_resource.create_volume(
|
|
AvailabilityZone="us-east-1a",
|
|
Size=80,
|
|
VolumeType="gp2",
|
|
).id
|
|
snapshot_id = ec2_client.create_snapshot(
|
|
VolumeId=volume_id,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "snapshot",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)["SnapshotId"]
|
|
snapshot_arn = f"arn:aws:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:snapshot/{snapshot_id}"
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert snapshot_id in str(ec2.snapshots)
|
|
assert ec2.volumes_with_snapshots[volume_id] is True
|
|
|
|
for snapshot in ec2.snapshots:
|
|
if snapshot.id == snapshot_id:
|
|
assert re.match(r"snap-[0-9a-z]{8}", snapshot.id)
|
|
assert snapshot.arn == snapshot_arn
|
|
assert snapshot.region == AWS_REGION_US_EAST_1
|
|
assert snapshot.tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
assert not snapshot.encrypted
|
|
assert not snapshot.public
|
|
|
|
# Test EC2 Get Snapshot Public
|
|
@mock_aws
|
|
def test__get_snapshot_public__(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create EC2 Volume and Snapshot
|
|
volume_id = ec2_resource.create_volume(
|
|
AvailabilityZone="us-east-1a",
|
|
Size=80,
|
|
VolumeType="gp2",
|
|
).id
|
|
snapshot_id = ec2_client.create_snapshot(
|
|
VolumeId=volume_id,
|
|
)["SnapshotId"]
|
|
ec2_client.modify_snapshot_attribute(
|
|
Attribute="createVolumePermission",
|
|
GroupNames=[
|
|
"all",
|
|
],
|
|
OperationType="add",
|
|
SnapshotId=snapshot_id,
|
|
)
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert snapshot_id in str(ec2.snapshots)
|
|
for snapshot in ec2.snapshots:
|
|
if snapshot.id == snapshot_id:
|
|
assert re.match(r"snap-[0-9a-z]{8}", snapshot.id)
|
|
assert (
|
|
snapshot.arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:snapshot/{snapshot.id}"
|
|
)
|
|
assert snapshot.region == AWS_REGION_US_EAST_1
|
|
assert not snapshot.encrypted
|
|
assert snapshot.public
|
|
|
|
# Test EC2 Instance User Data
|
|
@mock_aws
|
|
def test_get_instance_user_data(self):
|
|
user_data = "This is some user_data"
|
|
ec2 = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2.create_instances(
|
|
ImageId=EXAMPLE_AMI_ID,
|
|
MinCount=1,
|
|
MaxCount=1,
|
|
UserData="This is some user_data",
|
|
)
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert user_data == b64decode(ec2.instances[0].user_data).decode(
|
|
encoding_format_utf_8
|
|
)
|
|
|
|
# Test EC2 Get EBS Encryption by default
|
|
@mock_aws
|
|
def test__get_ebs_encryption_by_default__(self):
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_client.enable_ebs_encryption_by_default()
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
# One result per region
|
|
assert len(ec2.ebs_encryption_by_default) == 2
|
|
for result in ec2.ebs_encryption_by_default:
|
|
if result.region == AWS_REGION_US_EAST_1:
|
|
assert result.status
|
|
|
|
# Test EC2 get_snapshot_block_public_access_state
|
|
def test_get_snapshot_block_public_access_state(self):
|
|
from prowler.providers.aws.services.ec2.ec2_service import (
|
|
EbsSnapshotBlockPublicAccess,
|
|
)
|
|
|
|
ec2_client = mock.MagicMock()
|
|
ec2_client.ebs_block_public_access_snapshots_states = [
|
|
EbsSnapshotBlockPublicAccess(
|
|
status="block-all-sharing", snapshots=True, region=AWS_REGION_US_EAST_1
|
|
)
|
|
]
|
|
ec2_client.audited_account = AWS_ACCOUNT_NUMBER
|
|
ec2_client.region = AWS_REGION_US_EAST_1
|
|
|
|
with mock.patch(
|
|
"prowler.providers.common.provider.Provider.get_global_provider",
|
|
return_value=set_mocked_aws_provider(),
|
|
), mock.patch(
|
|
"prowler.providers.aws.services.ec2.ec2_client.ec2_client",
|
|
new=ec2_client,
|
|
):
|
|
assert (
|
|
ec2_client.ebs_block_public_access_snapshots_states[0].status
|
|
== "block-all-sharing"
|
|
)
|
|
|
|
# Test EC2 _get_resources_for_regions
|
|
@mock_aws
|
|
def test_get_resources_for_regions(self):
|
|
# Generate EC2 Client
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Get AMI image
|
|
image_response = ec2_client.describe_images()
|
|
image_id = image_response["Images"][0]["ImageId"]
|
|
# Create EC2 Instances running
|
|
ec2_resource.create_instances(
|
|
MinCount=1,
|
|
MaxCount=1,
|
|
ImageId=image_id,
|
|
)
|
|
# Create Volume
|
|
volume_id = ec2_client.create_volume(
|
|
AvailabilityZone=AWS_REGION_US_EAST_1,
|
|
Encrypted=False,
|
|
Size=40,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "volume",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)["VolumeId"]
|
|
ec2_client.create_snapshot(
|
|
VolumeId=volume_id,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "snapshot",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert ec2.attributes_for_regions[AWS_REGION_US_EAST_1]["has_snapshots"]
|
|
assert ec2.attributes_for_regions[AWS_REGION_US_EAST_1]["has_instances"]
|
|
assert ec2.attributes_for_regions[AWS_REGION_US_EAST_1]["has_volumes"]
|
|
|
|
# Test _get_instance_metadata_defaults
|
|
@mock_aws
|
|
def test_get_instance_metadata_defaults(self):
|
|
from prowler.providers.aws.services.ec2.ec2_service import (
|
|
InstanceMetadataDefaults,
|
|
)
|
|
|
|
ec2_client = mock.MagicMock()
|
|
ec2_client.instance_metadata_defaults = [
|
|
InstanceMetadataDefaults(
|
|
http_tokens="required", instances=True, region=AWS_REGION_US_EAST_1
|
|
)
|
|
]
|
|
ec2_client.audited_account = AWS_ACCOUNT_NUMBER
|
|
ec2_client.region = AWS_REGION_US_EAST_1
|
|
|
|
with mock.patch(
|
|
"prowler.providers.common.provider.Provider.get_global_provider",
|
|
return_value=set_mocked_aws_provider(),
|
|
), mock.patch(
|
|
"prowler.providers.aws.services.ec2.ec2_client.ec2_client",
|
|
new=ec2_client,
|
|
):
|
|
assert ec2_client.instance_metadata_defaults[0].http_tokens == "required"
|
|
|
|
# Test EC2 Describe Addresses
|
|
@mock_aws
|
|
def test__describe_addresses__(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
allocation_id = ec2_client.allocate_address(
|
|
Domain="vpc",
|
|
Address="127.38.43.222",
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "elastic-ip",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)["AllocationId"]
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert "127.38.43.222" in str(ec2.elastic_ips)
|
|
assert (
|
|
ec2.elastic_ips[0].arn
|
|
== f"arn:aws:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:eip-allocation/{allocation_id}"
|
|
)
|
|
assert ec2.elastic_ips[0].tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
|
|
# Test EC2 Describe Network Interfaces
|
|
@mock_aws
|
|
def test_describe_network_interfaces(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create VPC, Subnet, SecurityGroup and Network Interface
|
|
vpc = ec2_resource.create_vpc(CidrBlock="10.0.0.0/16")
|
|
subnet = ec2_resource.create_subnet(VpcId=vpc.id, CidrBlock="10.0.0.0/18")
|
|
|
|
eni = subnet.create_network_interface(
|
|
SubnetId=subnet.id,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "network-interface",
|
|
"Tags": [
|
|
{"Key": "string", "Value": "string"},
|
|
],
|
|
},
|
|
],
|
|
)
|
|
eip = ec2_client.allocate_address(Domain="vpc")
|
|
ec2_client.associate_address(
|
|
NetworkInterfaceId=eni.id, AllocationId=eip["AllocationId"]
|
|
)
|
|
# Attach ENI to Instance
|
|
ec2_resource.create_instances(
|
|
ImageId=EXAMPLE_AMI_ID,
|
|
MinCount=1,
|
|
MaxCount=1,
|
|
NetworkInterfaces=[{"DeviceIndex": 0, "NetworkInterfaceId": eni.id}],
|
|
)[0]
|
|
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
assert len(ec2.network_interfaces) == 1
|
|
assert ec2.network_interfaces[eni.id].association
|
|
assert ec2.network_interfaces[eni.id].attachment
|
|
assert ec2.network_interfaces[eni.id].id == eni.id
|
|
assert ec2.network_interfaces[eni.id].private_ip == eni.private_ip_address
|
|
assert ec2.network_interfaces[eni.id].subnet_id == subnet.id
|
|
assert ec2.network_interfaces[eni.id].type == eni.interface_type
|
|
assert ec2.network_interfaces[eni.id].vpc_id == vpc.id
|
|
assert ec2.network_interfaces[eni.id].region == AWS_REGION_US_EAST_1
|
|
assert ec2.network_interfaces[eni.id].tags == [
|
|
{"Key": "string", "Value": "string"},
|
|
]
|
|
# Check if ENI was added to security group
|
|
for sg in ec2.security_groups.values():
|
|
if sg.id == eni.groups[0]["GroupId"]:
|
|
assert sg.network_interfaces[0] == ec2.network_interfaces[eni.id]
|
|
|
|
# Test EC2 Describe Images
|
|
@mock_aws
|
|
def test_describe_images(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
ec2_resource = resource("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create AMI
|
|
tag_specifications = [
|
|
{
|
|
"ResourceType": "image",
|
|
"Tags": [
|
|
{
|
|
"Key": "Base_AMI_Name",
|
|
"Value": "Deep Learning Base AMI (Amazon Linux 2) Version 31.0",
|
|
},
|
|
{"Key": "OS_Version", "Value": "AWS Linux 2"},
|
|
],
|
|
},
|
|
]
|
|
instance = ec2_resource.create_instances(
|
|
ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1
|
|
)[0]
|
|
image_id = ec2_client.create_image(
|
|
InstanceId=instance.instance_id,
|
|
Name="test-image",
|
|
Description="test ami",
|
|
TagSpecifications=tag_specifications,
|
|
)["ImageId"]
|
|
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert len(ec2.images) == 1
|
|
assert ec2.images[0].id == image_id
|
|
assert re.match(r"ami-[0-9a-z]{8}", ec2.images[0].id)
|
|
assert (
|
|
ec2.images[0].arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:image/{ec2.images[0].id}"
|
|
)
|
|
assert not ec2.images[0].public
|
|
assert ec2.images[0].region == AWS_REGION_US_EAST_1
|
|
assert ec2.images[0].tags == [
|
|
{
|
|
"Key": "Base_AMI_Name",
|
|
"Value": "Deep Learning Base AMI (Amazon Linux 2) Version 31.0",
|
|
},
|
|
{"Key": "OS_Version", "Value": "AWS Linux 2"},
|
|
]
|
|
|
|
# Test EC2 Describe Volumes
|
|
@mock_aws
|
|
def test_describe_volumes(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
# Create Volume
|
|
volume_id = ec2_client.create_volume(
|
|
AvailabilityZone=AWS_REGION_US_EAST_1,
|
|
Encrypted=False,
|
|
Size=40,
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "volume",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
},
|
|
],
|
|
)["VolumeId"]
|
|
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert len(ec2.volumes) == 1
|
|
assert ec2.volumes[0].id == volume_id
|
|
assert re.match(r"vol-[0-9a-z]{8}", ec2.volumes[0].id)
|
|
assert (
|
|
ec2.volumes[0].arn
|
|
== f"arn:{aws_provider.identity.partition}:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:volume/{ec2.volumes[0].id}"
|
|
)
|
|
assert ec2.volumes[0].region == AWS_REGION_US_EAST_1
|
|
assert not ec2.volumes[0].encrypted
|
|
assert ec2.volumes[0].tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
|
|
# Test EC2 Describe Launch Templates
|
|
@mock_aws
|
|
def test__describe_launch_templates__(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
|
|
TEMPLATE_NAME = "tester1"
|
|
TEMPLATE_INSTANCE_TYPE = "c5.large"
|
|
KNOWN_SECRET_USER_DATA = "DB_PASSWORD=foobar123"
|
|
|
|
# Create EC2 Launch Template API
|
|
ec2_client.create_launch_template(
|
|
LaunchTemplateName=TEMPLATE_NAME,
|
|
VersionDescription="Test EC Launch Template 1 (Secret in UserData)",
|
|
LaunchTemplateData={
|
|
"InstanceType": TEMPLATE_INSTANCE_TYPE,
|
|
"UserData": b64encode(
|
|
KNOWN_SECRET_USER_DATA.encode(encoding_format_utf_8)
|
|
).decode(encoding_format_utf_8),
|
|
},
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "launch-template",
|
|
"Tags": [
|
|
{"Key": "test", "Value": "test"},
|
|
],
|
|
}
|
|
],
|
|
)
|
|
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert len(ec2.launch_templates) == 1
|
|
assert ec2.launch_templates[0].name == TEMPLATE_NAME
|
|
assert ec2.launch_templates[0].region == AWS_REGION_US_EAST_1
|
|
assert (
|
|
ec2.launch_templates[0].arn
|
|
== f"arn:aws:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:launch-template/{ec2.launch_templates[0].id}"
|
|
)
|
|
assert ec2.launch_templates[0].tags == [
|
|
{"Key": "test", "Value": "test"},
|
|
]
|
|
|
|
# Test EC2 Describe Launch Templates
|
|
@mock_aws
|
|
@mock.patch("botocore.client.BaseClient._make_api_call", new=mock_make_api_call)
|
|
def test_describe_launch_template_versions(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
|
|
TEMPLATE_NAME = "tester1"
|
|
TEMPLATE_INSTANCE_TYPE = "c5.large"
|
|
|
|
# Create EC2 Launch Template API
|
|
ec2_client.create_launch_template(
|
|
LaunchTemplateName=TEMPLATE_NAME,
|
|
VersionDescription="Test EC Launch Template 1 (Secret in UserData)",
|
|
LaunchTemplateData={
|
|
"InstanceType": TEMPLATE_INSTANCE_TYPE,
|
|
},
|
|
)
|
|
launch_template_id = ec2_client.describe_launch_templates()["LaunchTemplates"][
|
|
0
|
|
]["LaunchTemplateId"]
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider([AWS_REGION_US_EAST_1])
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert len(ec2.launch_templates) == 1
|
|
assert ec2.launch_templates[0].region == AWS_REGION_US_EAST_1
|
|
assert ec2.launch_templates[0].id == launch_template_id
|
|
assert len(ec2.launch_templates[0].versions) == 1
|
|
|
|
version = ec2.launch_templates[0].versions[0]
|
|
|
|
assert (
|
|
b64decode(version.template_data.user_data).decode(encoding_format_utf_8)
|
|
== "foobar123"
|
|
)
|
|
|
|
assert version.template_data.associate_public_ip_address
|
|
assert version.template_data.http_endpoint == "enabled"
|
|
assert version.template_data.http_tokens == "optional"
|
|
|
|
# Test EC2 Describe VPN Endpoints
|
|
@mock.patch("botocore.client.BaseClient._make_api_call", new=mock_make_api_call)
|
|
def test_describe_vpn_endpoints(self):
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider([AWS_REGION_US_EAST_1])
|
|
ec2 = EC2(aws_provider)
|
|
|
|
assert len(ec2.vpn_endpoints) == 1
|
|
vpn_arn = f"arn:aws:ec2:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:client-vpn-endpoint/cvpn-endpoint-1234567890abcdef0"
|
|
assert vpn_arn in ec2.vpn_endpoints
|
|
vpn_endpoint = ec2.vpn_endpoints[vpn_arn]
|
|
assert vpn_endpoint.id == "cvpn-endpoint-1234567890abcdef0"
|
|
assert vpn_endpoint.connection_logging
|
|
assert vpn_endpoint.region == AWS_REGION_US_EAST_1
|
|
|
|
# Test EC2 Describe Launch Templates
|
|
@mock_aws
|
|
def test_describe_transit_gateways(self):
|
|
# Generate EC2 Client
|
|
ec2_client = client("ec2", region_name=AWS_REGION_US_EAST_1)
|
|
|
|
# Create EC2 Transit Gateway API
|
|
response = ec2_client.create_transit_gateway(
|
|
Description="Test Transit Gateway",
|
|
Options={
|
|
"AmazonSideAsn": 64512,
|
|
"AutoAcceptSharedAttachments": "enable",
|
|
},
|
|
TagSpecifications=[
|
|
{
|
|
"ResourceType": "transit-gateway",
|
|
"Tags": [{"Key": "Name", "Value": "test-tgw"}],
|
|
}
|
|
],
|
|
)
|
|
|
|
# EC2 client for this test class
|
|
aws_provider = set_mocked_aws_provider(
|
|
[AWS_REGION_EU_WEST_1, AWS_REGION_US_EAST_1]
|
|
)
|
|
ec2 = EC2(aws_provider)
|
|
|
|
transit_arn = response["TransitGateway"]["TransitGatewayArn"]
|
|
|
|
assert len(ec2.transit_gateways) == 1
|
|
assert (
|
|
ec2.transit_gateways[transit_arn].id
|
|
== response["TransitGateway"]["TransitGatewayId"]
|
|
)
|
|
assert ec2.transit_gateways[transit_arn].auto_accept_shared_attachments
|
|
assert ec2.transit_gateways[transit_arn].region == AWS_REGION_US_EAST_1
|