"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""
from cfnlint.rules import CloudFormationLintRule, RuleMatch
class RuleTargetsLimit(CloudFormationLintRule):
"""Check State Machine Definition"""
id = "E3021"
shortdesc = "Check Events Rule Targets are less than or equal to 5"
description = "CloudWatch Events Rule can only support up to 5 targets"
source_url = "https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/cloudwatch_limits_cwe.html"
tags = ["resources", "events"]
max_count = 5
def __init__(self):
"""Init"""
super().__init__()
self.resource_property_types = ["AWS::Events::Rule"]
self.limits = {}
def initialize(self, cfn):
self.limits = {}
# pylint: disable=W0613
def check_value(self, value, path):
"""Count them up"""
resource_name = path[1]
if len(path) > 4:
if path[4] == "Fn::If":
resource_name = f"{path[1]}.{path[5]}"
if resource_name not in self.limits:
self.limits[resource_name] = {"count": 0, "path": path[:-1]}
self.limits[resource_name]["count"] += 1
return []
def match_resource_properties(self, properties, _, path, cfn):
"""Check CloudFormation Properties"""
matches = []
matches.extend(
cfn.check_value(
obj=properties,
key="Targets",
path=path[:],
check_value=self.check_value,
)
)
for _, limit in self.limits.items():
if limit["count"] > self.max_count:
message = "An Events Rule can have up to {0} Targets"
matches.append(RuleMatch(limit["path"], message.format(self.max_count)))
return matches