Skip to content

Commit e7a0089

Browse files
authored
CDPCAM-71 Add Private Subnets validation with 'Auto-assign public IPs' disabled (#22)
* Add private subnets auto-assign IP settings validation Signed-off-by: Anurag Patro <anurag.patro@cloudera.com>
1 parent 4f195dd commit e7a0089

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

cdpctl/validation/infra/issue_templates.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,7 @@ docs_link: https://docs.cloudera.com/cdp/latest/requirements-aws/topics/mc-aws-r
165165
id: AWS_VPC_NOT_FOUND_IN_ACCOUNT
166166
summary: "VPC ID {0} set in infra:aws:vpc:existing:vpc_id was not found in the AWS account."
167167
docs_link: https://docs.cloudera.com/cdp/latest/requirements-aws/topics/mc-aws-req-vpc.html
168+
---
169+
id: AWS_SUBNETS_WITH_PUBLIC_IPS_ENABLED
170+
summary: "These {0} Subnets must have 'Auto-assign Public IPs' disabled for a fully-private network configuration."
171+
render_type: list

cdpctl/validation/infra/issues.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,5 @@
121121
AWS_DNS_SUPPORT_NOT_ENABLED_FOR_VPC = "AWS_DNS_SUPPORT_NOT_ENABLED_FOR_VPC"
122122

123123
AWS_VPC_NOT_FOUND_IN_ACCOUNT = "AWS_VPC_NOT_FOUND_IN_ACCOUNT"
124+
125+
AWS_SUBNETS_WITH_PUBLIC_IPS_ENABLED = "AWS_SUBNETS_WITH_PUBLIC_IPS_ENABLED"

cdpctl/validation/infra/validate_aws_subnets.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
AWS_SUBNETS_MISSING_K8S_LB_TAG,
6060
AWS_SUBNETS_NOT_PART_OF_VPC,
6161
AWS_SUBNETS_OR_VPC_WITHOUT_INTERNET_GATEWAY,
62+
AWS_SUBNETS_WITH_PUBLIC_IPS_ENABLED,
6263
AWS_SUBNETS_WITHOUT_INTERNET_GATEWAY,
6364
AWS_SUBNETS_WITHOUT_VALID_RANGE,
6465
)
@@ -414,6 +415,27 @@ def aws_private_subnets_tags_validation() -> None:
414415
fail(AWS_REQUIRED_DATA_MISSING, e.args[0])
415416

416417

418+
@pytest.mark.aws
419+
@pytest.mark.infra
420+
@pytest.mark.dependency(depends=["aws_private_subnets_validation"])
421+
def aws_private_subnets_auto_assign_ip_validation() -> None:
422+
"""Private subnets have auto-assign public IPs disabled.""" # noqa: D401,E501
423+
try:
424+
subnets_w_public_ips_enabled = []
425+
for subnet in subnets_data["private_subnets"]:
426+
if subnet["MapPublicIpOnLaunch"]:
427+
subnets_w_public_ips_enabled.append(subnet["SubnetId"])
428+
429+
if len(subnets_w_public_ips_enabled) > 0:
430+
warn(
431+
AWS_SUBNETS_WITH_PUBLIC_IPS_ENABLED,
432+
subjects=["Private"],
433+
resources=subnets_w_public_ips_enabled,
434+
)
435+
except KeyError as e:
436+
fail(AWS_REQUIRED_DATA_MISSING, e.args[0])
437+
438+
417439
@pytest.mark.aws
418440
@pytest.mark.infra
419441
@pytest.mark.dependency(

tests/validation/infra/test_validate_aws_subnets.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949

5050
from cdpctl.validation.aws_utils import get_client
5151
from cdpctl.validation.infra.validate_aws_subnets import (
52+
aws_private_subnets_auto_assign_ip_validation,
5253
aws_private_subnets_availablity_zone_validation,
5354
aws_private_subnets_range_validation,
5455
aws_private_subnets_route_validation,
@@ -107,6 +108,7 @@
107108
{
108109
"AvailabilityZone": "us-west-2b",
109110
"CidrBlock": "20.0.237.0/14",
111+
"MapPublicIpOnLaunch": False,
110112
"SubnetId": "subnet-prvtest1-cdp",
111113
"VpcId": "vpc-testcdp12345",
112114
"Tags": [
@@ -117,6 +119,7 @@
117119
{
118120
"AvailabilityZone": "us-west-2c",
119121
"CidrBlock": "20.1.238.0/19",
122+
"MapPublicIpOnLaunch": False,
120123
"SubnetId": "subnet-prvtest2-cdp",
121124
"VpcId": "vpc-testcdp12345",
122125
"Tags": [
@@ -127,6 +130,7 @@
127130
{
128131
"AvailabilityZone": "us-west-2a",
129132
"CidrBlock": "20.2.236.0/18",
133+
"MapPublicIpOnLaunch": False,
130134
"SubnetId": "subnet-prvtest3-cdp",
131135
"VpcId": "vpc-testcdp12345",
132136
"Tags": [
@@ -899,7 +903,7 @@ def test_aws_private_subnets_tags_validation_success(ec2_client: EC2Client) -> N
899903
func()
900904

901905

902-
def test_aws_private_subnets_tags_validation_failure(ec2_client: EC2Client) -> None:
906+
def test_aws_private_subnets_tags_validation_warning(ec2_client: EC2Client) -> None:
903907
"""Unit test private subnets tags failure."""
904908
config = get_config(
905909
private_subnet_ids_val=private_subnet_ids, private_suffix_val="fail"
@@ -941,6 +945,63 @@ def test_aws_private_subnets_tags_validation_failure(ec2_client: EC2Client) -> N
941945
func()
942946

943947

948+
def test_aws_private_subnets_auto_assign_ip_validation_success(
949+
ec2_client: EC2Client,
950+
) -> None:
951+
"""Unit test private subnets auto assign ip settings success."""
952+
config = get_config(
953+
private_subnet_ids_val=private_subnet_ids, private_suffix_val="cdp"
954+
)
955+
stubber = Stubber(ec2_client)
956+
stubber.add_response(
957+
"describe_subnets",
958+
sample_private_subnets_response,
959+
expected_params={"SubnetIds": private_subnet_ids},
960+
)
961+
with stubber:
962+
func = expect_validation_success(aws_private_subnets_validation)
963+
func(config, ec2_client)
964+
with stubber:
965+
func = expect_validation_success(aws_private_subnets_auto_assign_ip_validation)
966+
func()
967+
968+
969+
def test_aws_private_subnets_auto_assign_ip_validation_warning(
970+
ec2_client: EC2Client,
971+
) -> None:
972+
"""Unit test private subnets auto assign ip settings failure."""
973+
config = get_config(
974+
private_subnet_ids_val=private_subnet_ids, private_suffix_val="fail"
975+
)
976+
stubber = Stubber(ec2_client)
977+
stubber.add_response(
978+
"describe_subnets",
979+
{
980+
"Subnets": [
981+
{
982+
"MapPublicIpOnLaunch": False,
983+
"SubnetId": "subnet-prvtest1-cdp",
984+
},
985+
{
986+
"MapPublicIpOnLaunch": False,
987+
"SubnetId": "subnet-prvtest2-cdp",
988+
},
989+
{
990+
"MapPublicIpOnLaunch": True,
991+
"SubnetId": "subnet-prvtest3-cdp",
992+
},
993+
],
994+
},
995+
expected_params={"SubnetIds": private_subnet_ids},
996+
)
997+
with stubber:
998+
func = expect_validation_success(aws_private_subnets_validation)
999+
func(config, ec2_client)
1000+
with stubber:
1001+
func = expect_validation_warning(aws_private_subnets_auto_assign_ip_validation)
1002+
func()
1003+
1004+
9441005
def test_aws_vpc_validation_success(ec2_client: EC2Client) -> None:
9451006
"""Unit test vpc success."""
9461007
config = {

0 commit comments

Comments
 (0)