From 9462400dd4590cbbc72c952a193f791a98a35c8f Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Fri, 25 Apr 2014 23:47:10 -0500 Subject: [PATCH] keep_event can be set to true to cause the incoming event to be re-emitted, with message merged in when present --- app/models/agents/trigger_agent.rb | 23 ++++++++-- spec/models/agents/trigger_agent_spec.rb | 58 +++++++++++++++++++++++- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/app/models/agents/trigger_agent.rb b/app/models/agents/trigger_agent.rb index 8177ae522b..7be9dd813a 100644 --- a/app/models/agents/trigger_agent.rb +++ b/app/models/agents/trigger_agent.rb @@ -15,6 +15,8 @@ class TriggerAgent < Agent All rules must match for the Agent to match. The resulting Event will have a payload message of `message`. You can include extractions in the message, for example: `I saw a bar of: ` + Set `keep_event` to `true` if you'd like to re-emit the incoming event, optionally merged with 'message' when provided. + Set `expected_receive_period_in_days` to the maximum amount of time that you'd expect to pass between Events being received by this Agent. MD @@ -25,15 +27,20 @@ class TriggerAgent < Agent MD def validate_options - unless options['expected_receive_period_in_days'].present? && options['message'].present? && options['rules'].present? && + unless options['expected_receive_period_in_days'].present? && options['rules'].present? && options['rules'].all? { |rule| rule['type'].present? && VALID_COMPARISON_TYPES.include?(rule['type']) && rule['value'].present? && rule['path'].present? } errors.add(:base, "expected_receive_period_in_days, message, and rules, with a type, value, and path for every rule, are required") end + + errors.add(:base, "message is required unless 'keep_event' is 'true'") unless options['message'].present? || keep_event? + + errors.add(:base, "keep_event, when present, must be 'true' or 'false'") unless options['keep_event'].blank? || %w[true false].include?(options['keep_event']) end def default_options { 'expected_receive_period_in_days' => "2", + 'keep_event' => 'false', 'rules' => [{ 'type' => "regex", 'value' => "foo\\d+bar", @@ -79,10 +86,20 @@ def receive(incoming_events) end if match - create_event :payload => { 'message' => make_message(event[:payload]) } # Maybe this should include the - # original event as well? + if keep_event? + payload = event.payload.dup + payload['message'] = make_message(event[:payload]) if options['message'].present? + else + payload = { 'message' => make_message(event[:payload]) } + end + + create_event :payload => payload end end end + + def keep_event? + options['keep_event'] == 'true' + end end end \ No newline at end of file diff --git a/spec/models/agents/trigger_agent_spec.rb b/spec/models/agents/trigger_agent_spec.rb index 498c00ea08..2688e49413 100644 --- a/spec/models/agents/trigger_agent_spec.rb +++ b/spec/models/agents/trigger_agent_spec.rb @@ -30,9 +30,32 @@ @checker.should be_valid end - it "should validate presence of options" do + it "should validate presence of message" do @checker.options['message'] = nil @checker.should_not be_valid + + @checker.options['message'] = '' + @checker.should_not be_valid + end + + it "should be valid without a message when 'keep_event' is set" do + @checker.options['keep_event'] = 'true' + @checker.options['message'] = '' + @checker.should be_valid + end + + it "if present, 'keep_event' must equal true or false" do + @checker.options['keep_event'] = 'true' + @checker.should be_valid + + @checker.options['keep_event'] = 'false' + @checker.should be_valid + + @checker.options['keep_event'] = '' + @checker.should be_valid + + @checker.options['keep_event'] = 'tralse' + @checker.should_not be_valid end it "should validate the three fields in each rule" do @@ -278,5 +301,38 @@ @checker.receive([@event]) }.should_not change { Event.count } end + + describe "when 'keep_event' is true" do + before do + @checker.options['keep_event'] = 'true' + @event.payload['foo']['bar']['baz'] = "5" + @checker.options['rules'].first['type'] = "field "I saw '5' from Joe") + end + end end end \ No newline at end of file