def test_trigger_instance_payload_with_special_values(self): # Test a rule where TriggerInstance payload contains a dot (".") and $ self._setup_sample_trigger("st2.test.trigger1") self._setup_sample_trigger("st2.test.trigger2") rule_db_1 = self._setup_sample_rule(RULE_1) rule_db_2 = self._setup_sample_rule(RULE_2) rule_db_3 = self._setup_sample_rule(RULE_3) rules = [rule_db_1, rule_db_2, rule_db_3] trigger_instance = container_utils.create_trigger_instance( "dummy_pack_1.st2.test.trigger2", { "k1": "t1_p_v", "k2.k2": "v2", "k3.more.nested.deep": "some.value", "k4.even.more.nested$": "foo", "yep$aaa": "b", }, date_utils.get_datetime_utc_now(), ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertIsNotNone(matching_rules) self.assertEqual(len(matching_rules), 1)
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db() trigger_instance_db, trigger_db = self._get_trigger_instance_db() # The trigger check needs to be performed here as that is not performed # by RulesMatcher. if rule_db.trigger != trigger_db.ref: LOG.info('rule.trigger "%s" and trigger.ref "%s" do not match.', rule_db.trigger, trigger_db.ref) return False matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db], extra_info=True) matching_rules = matcher.get_matching_rules() return len(matching_rules) >= 1
def test_rule_enforcement_is_created_on_exception_3(self): # 1. Exception in payload_lookup.get_value rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(rule_enforcement_dbs, []) self._setup_sample_trigger('st2.test.trigger4') rule_4_db = self._setup_sample_rule(RULE_4) rules = [rule_4_db] trigger_instance = container_utils.create_trigger_instance( 'dummy_pack_1.st2.test.trigger4', {'k1': 't2_p_v', 'k2': 'v2'}, date_utils.get_datetime_utc_now() ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(matching_rules, []) self.assertEqual(len(matching_rules), 0) rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(len(rule_enforcement_dbs), 1) expected_failure = ('Failed to match rule "yoyohoneysingh.st2.test.rule4" against trigger ' 'instance "%s": There might be a problem with the criteria in rule ' 'yoyohoneysingh.st2.test.rule4: exception in equals' % (str(trigger_instance.id))) self.assertEqual(rule_enforcement_dbs[0].failure_reason, expected_failure) self.assertEqual(rule_enforcement_dbs[0].trigger_instance_id, str(trigger_instance.id)) self.assertEqual(rule_enforcement_dbs[0].rule['id'], str(rule_4_db.id)) self.assertEqual(rule_enforcement_dbs[0].status, RULE_ENFORCEMENT_STATUS_FAILED)
def get_matching_rules_for_trigger(self, trigger_instance): trigger = trigger_instance.trigger trigger_db = get_trigger_db_by_ref(trigger_instance.trigger) if not trigger_db: LOG.error( 'No matching trigger found in db for trigger instance %s.', trigger_instance) return None rules = get_rules_given_trigger(trigger=trigger) LOG.info('Found %d rules defined for trigger %s', len(rules), trigger_db.get_reference().ref) if len(rules) < 1: return rules matcher = RulesMatcher(trigger_instance=trigger_instance, trigger=trigger_db, rules=rules) matching_rules = matcher.get_matching_rules() LOG.info('Matched %s rule(s) for trigger_instance %s (trigger=%s)', len(matching_rules), trigger_instance['id'], trigger_db.ref) return matching_rules
def test_rule_enforcement_is_created_on_exception_2(self): # 1. Exception in payload_lookup.get_value rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(rule_enforcement_dbs, []) self._setup_sample_trigger('st2.test.trigger4') rule_4_db = self._setup_sample_rule(RULE_4) rules = [rule_4_db] trigger_instance = container_utils.create_trigger_instance( 'dummy_pack_1.st2.test.trigger4', { 'k1': 't2_p_v', 'k2': 'v2' }, date_utils.get_datetime_utc_now()) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(matching_rules, []) self.assertEqual(len(matching_rules), 0) rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(len(rule_enforcement_dbs), 1) expected_failure = ( 'Failed to match rule "yoyohoneysingh.st2.test.rule4" against trigger ' 'instance "%s": Failed transforming criteria key trigger.k1: ' 'exception in get_value' % (str(trigger_instance.id))) self.assertEqual(rule_enforcement_dbs[0].failure_reason, expected_failure) self.assertEqual(rule_enforcement_dbs[0].trigger_instance_id, str(trigger_instance.id)) self.assertEqual(rule_enforcement_dbs[0].rule['id'], str(rule_4_db.id)) self.assertEqual(rule_enforcement_dbs[0].status, RULE_ENFORCEMENT_STATUS_FAILED)
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db() trigger_instance_db, trigger_db = self._get_trigger_instance_db() # The trigger check needs to be performed here as that is not performed # by RulesMatcher. if rule_db.trigger != trigger_db.ref: LOG.info('rule.trigger "%s" and trigger.ref "%s" do not match.', rule_db.trigger, trigger_db.ref) return False # Check if rule matches criteria. matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db], extra_info=True) matching_rules = matcher.get_matching_rules() # Rule does not match so early exit. if len(matching_rules) < 1: return False # Check if rule can be enforced enforcer = RuleEnforcer(trigger_instance=trigger_instance_db, rule=rule_db) runner_type_db = mock.Mock() runner_type_db.runner_parameters = {} action_db = mock.Mock() action_db.parameters = {} params = rule_db.action.parameters # pylint: disable=no-member context, additional_contexts = enforcer.get_action_execution_context(action_db=action_db, trace_context=None) # Note: We only return partially resolved parameters. # To be able to return all parameters we would need access to corresponding ActionDB, # RunnerTypeDB and ConfigDB object, but this would add a dependency on the database and the # tool is meant to be used standalone. try: params = enforcer.get_resolved_parameters(action_db=action_db, runnertype_db=runner_type_db, params=params, context=context, additional_contexts=additional_contexts) LOG.info('Action parameters resolved to:') for param in six.iteritems(params): LOG.info('\t%s: %s', param[0], param[1]) return True except (UndefinedError, ValueError) as e: LOG.error('Failed to resolve parameters\n\tOriginal error : %s', six.text_type(e)) return False except: LOG.exception('Failed to resolve parameters.') return False
def test_rule_enforcement_is_created_on_exception_3(self): # 1. Exception in payload_lookup.get_value rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(rule_enforcement_dbs, []) self._setup_sample_trigger("st2.test.trigger4") rule_4_db = self._setup_sample_rule(RULE_4) rules = [rule_4_db] trigger_instance = container_utils.create_trigger_instance( "dummy_pack_1.st2.test.trigger4", {"k1": "t2_p_v", "k2": "v2"}, date_utils.get_datetime_utc_now(), ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(matching_rules, []) self.assertEqual(len(matching_rules), 0) rule_enforcement_dbs = list(RuleEnforcement.get_all()) self.assertEqual(len(rule_enforcement_dbs), 1) expected_failure = ( 'Failed to match rule "yoyohoneysingh.st2.test.rule4" against trigger ' 'instance "%s": There might be a problem with the criteria in rule ' "yoyohoneysingh.st2.test.rule4: exception in equals" % (str(trigger_instance.id)) ) self.assertEqual(rule_enforcement_dbs[0].failure_reason, expected_failure) self.assertEqual( rule_enforcement_dbs[0].trigger_instance_id, str(trigger_instance.id) ) self.assertEqual(rule_enforcement_dbs[0].rule["id"], str(rule_4_db.id)) self.assertEqual(rule_enforcement_dbs[0].status, RULE_ENFORCEMENT_STATUS_FAILED)
def test_backstop_ignore(self): trigger_instance = container_utils.create_trigger_instance( self.models['triggers']['trigger1.yaml'].ref, {'k1': 'v1'}, date_utils.get_datetime_utc_now()) trigger = self.models['triggers']['trigger1.yaml'] rules = [rule for rule in six.itervalues(self.models['rules'])] rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(len(matching_rules), 1) self.assertEqual(matching_rules[0].id, self.models['rules']['success.yaml'].id)
def get_matching_rules_for_trigger(self, trigger_instance): trigger = get_trigger_db(trigger=trigger_instance.trigger) rules = Rule.query(trigger=trigger_instance.trigger, enabled=True) LOG.info('Found %d rules defined for trigger %s', len(rules), trigger['name']) matcher = RulesMatcher(trigger_instance=trigger_instance, trigger=trigger, rules=rules) matching_rules = matcher.get_matching_rules() LOG.info('Matched %s rule(s) for trigger_instance %s.', len(matching_rules), trigger['name']) return matching_rules
def test_backstop_ignore(self): trigger_instance = container_utils.create_trigger_instance( self.models['triggers']['trigger1.yaml'].ref, {'k1': 'v1'}, date_utils.get_datetime_utc_now() ) trigger = self.models['triggers']['trigger1.yaml'] rules = [rule for rule in six.itervalues(self.models['rules'])] rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(len(matching_rules), 1) self.assertEqual(matching_rules[0].id, self.models['rules']['success.yaml'].id)
def get_matching_rules_for_trigger(self, trigger_instance): trigger = trigger_instance.trigger trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules = Rule.query(trigger=trigger_instance.trigger, enabled=True) LOG.info('Found %d rules defined for trigger %s', len(rules), trigger['name']) matcher = RulesMatcher(trigger_instance=trigger_instance, trigger=trigger, rules=rules) matching_rules = matcher.get_matching_rules() LOG.info('Matched %s rule(s) for trigger_instance %s.', len(matching_rules), trigger['name']) return matching_rules
def test_backstop_ignore(self): trigger_instance = container_utils.create_trigger_instance( self.models["triggers"]["trigger1.yaml"].ref, {"k1": "v1"}, date_utils.get_datetime_utc_now(), ) trigger = self.models["triggers"]["trigger1.yaml"] rules = [rule for rule in six.itervalues(self.models["rules"])] rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertEqual(len(matching_rules), 1) self.assertEqual(matching_rules[0].id, self.models["rules"]["success.yaml"].id)
def test_get_matching_rules(self): self._setup_sample_trigger('st2.test.trigger1') trigger_instance = container_utils.create_trigger_instance( 'dummy_pack_1.st2.test.trigger1', {'k1': 't1_p_v', 'k2': 'v2'}, datetime.datetime.utcnow() ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules = self._get_sample_rules() rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertTrue(matching_rules is not None) self.assertEqual(len(matching_rules), 1)
def test_get_matching_rules(self): self._setup_sample_trigger('st2.test.trigger1') trigger_instance = container_utils.create_trigger_instance( 'dummy_pack_1.st2.test.trigger1', { 'k1': 't1_p_v', 'k2': 'v2' }, date_utils.get_datetime_utc_now()) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules = self._get_sample_rules() rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertTrue(matching_rules is not None) self.assertEqual(len(matching_rules), 1)
def test_trigger_instance_payload_with_special_values(self): # Test a rule where TriggerInstance payload contains a dot (".") and $ self._setup_sample_trigger('st2.test.trigger2') trigger_instance = container_utils.create_trigger_instance( 'dummy_pack_1.st2.test.trigger2', {'k1': 't1_p_v', 'k2.k2': 'v2', 'k3.more.nested.deep': 'some.value', 'k4.even.more.nested$': 'foo', 'yep$aaa': 'b'}, date_utils.get_datetime_utc_now() ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules = self._get_sample_rules() rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertTrue(matching_rules is not None) self.assertEqual(len(matching_rules), 1)
def test_get_matching_rules(self): self._setup_sample_trigger("st2.test.trigger1") rule_db_1 = self._setup_sample_rule(RULE_1) rule_db_2 = self._setup_sample_rule(RULE_2) rule_db_3 = self._setup_sample_rule(RULE_3) rules = [rule_db_1, rule_db_2, rule_db_3] trigger_instance = container_utils.create_trigger_instance( "dummy_pack_1.st2.test.trigger1", {"k1": "t1_p_v", "k2": "v2"}, date_utils.get_datetime_utc_now(), ) trigger = get_trigger_db_by_ref(trigger_instance.trigger) rules_matcher = RulesMatcher(trigger_instance, trigger, rules) matching_rules = rules_matcher.get_matching_rules() self.assertIsNotNone(matching_rules) self.assertEqual(len(matching_rules), 1)
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db() trigger_instance_db, trigger_db = self._get_trigger_instance_db() # The trigger check needs to be performed here as that is not performed # by RulesMatcher. if rule_db.trigger != trigger_db.ref: LOG.info('rule.trigger "%s" and trigger.ref "%s" do not match.', rule_db.trigger, trigger_db.ref) return False # Check if rule matches criteria. matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db], extra_info=True) matching_rules = matcher.get_matching_rules() # Rule does not match so early exit. if len(matching_rules) < 1: return False # Check if rule can be enforced try: enforcer = RuleEnforcer(trigger_instance=trigger_instance_db, rule=rule_db) params = enforcer.get_resolved_parameters() LOG.info('Action parameters resolved to:') for param in six.iteritems(params): LOG.info('\t%s: %s', param[0], param[1]) return True except (UndefinedError, ValueError) as e: LOG.error('Failed to resolve parameters\n\tOriginal error : %s', str(e)) return False except: LOG.exception('Failed to resolve parameters.') return False
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db_from_file(file_path=self._rule_file_path) trigger_instance_db = \ self._get_trigger_instance_db_from_file(file_path=self._trigger_instance_file_path) trigger_ref = ResourceReference.from_string_reference(trigger_instance_db['trigger']) trigger_db = TriggerDB(pack=trigger_ref.pack, name=trigger_ref.name, type=trigger_ref.ref) matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db]) matching_rules = matcher.get_matching_rules() return len(matching_rules) >= 1
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db() trigger_instance_db, trigger_db = self._get_trigger_instance_db() # The trigger check needs to be performed here as that is not performed # by RulesMatcher. if rule_db.trigger != trigger_db.ref: LOG.info('rule.trigger "%s" and trigger.ref "%s" do not match.', rule_db.trigger, trigger_db.ref) return False # Check if rule matches criteria. matcher = RulesMatcher( trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db], extra_info=True ) matching_rules = matcher.get_matching_rules() # Rule does not match so early exit. if len(matching_rules) < 1: return False # Check if rule can be enforced try: enforcer = RuleEnforcer(trigger_instance=trigger_instance_db, rule=rule_db) params = enforcer.get_resolved_parameters() LOG.info("Action parameters resolved to:") for param in six.iteritems(params): LOG.info("\t%s: %s", param[0], param[1]) return True except (UndefinedError, ValueError) as e: LOG.error("Failed to resolve parameters\n\tOriginal error : %s", str(e)) return False except: LOG.exception("Failed to resolve parameters.") return False
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db_from_file(file_path=self._rule_file_path) trigger_instance_db = \ self._get_trigger_instance_db_from_file(file_path=self._trigger_instance_file_path) trigger_ref = ResourceReference.from_string_reference( trigger_instance_db['trigger']) trigger_db = TriggerDB(pack=trigger_ref.pack, name=trigger_ref.name, type=trigger_ref.ref) matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db]) matching_rules = matcher.get_matching_rules() return len(matching_rules) >= 1
def get_matching_rules_for_trigger(self, trigger_instance): trigger = trigger_instance.trigger trigger_db = get_trigger_db_by_ref(trigger_instance.trigger) if not trigger_db: LOG.error('No matching trigger found in db for trigger instance %s.', trigger_instance) return None rules = get_rules_given_trigger(trigger=trigger) LOG.info('Found %d rules defined for trigger %s', len(rules), trigger_db.get_reference().ref) if len(rules) < 1: return rules matcher = RulesMatcher(trigger_instance=trigger_instance, trigger=trigger_db, rules=rules) matching_rules = matcher.get_matching_rules() LOG.info('Matched %s rule(s) for trigger_instance %s (trigger=%s)', len(matching_rules), trigger_instance['id'], trigger_db.ref) return matching_rules
def evaluate(self): """ Evaluate trigger instance against the rule. :return: ``True`` if the rule matches, ``False`` otherwise. :rtype: ``boolean`` """ rule_db = self._get_rule_db() trigger_instance_db, trigger_db = self._get_trigger_instance_db() # The trigger check needs to be performed here as that is not performed # by RulesMatcher. if rule_db.trigger != trigger_db.ref: LOG.info('rule.trigger "%s" and trigger.ref "%s" do not match.', rule_db.trigger, trigger_db.ref) return False # Check if rule matches criteria. matcher = RulesMatcher(trigger_instance=trigger_instance_db, trigger=trigger_db, rules=[rule_db], extra_info=True) matching_rules = matcher.get_matching_rules() # Rule does not match so early exit. if len(matching_rules) < 1: return False # Check if rule can be enforced enforcer = RuleEnforcer(trigger_instance=trigger_instance_db, rule=rule_db) runner_type_db = mock.Mock() runner_type_db.runner_parameters = {} action_db = mock.Mock() action_db.parameters = {} params = rule_db.action.parameters # pylint: disable=no-member context, additional_contexts = enforcer.get_action_execution_context( action_db=action_db, trace_context=None) # Note: We only return partially resolved parameters. # To be able to return all parameters we would need access to corresponding ActionDB, # RunnerTypeDB and ConfigDB object, but this would add a dependency on the database and the # tool is meant to be used standalone. try: params = enforcer.get_resolved_parameters( action_db=action_db, runnertype_db=runner_type_db, params=params, context=context, additional_contexts=additional_contexts) LOG.info('Action parameters resolved to:') for param in six.iteritems(params): LOG.info('\t%s: %s', param[0], param[1]) return True except (UndefinedError, ValueError) as e: LOG.error('Failed to resolve parameters\n\tOriginal error : %s', six.text_type(e)) return False except: LOG.exception('Failed to resolve parameters.') return False