in src/cfnlint/template.py [0:0]
def get_conditions_scenarios_from_object(self, objs):
"""
Get condition from objects
"""
def get_conditions_from_property(value):
""" Recursively get conditions """
results = set()
if isinstance(value, dict):
if len(value) == 1:
for k, v in value.items():
if k == 'Fn::If':
if isinstance(v, list) and len(v) == 3:
if isinstance(v[0], six.string_types):
results.add(v[0])
results = results.union(get_conditions_from_property(v[1]))
results = results.union(get_conditions_from_property(v[2]))
elif isinstance(value, list):
for v in value:
results = results.union(get_conditions_from_property(v))
return results
con = set()
if isinstance(objs, dict):
objs = [objs]
for obj in objs:
if isinstance(obj, dict):
for k, v in obj.items():
# handle conditions directly under the object
if len(obj) == 1 and k == 'Fn::If' and len(v) == 3:
con.add(v[0])
for r_c in v[1:]:
if isinstance(r_c, dict):
for s_k, s_v in r_c.items():
if s_k == 'Fn::If':
con = con.union(get_conditions_from_property({s_k: s_v}))
else:
con = con.union(get_conditions_from_property(v))
return self.conditions.get_scenarios(list(con))