""" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: MIT-0 """ from cfnlint.rules import CloudFormationLintRule, RuleMatch class Config(CloudFormationLintRule): """Check if Metadata configuration is properly configured""" id = "E4002" shortdesc = "Validate the configuration of the Metadata section" description = "Validates that Metadata section is an object and has no null values" source_url = "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html" tags = ["metadata"] def _check_object(self, obj, path): results = [] if isinstance(obj, (dict)): for k, v in obj.items(): results.extend(self._check_object(v, path + [k])) if isinstance(obj, (list)): for i, v in enumerate(obj): results.extend(self._check_object(v, path + [i])) if obj is None: message = "Metadata value cannot be null" results.append(RuleMatch(path, message.format(message))) return results def match(self, cfn): """Check CloudFormation Metadata Interface Configuration""" matches = [] metadata_obj = cfn.template.get("Metadata", {}) if metadata_obj is None: message = "Metadata value has to be an object" matches.append(RuleMatch(["Metadata"], message.format(message))) if metadata_obj: if isinstance(metadata_obj, dict): matches.extend(self._check_object(metadata_obj, ["Metadata"])) return matches