1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
8 <title>Class: MCollective::Agents</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Class</strong></td>
53 <td class="class-name-in-header">MCollective::Agents</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/agents_rb.html">
59 lib/mcollective/agents.rb
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
73 <!-- banner header -->
75 <div id="bodyContent">
79 <div id="contextContent">
81 <div id="description">
83 A collection of agents, loads them, reloads them and dispatches messages to
84 them. It uses the <a href="PluginManager.html">PluginManager</a> to store,
85 load and manage instances of plugins.
93 <div id="method-list">
94 <h3 class="section-bar">Methods</h3>
96 <div class="name-list">
97 <a href="#M000487">activate_agent?</a>
98 <a href="#M000491">agentlist</a>
99 <a href="#M000486">class_for_agent</a>
100 <a href="#M000483">clear!</a>
101 <a href="#M000490">dispatch</a>
102 <a href="#M000488">findagentfile</a>
103 <a href="#M000489">include?</a>
104 <a href="#M000485">loadagent</a>
105 <a href="#M000484">loadagents</a>
106 <a href="#M000482">new</a>
124 <!-- if method_list -->
126 <h3 class="section-bar">Public Class methods</h3>
128 <div id="method-M000491" class="method-detail">
129 <a name="M000491"></a>
131 <div class="method-heading">
132 <a href="#M000491" class="method-signature">
133 <span class="method-name">agentlist</span><span class="method-args">()</span>
137 <div class="method-description">
139 Get a list of agents that we have
141 <p><a class="source-toggle" href="#"
142 onclick="toggleCode('M000491-source');return false;">[Source]</a></p>
143 <div class="method-source-code" id="M000491-source">
145 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 145</span>
146 145: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">agentlist</span>
147 146: <span class="ruby-ivar">@@agents</span>.<span class="ruby-identifier">keys</span>
148 147: <span class="ruby-keyword kw">end</span>
154 <div id="method-M000482" class="method-detail">
155 <a name="M000482"></a>
157 <div class="method-heading">
158 <a href="#M000482" class="method-signature">
159 <span class="method-name">new</span><span class="method-args">(agents = {})</span>
163 <div class="method-description">
164 <p><a class="source-toggle" href="#"
165 onclick="toggleCode('M000482-source');return false;">[Source]</a></p>
166 <div class="method-source-code" id="M000482-source">
168 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 5</span>
169 5: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">agents</span> = {})
170 6: <span class="ruby-ivar">@config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
171 7: <span class="ruby-identifier">raise</span> (<span class="ruby-value str">"Configuration has not been loaded, can't load agents"</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">configured</span>
173 9: <span class="ruby-ivar">@@agents</span> = <span class="ruby-identifier">agents</span>
175 11: <span class="ruby-identifier">loadagents</span>
176 12: <span class="ruby-keyword kw">end</span>
182 <h3 class="section-bar">Public Instance methods</h3>
184 <div id="method-M000487" class="method-detail">
185 <a name="M000487"></a>
187 <div class="method-heading">
188 <a href="#M000487" class="method-signature">
189 <span class="method-name">activate_agent?</span><span class="method-args">(agent)</span>
193 <div class="method-description">
195 Checks if a plugin should be activated by calling activate? on it if it
196 responds to that method else always activate it
198 <p><a class="source-toggle" href="#"
199 onclick="toggleCode('M000487-source');return false;">[Source]</a></p>
200 <div class="method-source-code" id="M000487-source">
202 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 85</span>
203 85: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">activate_agent?</span>(<span class="ruby-identifier">agent</span>)
204 86: <span class="ruby-identifier">klass</span> = <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-value str">"MCollective"</span>).<span class="ruby-identifier">const_get</span>(<span class="ruby-value str">"Agent"</span>).<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">agent</span>.<span class="ruby-identifier">capitalize</span>)
206 88: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">"activate?"</span>)
207 89: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">activate?</span>
208 90: <span class="ruby-keyword kw">else</span>
209 91: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"#{klass} does not have an activate? method, activating as default"</span>)
210 92: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
211 93: <span class="ruby-keyword kw">end</span>
212 94: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
213 95: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-node">"Agent activation check for #{agent} failed: #{e.class}: #{e}"</span>)
214 96: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
215 97: <span class="ruby-keyword kw">end</span>
221 <div id="method-M000486" class="method-detail">
222 <a name="M000486"></a>
224 <div class="method-heading">
225 <a href="#M000486" class="method-signature">
226 <span class="method-name">class_for_agent</span><span class="method-args">(agent)</span>
230 <div class="method-description">
232 Builds a class name string given a <a href="Agent.html">Agent</a> name
234 <p><a class="source-toggle" href="#"
235 onclick="toggleCode('M000486-source');return false;">[Source]</a></p>
236 <div class="method-source-code" id="M000486-source">
238 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 78</span>
239 78: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">class_for_agent</span>(<span class="ruby-identifier">agent</span>)
240 79: <span class="ruby-node">"MCollective::Agent::#{agent.capitalize}"</span>
241 80: <span class="ruby-keyword kw">end</span>
247 <div id="method-M000483" class="method-detail">
248 <a name="M000483"></a>
250 <div class="method-heading">
251 <a href="#M000483" class="method-signature">
252 <span class="method-name">clear!</span><span class="method-args">()</span>
256 <div class="method-description">
260 <p><a class="source-toggle" href="#"
261 onclick="toggleCode('M000483-source');return false;">[Source]</a></p>
262 <div class="method-source-code" id="M000483-source">
264 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 15</span>
265 15: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">clear!</span>
266 16: <span class="ruby-ivar">@@agents</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">agent</span><span class="ruby-operator">|</span>
267 17: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">delete</span> <span class="ruby-node">"#{agent}_agent"</span>
268 18: <span class="ruby-constant">Util</span>.<span class="ruby-identifier">unsubscribe</span>(<span class="ruby-constant">Util</span>.<span class="ruby-identifier">make_subscriptions</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:broadcast</span>))
269 19: <span class="ruby-keyword kw">end</span>
271 21: <span class="ruby-ivar">@@agents</span> = {}
272 22: <span class="ruby-keyword kw">end</span>
278 <div id="method-M000490" class="method-detail">
279 <a name="M000490"></a>
281 <div class="method-heading">
282 <a href="#M000490" class="method-signature">
283 <span class="method-name">dispatch</span><span class="method-args">(request, connection) {|replies| ...}</span>
287 <div class="method-description">
289 Dispatches a message to an agent, accepts a block that will get run if
290 there are any replies to process from the agent
292 <p><a class="source-toggle" href="#"
293 onclick="toggleCode('M000490-source');return false;">[Source]</a></p>
294 <div class="method-source-code" id="M000490-source">
296 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 118</span>
297 118: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">dispatch</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">connection</span>)
298 119: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Dispatching a message to agent #{request.agent}"</span>)
300 121: <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
301 122: <span class="ruby-keyword kw">begin</span>
302 123: <span class="ruby-identifier">agent</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">"#{request.agent}_agent"</span>]
304 125: <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">agent</span>.<span class="ruby-identifier">timeout</span>) <span class="ruby-keyword kw">do</span>
305 126: <span class="ruby-identifier">replies</span> = <span class="ruby-identifier">agent</span>.<span class="ruby-identifier">handlemsg</span>(<span class="ruby-identifier">request</span>.<span class="ruby-identifier">payload</span>, <span class="ruby-identifier">connection</span>)
307 128: <span class="ruby-comment cmt"># Agents can decide if they wish to reply or not,</span>
308 129: <span class="ruby-comment cmt"># returning nil will mean nothing goes back to the</span>
309 130: <span class="ruby-comment cmt"># requestor</span>
310 131: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">replies</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
311 132: <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">replies</span>)
312 133: <span class="ruby-keyword kw">end</span>
313 134: <span class="ruby-keyword kw">end</span>
314 135: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
315 136: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-node">"Timeout while handling message for #{request.agent}"</span>)
316 137: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
317 138: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">"Execution of #{request.agent} failed: #{e}"</span>)
318 139: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">"\n\t\t"</span>))
319 140: <span class="ruby-keyword kw">end</span>
320 141: <span class="ruby-keyword kw">end</span>
321 142: <span class="ruby-keyword kw">end</span>
327 <div id="method-M000488" class="method-detail">
328 <a name="M000488"></a>
330 <div class="method-heading">
331 <a href="#M000488" class="method-signature">
332 <span class="method-name">findagentfile</span><span class="method-args">(agentname)</span>
336 <div class="method-description">
338 searches the libdirs for agents
340 <p><a class="source-toggle" href="#"
341 onclick="toggleCode('M000488-source');return false;">[Source]</a></p>
342 <div class="method-source-code" id="M000488-source">
344 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 100</span>
345 100: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">findagentfile</span>(<span class="ruby-identifier">agentname</span>)
346 101: <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">libdir</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">libdir</span><span class="ruby-operator">|</span>
347 102: <span class="ruby-identifier">agentfile</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>([<span class="ruby-identifier">libdir</span>, <span class="ruby-value str">"mcollective"</span>, <span class="ruby-value str">"agent"</span>, <span class="ruby-node">"#{agentname}.rb"</span>])
348 103: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">agentfile</span>)
349 104: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Found #{agentname} at #{agentfile}"</span>)
350 105: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">agentfile</span>
351 106: <span class="ruby-keyword kw">end</span>
352 107: <span class="ruby-keyword kw">end</span>
353 108: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
354 109: <span class="ruby-keyword kw">end</span>
360 <div id="method-M000489" class="method-detail">
361 <a name="M000489"></a>
363 <div class="method-heading">
364 <a href="#M000489" class="method-signature">
365 <span class="method-name">include?</span><span class="method-args">(agentname)</span>
369 <div class="method-description">
371 Determines if we have an agent with a certain name
373 <p><a class="source-toggle" href="#"
374 onclick="toggleCode('M000489-source');return false;">[Source]</a></p>
375 <div class="method-source-code" id="M000489-source">
377 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 112</span>
378 112: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agentname</span>)
379 113: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-node">"#{agentname}_agent"</span>)
380 114: <span class="ruby-keyword kw">end</span>
386 <div id="method-M000485" class="method-detail">
387 <a name="M000485"></a>
389 <div class="method-heading">
390 <a href="#M000485" class="method-signature">
391 <span class="method-name">loadagent</span><span class="method-args">(agentname)</span>
395 <div class="method-description">
397 Loads a specified agent from disk if available
399 <p><a class="source-toggle" href="#"
400 onclick="toggleCode('M000485-source');return false;">[Source]</a></p>
401 <div class="method-source-code" id="M000485-source">
403 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 42</span>
404 42: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">loadagent</span>(<span class="ruby-identifier">agentname</span>)
405 43: <span class="ruby-identifier">agentfile</span> = <span class="ruby-identifier">findagentfile</span>(<span class="ruby-identifier">agentname</span>)
406 44: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">agentfile</span>
407 45: <span class="ruby-identifier">classname</span> = <span class="ruby-identifier">class_for_agent</span>(<span class="ruby-identifier">agentname</span>)
409 47: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-node">"#{agentname}_agent"</span>)
411 49: <span class="ruby-keyword kw">begin</span>
412 50: <span class="ruby-identifier">single_instance</span> = [<span class="ruby-value str">"registration"</span>, <span class="ruby-value str">"discovery"</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agentname</span>)
414 52: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">classname</span>)
416 54: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">activate_agent?</span>(<span class="ruby-identifier">agentname</span>)
417 55: <span class="ruby-constant">PluginManager</span> <span class="ruby-operator"><<</span> {<span class="ruby-identifier">:type</span> =<span class="ruby-operator">></span> <span class="ruby-node">"#{agentname}_agent"</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">classname</span>, <span class="ruby-identifier">:single_instance</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">single_instance</span>}
419 57: <span class="ruby-comment cmt"># Attempt to instantiate the agent once so any validation and hooks get run</span>
420 58: <span class="ruby-comment cmt"># this does a basic sanity check on the agent as a whole, if this fails it</span>
421 59: <span class="ruby-comment cmt"># will be removed from the plugin list</span>
422 60: <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">"#{agentname}_agent"</span>]
424 62: <span class="ruby-constant">Util</span>.<span class="ruby-identifier">subscribe</span>(<span class="ruby-constant">Util</span>.<span class="ruby-identifier">make_subscriptions</span>(<span class="ruby-identifier">agentname</span>, <span class="ruby-identifier">:broadcast</span>)) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@@agents</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agentname</span>)
426 64: <span class="ruby-ivar">@@agents</span>[<span class="ruby-identifier">agentname</span>] = {<span class="ruby-identifier">:file</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">agentfile</span>}
427 65: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
428 66: <span class="ruby-keyword kw">else</span>
429 67: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Not activating agent #{agentname} due to agent policy in activate? method"</span>)
430 68: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
431 69: <span class="ruby-keyword kw">end</span>
432 70: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
433 71: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">"Loading agent #{agentname} failed: #{e}"</span>)
434 72: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-node">"#{agentname}_agent"</span>)
435 73: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
436 74: <span class="ruby-keyword kw">end</span>
437 75: <span class="ruby-keyword kw">end</span>
443 <div id="method-M000484" class="method-detail">
444 <a name="M000484"></a>
446 <div class="method-heading">
447 <a href="#M000484" class="method-signature">
448 <span class="method-name">loadagents</span><span class="method-args">()</span>
452 <div class="method-description">
454 Loads all agents from disk
456 <p><a class="source-toggle" href="#"
457 onclick="toggleCode('M000484-source');return false;">[Source]</a></p>
458 <div class="method-source-code" id="M000484-source">
460 <span class="ruby-comment cmt"># File lib/mcollective/agents.rb, line 25</span>
461 25: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">loadagents</span>
462 26: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">"Reloading all agents from disk"</span>)
464 28: <span class="ruby-identifier">clear!</span>
466 30: <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">libdir</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">libdir</span><span class="ruby-operator">|</span>
467 31: <span class="ruby-identifier">agentdir</span> = <span class="ruby-node">"#{libdir}/mcollective/agent"</span>
468 32: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">agentdir</span>)
470 34: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">agentdir</span>).<span class="ruby-identifier">grep</span>(<span class="ruby-regexp re">/\.rb$/</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">agent</span><span class="ruby-operator">|</span>
471 35: <span class="ruby-identifier">agentname</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">basename</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-value str">".rb"</span>)
472 36: <span class="ruby-identifier">loadagent</span>(<span class="ruby-identifier">agentname</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-node">"#{agentname}_agent"</span>)
473 37: <span class="ruby-keyword kw">end</span>
474 38: <span class="ruby-keyword kw">end</span>
475 39: <span class="ruby-keyword kw">end</span>
488 <div id="validator-badges">
489 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>