in src/cfnlint/conditions.py [0:0]
def get_scenarios(self, conditions):
"""Get scenarios for all conditions provided"""
matched_equals = {}
matched_conditions = []
results = []
# When conditions don't properly get loaded (configuration error)
# lets just return an empty list
if not self.Conditions:
return results
for condition in conditions:
# When one of the conditions don't exist we return an empty result
if not self.Conditions.get(condition):
return []
for equal_key, equal_values in self.Conditions.get(condition).Influenced_Equals.items():
if not matched_equals.get(equal_key):
matched_equals[equal_key] = set()
else:
matched_conditions.append(condition)
for s_v in equal_values:
matched_equals[equal_key].add(s_v)
def multiply_equals(currents, s_hash, sets, parameter_values):
""" Multiply Equals when building scenarios """
results = []
false_case = ''
if not currents:
# If the Parameter being REFed has Allowed Values use those instead
if parameter_values:
for p_value in parameter_values:
# the allowed value must be an integer or string
# protecting against really badly formatted templates
if isinstance(p_value, (six.integer_types, six.string_types)):
new = {}
# the allowed values could be numbers so force a string
new[s_hash] = str(p_value)
results.append(new)
else:
for s_set in sets:
new = {}
new[s_hash] = s_set
false_case += s_set
results.append(new)
new = {}
new[s_hash] = false_case + '.bad'
results.append(new)
for current in currents:
# If the Parameter being REFed has Allowed Values use those instead
if parameter_values:
for p_value in parameter_values:
# the allowed value must be an integer or string
# protecting against really badly formatted templates
if isinstance(p_value, (six.integer_types, six.string_types)):
new = copy(current)
# the allowed values could be numbers so force a string
new[s_hash] = str(p_value)
results.append(new)
else:
for s_set in sets:
new = copy(current)
new[s_hash] = s_set
false_case += s_set
results.append(new)
new = copy(current)
new[s_hash] = false_case + '.bad'
results.append(new)
return results
if not matched_conditions:
# fail safe to not create a lot of unrelated scenarios. Just test if they are true/false
# At this point this value is completely arbitrary and not configurable
if len(conditions) > 4:
LOGGER.info(
'Found %s conditions. Limiting results to protect against heavy cpu time', len(conditions))
true_results = []
false_results = []
for condition in conditions:
true_results = self.multiply_conditions(true_results, condition, [True])
false_results = self.multiply_conditions(false_results, condition, [False])
results.extend(true_results)
results.extend(false_results)
else:
for condition in conditions:
results = self.multiply_conditions(results, condition, [True, False])
return results
if matched_conditions:
scenarios = []
for con_hash, sets in matched_equals.items():
scenarios = multiply_equals(scenarios, con_hash, sets,
self.Parameters.get(con_hash))
for scenario in scenarios:
r_condition = {}
for condition in conditions:
r_condition[condition] = self.Conditions.get(condition).test(scenario)
if r_condition not in results:
results.append(r_condition)
return(results)