in src/cfnlint/rules/__init__.py [0:0]
def resource_property(self, filename, cfn, path, properties, resource_type, property_type):
"""Run loops in resource checks for embedded properties"""
matches = []
property_spec = cfnlint.helpers.RESOURCE_SPECS['us-east-1'].get('PropertyTypes')
if property_type == 'Tag':
property_spec_name = 'Tag'
else:
property_spec_name = '%s.%s' % (resource_type, property_type)
if property_spec_name in property_spec:
for rule in self.rules:
if isinstance(properties, dict):
if len(properties) == 1:
for k, _ in properties.items():
if k != 'Fn::If':
matches.extend(
self.run_check(
rule.matchall_resource_sub_properties, filename, rule.id,
filename, cfn, properties, property_spec_name, path
)
)
else:
matches.extend(
self.run_check(
rule.matchall_resource_sub_properties, filename, rule.id,
filename, cfn, properties, property_spec_name, path
)
)
else:
matches.extend(
self.run_check(
rule.matchall_resource_sub_properties, filename, rule.id,
filename, cfn, properties, property_spec_name, path
)
)
resource_spec_properties = property_spec.get(property_spec_name, {}).get('Properties')
if not resource_spec_properties:
if property_spec.get(property_spec_name, {}).get('Type') == 'List':
if isinstance(properties, list):
property_type = property_spec.get(property_spec_name, {}).get('ItemType')
for index, item in enumerate(properties):
matches.extend(self.resource_property(
filename, cfn,
path[:] + [index],
item, resource_type, property_type))
return matches
if isinstance(properties, dict):
for resource_property, resource_property_value in properties.items():
property_path = path[:] + [resource_property]
resource_spec_property = resource_spec_properties.get(resource_property, {})
if resource_property not in resource_spec_properties:
if resource_property == 'Fn::If':
if isinstance(resource_property_value, list):
if len(resource_property_value) == 3:
for index, c_value in enumerate(resource_property_value[1:]):
if isinstance(c_value, list):
for s_i, c_l_value in enumerate(c_value):
matches.extend(self.resource_property(
filename, cfn,
property_path[:] + [index + 1] + [s_i],
c_l_value, resource_type, property_type))
else:
matches.extend(self.resource_property(
filename, cfn,
property_path[:] + [index + 1],
c_value, resource_type, property_type))
continue
if (resource_spec_property.get('Type') == 'List' and
not resource_spec_properties.get('PrimitiveItemType')):
if isinstance(resource_property_value, (list)):
for index, value in enumerate(resource_property_value):
matches.extend(self.resource_property(
filename, cfn,
property_path[:] + [index],
value, resource_type, resource_spec_property.get('ItemType')
))
elif resource_spec_property.get('Type'):
if isinstance(resource_property_value, (dict)):
matches.extend(self.resource_property(
filename, cfn,
property_path,
resource_property_value,
resource_type, resource_spec_property.get('Type')
))
return matches