X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=doc%2Fclasses%2FMCollective%2FAgents.html;fp=doc%2Fclasses%2FMCollective%2FAgents.html;h=82db7b4306e87d07523001ff8524680b0d7818be;hb=d1f1649ba43c5cbc43c4beb2380096ba051d646a;hp=0000000000000000000000000000000000000000;hpb=8a3fe7daeecccf43dd71c59371c5005400d35101;p=packages%2Fprecise%2Fmcollective.git diff --git a/doc/classes/MCollective/Agents.html b/doc/classes/MCollective/Agents.html new file mode 100644 index 0000000..82db7b4 --- /dev/null +++ b/doc/classes/MCollective/Agents.html @@ -0,0 +1,493 @@ + + + + +
+Class | +MCollective::Agents | +
In: | +
+
+ lib/mcollective/agents.rb
+
+ + |
+
Parent: | ++ Object + | +
+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. +
+ ++Get a list of agents that we have +
+ ++ # File lib/mcollective/agents.rb, line 145 +145: def self.agentlist +146: @@agents.keys +147: end ++
+ # 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 ++
+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 ++
+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 ++
+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 ++
+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 ++
+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 ++
+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 ++
+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 ++