""" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: MIT-0 """ import regex as re from cfnlint.helpers import LIMITS, REGEX_ALPHANUMERIC from cfnlint.rules import RuleMatch def approaching_name_limit(cfn, section): matches = [] for name in cfn.template.get(section, {}): if ( LIMITS["threshold"] * LIMITS[section]["name"] < len(name) <= LIMITS[section]["name"] ): message = ( "The length of " + section[:-1] + " name ({0}) is approaching the limit ({1})" ) matches.append( RuleMatch( [section, name], message.format(len(name), LIMITS[section]["name"]) ) ) return matches def approaching_number_limit(cfn, section): matches = [] number = ( cfn.get_resources() if section == "Resources" else cfn.template.get(section, {}) ) if ( LIMITS["threshold"] * LIMITS[section]["number"] < len(number) <= LIMITS[section]["number"] ): message = "The number of " + section + " ({0}) is approaching the limit ({1})" matches.append( RuleMatch([section], message.format(len(number), LIMITS[section]["number"])) ) return matches def name_limit(cfn, section): matches = [] for name in cfn.template.get(section, {}): if len(name) > LIMITS[section]["name"]: message = ( "The length of " + section[:-1] + " name ({0}) exceeds the limit ({1})" ) matches.append( RuleMatch( [section, name], message.format(len(name), LIMITS[section]["name"]) ) ) return matches def number_limit(cfn, section): matches = [] number = ( cfn.get_resources() if section == "Resources" else cfn.template.get(section, {}) ) if len(number) > LIMITS[section]["number"]: message = "The number of " + section + " ({0}) exceeds the limit ({1})" matches.append( RuleMatch([section], message.format(len(number), LIMITS[section]["number"])) ) return matches def alphanumeric_name(cfn, section): matches = [] for name, _ in cfn.template.get(section, {}).items(): if not re.match(REGEX_ALPHANUMERIC, name): message = ( section[:-1] + " {0} has invalid name. Name has to be alphanumeric." ) matches.append(RuleMatch([section, name], message.format(name))) return matches