Merge pull request #570 from knu/commander_agent

Add CommanderAgent, which controls other agents on a schedule or incoming event.

Akinori MUSHA %!s(int64=10) %!d(string=hace) años
padre
commit
d49b4dfe3f
Se han modificado 2 ficheros con 89 adiciones y 0 borrados
  1. 47 0
      app/models/agents/commander_agent.rb
  2. 42 0
      spec/models/agents/commander_agent_spec.rb

+ 47 - 0
app/models/agents/commander_agent.rb

@@ -0,0 +1,47 @@
1
+module Agents
2
+  class CommanderAgent < Agent
3
+    include AgentControllerConcern
4
+
5
+    cannot_create_events!
6
+
7
+    description <<-MD
8
+      This agent is triggered by schedule or an incoming event and commands other agents ("targets") to run, disable or enable themselves.
9
+
10
+      # Action types
11
+
12
+      Set `action` to one of the action types below:
13
+
14
+      * `run`: Target Agents are run when this agent is triggered.
15
+
16
+      * `disable`: Target Agents are disabled (if not) when this agent is triggered.
17
+
18
+      * `enable`: Target Agents are enabled (if not) when this agent is triggered.
19
+
20
+      Here's a tip: you can use Liquid templating to dynamically determine the action type.  For example:
21
+
22
+      - To create a CommanderAgent that receives an event from WeatherAgent every morning to kick an agent flow that is only useful in a nice weather, try this: `{% if conditions contains 'Sunny' or conditions contains 'Cloudy' %}run{% endif %}`
23
+
24
+      - Likewise, if you have a scheduled agent flow specially crafted for rainy days, try this: `{% if conditions contains 'Rain' %}enable{% else %}disabled{% endif %}`
25
+
26
+      # Targets
27
+
28
+      Select Agents that you want to control from this CommanderAgent.
29
+    MD
30
+
31
+    def working?
32
+      true
33
+    end
34
+
35
+    def check!
36
+      control!
37
+    end
38
+
39
+    def receive(incoming_events)
40
+      incoming_events.each do |event|
41
+        interpolate_with(event) do
42
+          control!
43
+        end
44
+      end
45
+    end
46
+  end
47
+end

+ 42 - 0
spec/models/agents/commander_agent_spec.rb

@@ -0,0 +1,42 @@
1
+require 'spec_helper'
2
+
3
+describe Agents::CommanderAgent do
4
+  let(:valid_params) {
5
+    {
6
+      name: 'Example',
7
+      schedule: 'every_1h',
8
+      options: {
9
+        'action' => 'run',
10
+      },
11
+    }
12
+  }
13
+
14
+  let(:agent) {
15
+    described_class.create!(valid_params) { |agent|
16
+      agent.user = users(:bob)
17
+    }
18
+  }
19
+
20
+  it_behaves_like AgentControllerConcern
21
+
22
+  describe "check!" do
23
+    it "should command targets" do
24
+      stub(agent).control!.once { nil }
25
+      agent.check!
26
+    end
27
+  end
28
+
29
+  describe "receive_events" do
30
+    it "should command targets" do
31
+      stub(agent).control!.once { nil }
32
+
33
+      event = Event.new
34
+      event.agent = agents(:bob_rain_notifier_agent)
35
+      event.payload = {
36
+        'url' => 'http://xkcd.com',
37
+        'link' => 'Random',
38
+      }
39
+      agent.receive([event])
40
+    end
41
+  end
42
+end