Skip to content

Commit

Permalink
Add rule E1154 to validate Subnet IDs
Browse files Browse the repository at this point in the history
  • Loading branch information
kddejong committed Oct 21, 2024
1 parent 90cec42 commit 8a563c2
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 2 deletions.
33 changes: 33 additions & 0 deletions src/cfnlint/rules/formats/SubnetId.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""

from __future__ import annotations

from typing import Any

import regex as re

from cfnlint.jsonschema import Validator
from cfnlint.rules.formats.FormatKeyword import FormatKeyword


class SubnetId(FormatKeyword):
id = "E1154"
shortdesc = "Validate VPC subnet id format"
description = "Check that a VPC subnet id matches a pattern"
tags = []
source_url = "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/format_keyword.md#AWS::EC2::Subnet.Id"

def __init__(self):
super().__init__(format="AWS::EC2::Subnet.Id")

def format(self, validator: Validator, instance: Any) -> bool:
if not isinstance(instance, str):
return True

if re.match(r"^subnet-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$", instance):
return True

return False
2 changes: 1 addition & 1 deletion test/fixtures/templates/integration/aws-ec2-instance.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Resources:
Properties:
Description: foobar
SourceDestCheck: false
SubnetId: subnet-abcdefgh
SubnetId: subnet-0abc1def2345a678b
Instance:
Type: AWS::EC2::Instance
Properties:
Expand Down
2 changes: 1 addition & 1 deletion test/unit/module/cfn_json/test_cfn_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def setUp(self):
},
"nat_instance": {
"filename": "test/fixtures/templates/quickstart/nat-instance.json",
"failures": 3,
"failures": 4,
},
"vpc_management": {
"filename": "test/fixtures/templates/quickstart/vpc-management.json",
Expand Down
40 changes: 40 additions & 0 deletions test/unit/rules/formats/test_subnet_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""

import pytest

from cfnlint.rules.formats.SubnetId import SubnetId


@pytest.fixture(scope="module")
def rule():
rule = SubnetId()
yield rule


@pytest.mark.parametrize(
"name,instance,expected",
[
(
"Valid subnet id",
"subnet-abcd1234",
True,
),
(
"Valid subnet id long",
"subnet-abcdefa1234567890",
True,
),
(
"Valid but wrong type",
[],
True,
),
("Invalid subnet ID", "subnet-abc", False),
],
)
def test_validate(name, instance, expected, rule, validator):
result = rule.format(validator, instance)
assert result == expected, f"Test {name!r} got {result!r}"

0 comments on commit 8a563c2

Please sign in to comment.