Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / DDL / AgentDDL.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html 
3      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8   <title>Class: MCollective::DDL::AgentDDL</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">
13   // <![CDATA[
14
15   function popupCode( url ) {
16     window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17   }
18
19   function toggleCode( id ) {
20     if ( document.getElementById )
21       elem = document.getElementById( id );
22     else if ( document.all )
23       elem = eval( "document.all." + id );
24     else
25       return false;
26
27     elemStyle = elem.style;
28     
29     if ( elemStyle.display != "block" ) {
30       elemStyle.display = "block"
31     } else {
32       elemStyle.display = "none"
33     }
34
35     return true;
36   }
37   
38   // Make codeblocks hidden by default
39   document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40   
41   // ]]>
42   </script>
43
44 </head>
45 <body>
46
47
48
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::DDL::AgentDDL</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../../files/lib/mcollective/ddl/agentddl_rb.html">
59                 lib/mcollective/ddl/agentddl.rb
60                 </a>
61         <br />
62             </td>
63         </tr>
64
65         <tr class="top-aligned-row">
66             <td><strong>Parent:</strong></td>
67             <td>
68                 <a href="Base.html">
69                 Base
70                </a>
71             </td>
72         </tr>
73         </table>
74     </div>
75   <!-- banner header -->
76
77   <div id="bodyContent">
78
79
80
81   <div id="contextContent">
82
83     <div id="description">
84       <p>
85 A <a href="../DDL.html">DDL</a> class specific to agent plugins.
86 </p>
87 <p>
88 A full <a href="../DDL.html">DDL</a> can be seen below with all the
89 possible bells and whistles present.
90 </p>
91 <p>
92 metadata :name =&gt; &quot;Utilities and Helpers for SimpleRPC <a
93 href="../Agents.html">Agents</a>&quot;,
94 </p>
95 <pre>
96             :description =&gt; &quot;General helpful actions that expose stats and internals to SimpleRPC clients&quot;,
97             :author      =&gt; &quot;R.I.Pienaar &lt;rip@devco.net&gt;&quot;,
98             :license     =&gt; &quot;Apache License, Version 2.0&quot;,
99             :version     =&gt; &quot;1.0&quot;,
100             :url         =&gt; &quot;http://marionette-collective.org/&quot;,
101             :timeout     =&gt; 10
102 </pre>
103 <p>
104 <a href="AgentDDL.html#M000183">action</a> &quot;get_fact&quot;,
105 :description =&gt; &quot;Retrieve a single fact from the fact store&quot;
106 do
107 </p>
108 <pre>
109      display :always
110
111      input :fact,
112            :prompt      =&gt; &quot;The name of the fact&quot;,
113            :description =&gt; &quot;The fact to retrieve&quot;,
114            :type        =&gt; :string,
115            :validation  =&gt; '^[\w\-\.]+$',
116            :optional    =&gt; false,
117            :maxlength   =&gt; 40,
118            :default     =&gt; &quot;fqdn&quot;
119
120      output :fact,
121             :description =&gt; &quot;The name of the fact being returned&quot;,
122             :display_as  =&gt; &quot;Fact&quot;
123
124      output :value,
125             :description =&gt; &quot;The value of the fact&quot;,
126             :display_as  =&gt; &quot;Value&quot;,
127             :default     =&gt; &quot;&quot;
128
129     summarize do
130         aggregate summary(:value)
131     end
132 </pre>
133 <p>
134 end
135 </p>
136
137     </div>
138
139
140    </div>
141
142     <div id="method-list">
143       <h3 class="section-bar">Methods</h3>
144
145       <div class="name-list">
146       <a href="#M000183">action</a>&nbsp;&nbsp;
147       <a href="#M000188">action_interface</a>&nbsp;&nbsp;
148       <a href="#M000189">actions</a>&nbsp;&nbsp;
149       <a href="#M000181">aggregate</a>&nbsp;&nbsp;
150       <a href="#M000182">display</a>&nbsp;&nbsp;
151       <a href="#M000179">input</a>&nbsp;&nbsp;
152       <a href="#M000185">is_function?</a>&nbsp;&nbsp;
153       <a href="#M000184">method_missing</a>&nbsp;&nbsp;
154       <a href="#M000178">new</a>&nbsp;&nbsp;
155       <a href="#M000186">set_default_input_arguments</a>&nbsp;&nbsp;
156       <a href="#M000180">summarize</a>&nbsp;&nbsp;
157       <a href="#M000187">validate_rpc_request</a>&nbsp;&nbsp;
158       </div>
159     </div>
160
161   </div>
162
163
164     <!-- if includes -->
165
166     <div id="section">
167
168
169
170
171
172       
173
174
175     <!-- if method_list -->
176     <div id="methods">
177       <h3 class="section-bar">Public Class methods</h3>
178
179       <div id="method-M000178" class="method-detail">
180         <a name="M000178"></a>
181
182         <div class="method-heading">
183           <a href="#M000178" class="method-signature">
184           <span class="method-name">new</span><span class="method-args">(plugin, plugintype=:agent, loadddl=true)</span>
185           </a>
186         </div>
187       
188         <div class="method-description">
189           <p><a class="source-toggle" href="#"
190             onclick="toggleCode('M000178-source');return false;">[Source]</a></p>
191           <div class="method-source-code" id="M000178-source">
192 <pre>
193     <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 41</span>
194 41:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">plugin</span>, <span class="ruby-identifier">plugintype</span>=<span class="ruby-identifier">:agent</span>, <span class="ruby-identifier">loadddl</span>=<span class="ruby-keyword kw">true</span>)
195 42:         <span class="ruby-ivar">@process_aggregate_functions</span> = <span class="ruby-keyword kw">nil</span>
196 43: 
197 44:         <span class="ruby-keyword kw">super</span>
198 45:       <span class="ruby-keyword kw">end</span>
199 </pre>
200           </div>
201         </div>
202       </div>
203
204       <h3 class="section-bar">Public Instance methods</h3>
205
206       <div id="method-M000183" class="method-detail">
207         <a name="M000183"></a>
208
209         <div class="method-heading">
210           <a href="#M000183" class="method-signature">
211           <span class="method-name">action</span><span class="method-args">(name, input, &amp;block)</span>
212           </a>
213         </div>
214       
215         <div class="method-description">
216           <p>
217 Creates the definition for an <a href="AgentDDL.html#M000183">action</a>,
218 you can nest <a href="AgentDDL.html#M000179">input</a> definitions inside
219 the <a href="AgentDDL.html#M000183">action</a> to attach inputs and
220 validation to the <a href="AgentDDL.html#M000189">actions</a>
221 </p>
222 <pre>
223    action &quot;status&quot;, :description =&gt; &quot;Restarts a Service&quot; do
224       display :always
225
226       input  &quot;service&quot;,
227              :prompt      =&gt; &quot;Service Action&quot;,
228              :description =&gt; &quot;The action to perform&quot;,
229              :type        =&gt; :list,
230              :optional    =&gt; true,
231              :list        =&gt; [&quot;start&quot;, &quot;stop&quot;, &quot;restart&quot;, &quot;status&quot;]
232
233       output &quot;status&quot;,
234              :description =&gt; &quot;The status of the service after the action&quot;
235
236    end
237 </pre>
238           <p><a class="source-toggle" href="#"
239             onclick="toggleCode('M000183-source');return false;">[Source]</a></p>
240           <div class="method-source-code" id="M000183-source">
241 <pre>
242      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 112</span>
243 112:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">action</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">input</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
244 113:         <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Action needs a :description property&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">input</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:description</span>)
245 114: 
246 115:         <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@entities</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">name</span>)
247 116:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>] = {}
248 117:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:action</span>] = <span class="ruby-identifier">name</span>
249 118:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:input</span>] = {}
250 119:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:output</span>] = {}
251 120:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:display</span>] = <span class="ruby-identifier">:failed</span>
252 121:           <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:description</span>] = <span class="ruby-identifier">input</span>[<span class="ruby-identifier">:description</span>]
253 122:         <span class="ruby-keyword kw">end</span>
254 123: 
255 124:         <span class="ruby-comment cmt"># if a block is passed it might be creating input methods, call it</span>
256 125:         <span class="ruby-comment cmt"># we set @current_entity so the input block can know what its talking</span>
257 126:         <span class="ruby-comment cmt"># to, this is probably an epic hack, need to improve.</span>
258 127:         <span class="ruby-ivar">@current_entity</span> = <span class="ruby-identifier">name</span>
259 128:         <span class="ruby-identifier">block</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
260 129:         <span class="ruby-ivar">@current_entity</span> = <span class="ruby-keyword kw">nil</span>
261 130:       <span class="ruby-keyword kw">end</span>
262 </pre>
263           </div>
264         </div>
265       </div>
266
267       <div id="method-M000188" class="method-detail">
268         <a name="M000188"></a>
269
270         <div class="method-heading">
271           <a href="#M000188" class="method-signature">
272           <span class="method-name">action_interface</span><span class="method-args">(name)</span>
273           </a>
274         </div>
275       
276         <div class="method-description">
277           <p>
278 Returns the interface for a specific <a
279 href="AgentDDL.html#M000183">action</a>
280 </p>
281           <p><a class="source-toggle" href="#"
282             onclick="toggleCode('M000188-source');return false;">[Source]</a></p>
283           <div class="method-source-code" id="M000188-source">
284 <pre>
285      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 198</span>
286 198:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">action_interface</span>(<span class="ruby-identifier">name</span>)
287 199:         <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">name</span>] <span class="ruby-operator">||</span> {}
288 200:       <span class="ruby-keyword kw">end</span>
289 </pre>
290           </div>
291         </div>
292       </div>
293
294       <div id="method-M000189" class="method-detail">
295         <a name="M000189"></a>
296
297         <div class="method-heading">
298           <a href="#M000189" class="method-signature">
299           <span class="method-name">actions</span><span class="method-args">()</span>
300           </a>
301         </div>
302       
303         <div class="method-description">
304           <p>
305 Returns an array of <a href="AgentDDL.html#M000189">actions</a> this agent
306 support
307 </p>
308           <p><a class="source-toggle" href="#"
309             onclick="toggleCode('M000189-source');return false;">[Source]</a></p>
310           <div class="method-source-code" id="M000189-source">
311 <pre>
312      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 203</span>
313 203:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">actions</span>
314 204:         <span class="ruby-ivar">@entities</span>.<span class="ruby-identifier">keys</span>
315 205:       <span class="ruby-keyword kw">end</span>
316 </pre>
317           </div>
318         </div>
319       </div>
320
321       <div id="method-M000181" class="method-detail">
322         <a name="M000181"></a>
323
324         <div class="method-heading">
325           <a href="#M000181" class="method-signature">
326           <span class="method-name">aggregate</span><span class="method-args">(function, format = {:format =&gt; nil})</span>
327           </a>
328         </div>
329       
330         <div class="method-description">
331           <p>
332 Sets the <a href="AgentDDL.html#M000181">aggregate</a> array for the given
333 <a href="AgentDDL.html#M000183">action</a>
334 </p>
335           <p><a class="source-toggle" href="#"
336             onclick="toggleCode('M000181-source');return false;">[Source]</a></p>
337           <div class="method-source-code" id="M000181-source">
338 <pre>
339     <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 70</span>
340 70:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">aggregate</span>(<span class="ruby-identifier">function</span>, <span class="ruby-identifier">format</span> = {<span class="ruby-identifier">:format</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>})
341 71:         <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC28</span>, <span class="ruby-value str">&quot;Formats supplied to aggregation functions should be a hash&quot;</span>, <span class="ruby-identifier">:error</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">format</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Hash</span>)
342 72:         <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC27</span>, <span class="ruby-value str">&quot;Formats supplied to aggregation functions must have a :format key&quot;</span>, <span class="ruby-identifier">:error</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">format</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:format</span>)
343 73:         <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC26</span>, <span class="ruby-value str">&quot;Functions supplied to aggregate should be a hash&quot;</span>, <span class="ruby-identifier">:error</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">function</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Hash</span>)
344 74: 
345 75:         <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">function</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:args</span>)) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">function</span>[<span class="ruby-identifier">:args</span>]
346 76:           <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC25</span>, <span class="ruby-value str">&quot;aggregate method for action '%{action}' missing a function parameter&quot;</span>, <span class="ruby-identifier">:error</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">entities</span>[<span class="ruby-ivar">@current_entity</span>][<span class="ruby-identifier">:action</span>])
347 77:         <span class="ruby-keyword kw">end</span>
348 78: 
349 79:         <span class="ruby-identifier">entities</span>[<span class="ruby-ivar">@current_entity</span>][<span class="ruby-identifier">:aggregate</span>] <span class="ruby-operator">||=</span> []
350 80:         <span class="ruby-identifier">entities</span>[<span class="ruby-ivar">@current_entity</span>][<span class="ruby-identifier">:aggregate</span>] <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">format</span>[<span class="ruby-identifier">:format</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-value">? </span><span class="ruby-identifier">function</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">function</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">format</span>))
351 81:       <span class="ruby-keyword kw">end</span>
352 </pre>
353           </div>
354         </div>
355       </div>
356
357       <div id="method-M000182" class="method-detail">
358         <a name="M000182"></a>
359
360         <div class="method-heading">
361           <a href="#M000182" class="method-signature">
362           <span class="method-name">display</span><span class="method-args">(pref)</span>
363           </a>
364         </div>
365       
366         <div class="method-description">
367           <p>
368 Sets the <a href="AgentDDL.html#M000182">display</a> preference to either
369 :ok, :failed, :flatten or :always operates on <a
370 href="AgentDDL.html#M000183">action</a> level
371 </p>
372           <p><a class="source-toggle" href="#"
373             onclick="toggleCode('M000182-source');return false;">[Source]</a></p>
374           <div class="method-source-code" id="M000182-source">
375 <pre>
376     <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 85</span>
377 85:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">display</span>(<span class="ruby-identifier">pref</span>)
378 86:         <span class="ruby-comment cmt"># defaults to old behavior, complain if its supplied and invalid</span>
379 87:         <span class="ruby-keyword kw">unless</span> [<span class="ruby-identifier">:ok</span>, <span class="ruby-identifier">:failed</span>, <span class="ruby-identifier">:flatten</span>, <span class="ruby-identifier">:always</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">pref</span>)
380 88:           <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Display preference #{pref} is not valid, should be :ok, :failed, :flatten or :always&quot;</span>
381 89:         <span class="ruby-keyword kw">end</span>
382 90: 
383 91:         <span class="ruby-identifier">action</span> = <span class="ruby-ivar">@current_entity</span>
384 92:         <span class="ruby-ivar">@entities</span>[<span class="ruby-identifier">action</span>][<span class="ruby-identifier">:display</span>] = <span class="ruby-identifier">pref</span>
385 93:       <span class="ruby-keyword kw">end</span>
386 </pre>
387           </div>
388         </div>
389       </div>
390
391       <div id="method-M000179" class="method-detail">
392         <a name="M000179"></a>
393
394         <div class="method-heading">
395           <a href="#M000179" class="method-signature">
396           <span class="method-name">input</span><span class="method-args">(argument, properties)</span>
397           </a>
398         </div>
399       
400         <div class="method-description">
401           <p><a class="source-toggle" href="#"
402             onclick="toggleCode('M000179-source');return false;">[Source]</a></p>
403           <div class="method-source-code" id="M000179-source">
404 <pre>
405     <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 47</span>
406 47:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">input</span>(<span class="ruby-identifier">argument</span>, <span class="ruby-identifier">properties</span>)
407 48:         <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Input needs a :optional property&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">properties</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:optional</span>)
408 49: 
409 50:         <span class="ruby-keyword kw">super</span>
410 51:       <span class="ruby-keyword kw">end</span>
411 </pre>
412           </div>
413         </div>
414       </div>
415
416       <div id="method-M000185" class="method-detail">
417         <a name="M000185"></a>
418
419         <div class="method-heading">
420           <a href="#M000185" class="method-signature">
421           <span class="method-name">is_function?</span><span class="method-args">(method_name)</span>
422           </a>
423         </div>
424       
425         <div class="method-description">
426           <p>
427 Checks if a method name matches a <a
428 href="AgentDDL.html#M000181">aggregate</a> plugin. This is used by method
429 missing so that we dont greedily assume that every <a
430 href="AgentDDL.html#M000184">method_missing</a> call in an agent ddl has
431 hit a <a href="AgentDDL.html#M000181">aggregate</a> function.
432 </p>
433           <p><a class="source-toggle" href="#"
434             onclick="toggleCode('M000185-source');return false;">[Source]</a></p>
435           <div class="method-source-code" id="M000185-source">
436 <pre>
437      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 146</span>
438 146:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">is_function?</span>(<span class="ruby-identifier">method_name</span>)
439 147:         <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">find</span>(<span class="ruby-value str">&quot;aggregate&quot;</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">method_name</span>.<span class="ruby-identifier">to_s</span>)
440 148:       <span class="ruby-keyword kw">end</span>
441 </pre>
442           </div>
443         </div>
444       </div>
445
446       <div id="method-M000184" class="method-detail">
447         <a name="M000184"></a>
448
449         <div class="method-heading">
450           <a href="#M000184" class="method-signature">
451           <span class="method-name">method_missing</span><span class="method-args">(name, *args, &amp;block)</span>
452           </a>
453         </div>
454       
455         <div class="method-description">
456           <p>
457 If the method name matches a # <a
458 href="AgentDDL.html#M000181">aggregate</a> function, we return the function
459 with args as a hash. This will only be active if the
460 @process_aggregate_functions is set to true which only happens in the <a
461 href="AgentDDL.html#M000180">summarize</a> block
462 </p>
463           <p><a class="source-toggle" href="#"
464             onclick="toggleCode('M000184-source');return false;">[Source]</a></p>
465           <div class="method-source-code" id="M000184-source">
466 <pre>
467      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 135</span>
468 135:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">name</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
469 136:         <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@process_aggregate_functions</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">is_function?</span>(<span class="ruby-identifier">name</span>)
470 137:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">NoMethodError</span>, <span class="ruby-node">&quot;undefined local variable or method `#{name}'&quot;</span>, <span class="ruby-identifier">caller</span>
471 138:         <span class="ruby-keyword kw">end</span>
472 139: 
473 140:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:function</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">name</span>, <span class="ruby-identifier">:args</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">args</span>}
474 141:       <span class="ruby-keyword kw">end</span>
475 </pre>
476           </div>
477         </div>
478       </div>
479
480       <div id="method-M000186" class="method-detail">
481         <a name="M000186"></a>
482
483         <div class="method-heading">
484           <a href="#M000186" class="method-signature">
485           <span class="method-name">set_default_input_arguments</span><span class="method-args">(action, arguments)</span>
486           </a>
487         </div>
488       
489         <div class="method-description">
490           <p>
491 For a given <a href="AgentDDL.html#M000183">action</a> and arguments look
492 up the <a href="../DDL.html">DDL</a> interface to that <a
493 href="AgentDDL.html#M000183">action</a> and if any arguments in the <a
494 href="../DDL.html">DDL</a> have a :default value assign that to any <a
495 href="AgentDDL.html#M000179">input</a> that does not have an argument in
496 the <a href="AgentDDL.html#M000179">input</a> arguments
497 </p>
498 <p>
499 This is intended to only be called on clients and not on servers as the
500 clients should never be able to publish non compliant requests and the
501 servers should really not tamper with incoming requests since doing so
502 might raise validation errors that were not raised on the client breaking
503 our fail-fast approach to <a href="AgentDDL.html#M000179">input</a>
504 validation
505 </p>
506           <p><a class="source-toggle" href="#"
507             onclick="toggleCode('M000186-source');return false;">[Source]</a></p>
508           <div class="method-source-code" id="M000186-source">
509 <pre>
510      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 159</span>
511 159:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set_default_input_arguments</span>(<span class="ruby-identifier">action</span>, <span class="ruby-identifier">arguments</span>)
512 160:         <span class="ruby-identifier">input</span> = <span class="ruby-identifier">action_interface</span>(<span class="ruby-identifier">action</span>)[<span class="ruby-identifier">:input</span>]
513 161: 
514 162:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">input</span>
515 163: 
516 164:         <span class="ruby-identifier">input</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
517 165:           <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">arguments</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">input</span>[<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:default</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">input</span>[<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:optional</span>]
518 166:             <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">&quot;Setting default value for input '%s' to '%s'&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">key</span>, <span class="ruby-identifier">input</span>[<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:default</span>]])
519 167:             <span class="ruby-identifier">arguments</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">input</span>[<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:default</span>]
520 168:           <span class="ruby-keyword kw">end</span>
521 169:         <span class="ruby-keyword kw">end</span>
522 170:       <span class="ruby-keyword kw">end</span>
523 </pre>
524           </div>
525         </div>
526       </div>
527
528       <div id="method-M000180" class="method-detail">
529         <a name="M000180"></a>
530
531         <div class="method-heading">
532           <a href="#M000180" class="method-signature">
533           <span class="method-name">summarize</span><span class="method-args">(&amp;block)</span>
534           </a>
535         </div>
536       
537         <div class="method-description">
538           <p>
539 Calls the <a href="AgentDDL.html#M000180">summarize</a> block defined in
540 the ddl. Block will not be called if the ddl is getting processed on the
541 server side. This means that <a href="AgentDDL.html#M000181">aggregate</a>
542 plugins only have to be present on the client side.
543 </p>
544 <p>
545 The @process_aggregate_functions variable is used by the <a
546 href="AgentDDL.html#M000184">method_missing</a> block to determine if it
547 should kick in, this way we very tightly control where we activate the <a
548 href="AgentDDL.html#M000184">method_missing</a> behavior turning it into a
549 noop otherwise to maximise the chance of providing good user feedback
550 </p>
551           <p><a class="source-toggle" href="#"
552             onclick="toggleCode('M000180-source');return false;">[Source]</a></p>
553           <div class="method-source-code" id="M000180-source">
554 <pre>
555     <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 61</span>
556 61:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">summarize</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
557 62:         <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">mode</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:server</span>
558 63:           <span class="ruby-ivar">@process_aggregate_functions</span> = <span class="ruby-keyword kw">true</span>
559 64:           <span class="ruby-identifier">block</span>.<span class="ruby-identifier">call</span>
560 65:           <span class="ruby-ivar">@process_aggregate_functions</span> = <span class="ruby-keyword kw">nil</span>
561 66:         <span class="ruby-keyword kw">end</span>
562 67:       <span class="ruby-keyword kw">end</span>
563 </pre>
564           </div>
565         </div>
566       </div>
567
568       <div id="method-M000187" class="method-detail">
569         <a name="M000187"></a>
570
571         <div class="method-heading">
572           <a href="#M000187" class="method-signature">
573           <span class="method-name">validate_rpc_request</span><span class="method-args">(action, arguments)</span>
574           </a>
575         </div>
576       
577         <div class="method-description">
578           <p>
579 Helper to use the <a href="../DDL.html">DDL</a> to figure out if the remote
580 call to an agent should be allowed based on <a
581 href="AgentDDL.html#M000183">action</a> name and inputs.
582 </p>
583           <p><a class="source-toggle" href="#"
584             onclick="toggleCode('M000187-source');return false;">[Source]</a></p>
585           <div class="method-source-code" id="M000187-source">
586 <pre>
587      <span class="ruby-comment cmt"># File lib/mcollective/ddl/agentddl.rb, line 174</span>
588 174:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">validate_rpc_request</span>(<span class="ruby-identifier">action</span>, <span class="ruby-identifier">arguments</span>)
589 175:         <span class="ruby-comment cmt"># is the action known?</span>
590 176:         <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">actions</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">action</span>)
591 177:           <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC29</span>, <span class="ruby-value str">&quot;Attempted to call action %{action} for %{plugin} but it's not declared in the DDL&quot;</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">action</span>, <span class="ruby-identifier">:plugin</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@pluginname</span>)
592 178:         <span class="ruby-keyword kw">end</span>
593 179: 
594 180:         <span class="ruby-identifier">input</span> = <span class="ruby-identifier">action_interface</span>(<span class="ruby-identifier">action</span>)[<span class="ruby-identifier">:input</span>] <span class="ruby-operator">||</span> {}
595 181: 
596 182:         <span class="ruby-identifier">input</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
597 183:           <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">input</span>[<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:optional</span>]
598 184:             <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">arguments</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
599 185:               <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC30</span>, <span class="ruby-value str">&quot;Action '%{action}' needs a '%{key}' argument&quot;</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">action</span>, <span class="ruby-identifier">:key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">key</span>)
600 186:             <span class="ruby-keyword kw">end</span>
601 187:           <span class="ruby-keyword kw">end</span>
602 188: 
603 189:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">arguments</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
604 190:             <span class="ruby-identifier">validate_input_argument</span>(<span class="ruby-identifier">input</span>, <span class="ruby-identifier">key</span>, <span class="ruby-identifier">arguments</span>[<span class="ruby-identifier">key</span>])
605 191:           <span class="ruby-keyword kw">end</span>
606 192:         <span class="ruby-keyword kw">end</span>
607 193: 
608 194:         <span class="ruby-keyword kw">true</span>
609 195:       <span class="ruby-keyword kw">end</span>
610 </pre>
611           </div>
612         </div>
613       </div>
614
615
616     </div>
617
618
619   </div>
620
621
622 <div id="validator-badges">
623   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
624 </div>
625
626 </body>
627 </html>