Parent

Class Index [+]

Quicksearch

MCollective::Agents

A collection of agents, loads them, reloads them and dispatches messages to them. It uses the PluginManager to store, load and manage instances of plugins.

Public Class Methods

agentlist() click to toggle source

Get a list of agents that we have

     # File lib/mcollective/agents.rb, line 145
145:     def self.agentlist
146:       @@agents.keys
147:     end
new(agents = {}) click to toggle source

(Not documented)

    # File lib/mcollective/agents.rb, line 5
 5:     def initialize(agents = {})
 6:       @config = Config.instance
 7:       raise ("Configuration has not been loaded, can't load agents") unless @config.configured
 8: 
 9:       @@agents = agents
10: 
11:       loadagents
12:     end

Public Instance Methods

activate_agent?(agent) click to toggle source

Checks if a plugin should be activated by calling activate? on it if it responds to that method else always activate it

    # File lib/mcollective/agents.rb, line 85
85:     def activate_agent?(agent)
86:       klass = Kernel.const_get("MCollective").const_get("Agent").const_get(agent.capitalize)
87: 
88:       if klass.respond_to?("activate?")
89:         return klass.activate?
90:       else
91:         Log.debug("#{klass} does not have an activate? method, activating as default")
92:         return true
93:       end
94:     rescue Exception => e
95:       Log.warn("Agent activation check for #{agent} failed: #{e.class}: #{e}")
96:       return false
97:     end
class_for_agent(agent) click to toggle source

Builds a class name string given a Agent name

    # File lib/mcollective/agents.rb, line 78
78:     def class_for_agent(agent)
79:       "MCollective::Agent::#{agent.capitalize}"
80:     end
clear!() click to toggle source

Deletes all agents

    # File lib/mcollective/agents.rb, line 15
15:     def clear!
16:       @@agents.each_key do |agent|
17:         PluginManager.delete "#{agent}_agent"
18:         Util.unsubscribe(Util.make_subscriptions(agent, :broadcast))
19:       end
20: 
21:       @@agents = {}
22:     end
dispatch(request, connection) click to toggle source

Dispatches a message to an agent, accepts a block that will get run if there are any replies to process from the agent

     # File lib/mcollective/agents.rb, line 118
118:     def dispatch(request, connection)
119:       Log.debug("Dispatching a message to agent #{request.agent}")
120: 
121:       Thread.new do
122:         begin
123:           agent = PluginManager["#{request.agent}_agent"]
124: 
125:           Timeout::timeout(agent.timeout) do
126:             replies = agent.handlemsg(request.payload, connection)
127: 
128:             # Agents can decide if they wish to reply or not,
129:             # returning nil will mean nothing goes back to the
130:             # requestor
131:             unless replies == nil
132:               yield(replies)
133:             end
134:           end
135:         rescue Timeout::Error => e
136:           Log.warn("Timeout while handling message for #{request.agent}")
137:         rescue Exception => e
138:           Log.error("Execution of #{request.agent} failed: #{e}")
139:           Log.error(e.backtrace.join("\n\t\t"))
140:         end
141:       end
142:     end
findagentfile(agentname) click to toggle source

searches the libdirs for agents

     # File lib/mcollective/agents.rb, line 100
100:     def findagentfile(agentname)
101:       @config.libdir.each do |libdir|
102:         agentfile = File.join([libdir, "mcollective", "agent", "#{agentname}.rb"])
103:         if File.exist?(agentfile)
104:           Log.debug("Found #{agentname} at #{agentfile}")
105:           return agentfile
106:         end
107:       end
108:       return false
109:     end
include?(agentname) click to toggle source

Determines if we have an agent with a certain name

     # File lib/mcollective/agents.rb, line 112
112:     def include?(agentname)
113:       PluginManager.include?("#{agentname}_agent")
114:     end
loadagent(agentname) click to toggle source

Loads a specified agent from disk if available

    # File lib/mcollective/agents.rb, line 42
42:     def loadagent(agentname)
43:       agentfile = findagentfile(agentname)
44:       return false unless agentfile
45:       classname = class_for_agent(agentname)
46: 
47:       PluginManager.delete("#{agentname}_agent")
48: 
49:       begin
50:         single_instance = ["registration", "discovery"].include?(agentname)
51: 
52:         PluginManager.loadclass(classname)
53: 
54:         if activate_agent?(agentname)
55:           PluginManager << {:type => "#{agentname}_agent", :class => classname, :single_instance => single_instance}
56: 
57:           # Attempt to instantiate the agent once so any validation and hooks get run
58:           # this does a basic sanity check on the agent as a whole, if this fails it
59:           # will be removed from the plugin list
60:           PluginManager["#{agentname}_agent"]
61: 
62:           Util.subscribe(Util.make_subscriptions(agentname, :broadcast)) unless @@agents.include?(agentname)
63: 
64:           @@agents[agentname] = {:file => agentfile}
65:           return true
66:         else
67:           Log.debug("Not activating agent #{agentname} due to agent policy in activate? method")
68:           return false
69:         end
70:       rescue Exception => e
71:         Log.error("Loading agent #{agentname} failed: #{e}")
72:         PluginManager.delete("#{agentname}_agent")
73:         return false
74:       end
75:     end
loadagents() click to toggle source

Loads all agents from disk

    # File lib/mcollective/agents.rb, line 25
25:     def loadagents
26:       Log.debug("Reloading all agents from disk")
27: 
28:       clear!
29: 
30:       @config.libdir.each do |libdir|
31:         agentdir = "#{libdir}/mcollective/agent"
32:         next unless File.directory?(agentdir)
33: 
34:         Dir.new(agentdir).grep(/\.rb$/).each do |agent|
35:           agentname = File.basename(agent, ".rb")
36:           loadagent(agentname) unless PluginManager.include?("#{agentname}_agent")
37:         end
38:       end
39:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.