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::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">
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::DDL::AgentDDL</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../../files/lib/mcollective/ddl/agentddl_rb.html">
59 lib/mcollective/ddl/agentddl.rb
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
75 <!-- banner header -->
77 <div id="bodyContent">
81 <div id="contextContent">
83 <div id="description">
85 A <a href="../DDL.html">DDL</a> class specific to agent plugins.
88 A full <a href="../DDL.html">DDL</a> can be seen below with all the
89 possible bells and whistles present.
92 metadata :name => "Utilities and Helpers for SimpleRPC <a
93 href="../Agents.html">Agents</a>",
96 :description => "General helpful actions that expose stats and internals to SimpleRPC clients",
97 :author => "R.I.Pienaar <rip@devco.net>",
98 :license => "Apache License, Version 2.0",
99 :version => "1.0",
100 :url => "http://marionette-collective.org/",
104 <a href="AgentDDL.html#M000183">action</a> "get_fact",
105 :description => "Retrieve a single fact from the fact store"
112 :prompt => "The name of the fact",
113 :description => "The fact to retrieve",
115 :validation => '^[\w\-\.]+$',
116 :optional => false,
118 :default => "fqdn"
121 :description => "The name of the fact being returned",
122 :display_as => "Fact"
125 :description => "The value of the fact",
126 :display_as => "Value",
127 :default => ""
130 aggregate summary(:value)
142 <div id="method-list">
143 <h3 class="section-bar">Methods</h3>
145 <div class="name-list">
146 <a href="#M000183">action</a>
147 <a href="#M000188">action_interface</a>
148 <a href="#M000189">actions</a>
149 <a href="#M000181">aggregate</a>
150 <a href="#M000182">display</a>
151 <a href="#M000179">input</a>
152 <a href="#M000185">is_function?</a>
153 <a href="#M000184">method_missing</a>
154 <a href="#M000178">new</a>
155 <a href="#M000186">set_default_input_arguments</a>
156 <a href="#M000180">summarize</a>
157 <a href="#M000187">validate_rpc_request</a>
175 <!-- if method_list -->
177 <h3 class="section-bar">Public Class methods</h3>
179 <div id="method-M000178" class="method-detail">
180 <a name="M000178"></a>
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>
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">
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>
197 44: <span class="ruby-keyword kw">super</span>
198 45: <span class="ruby-keyword kw">end</span>
204 <h3 class="section-bar">Public Instance methods</h3>
206 <div id="method-M000183" class="method-detail">
207 <a name="M000183"></a>
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, &block)</span>
215 <div class="method-description">
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>
223 action "status", :description => "Restarts a Service" do
226 input "service",
227 :prompt => "Service Action",
228 :description => "The action to perform",
230 :optional => true,
231 :list => ["start", "stop", "restart", "status"]
233 output "status",
234 :description => "The status of the service after the action"
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">
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">&</span><span class="ruby-identifier">block</span>)
244 113: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Action needs a :description property"</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>)
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>
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>
267 <div id="method-M000188" class="method-detail">
268 <a name="M000188"></a>
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>
276 <div class="method-description">
278 Returns the interface for a specific <a
279 href="AgentDDL.html#M000183">action</a>
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">
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>
294 <div id="method-M000189" class="method-detail">
295 <a name="M000189"></a>
297 <div class="method-heading">
298 <a href="#M000189" class="method-signature">
299 <span class="method-name">actions</span><span class="method-args">()</span>
303 <div class="method-description">
305 Returns an array of <a href="AgentDDL.html#M000189">actions</a> this agent
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">
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>
321 <div id="method-M000181" class="method-detail">
322 <a name="M000181"></a>
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 => nil})</span>
330 <div class="method-description">
332 Sets the <a href="AgentDDL.html#M000181">aggregate</a> array for the given
333 <a href="AgentDDL.html#M000183">action</a>
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">
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">></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">"Formats supplied to aggregation functions should be a hash"</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">"Formats supplied to aggregation functions must have a :format key"</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">"Functions supplied to aggregate should be a hash"</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>)
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">&&</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">"aggregate method for action '%{action}' missing a function parameter"</span>, <span class="ruby-identifier">:error</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">></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>
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"><<</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>
357 <div id="method-M000182" class="method-detail">
358 <a name="M000182"></a>
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>
366 <div class="method-description">
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
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">
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">"Display preference #{pref} is not valid, should be :ok, :failed, :flatten or :always"</span>
381 89: <span class="ruby-keyword kw">end</span>
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>
391 <div id="method-M000179" class="method-detail">
392 <a name="M000179"></a>
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>
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">
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">"Input needs a :optional property"</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>)
409 50: <span class="ruby-keyword kw">super</span>
410 51: <span class="ruby-keyword kw">end</span>
416 <div id="method-M000185" class="method-detail">
417 <a name="M000185"></a>
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>
425 <div class="method-description">
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.
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">
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">"aggregate"</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>
446 <div id="method-M000184" class="method-detail">
447 <a name="M000184"></a>
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, &block)</span>
455 <div class="method-description">
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
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">
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">&</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">"undefined local variable or method `#{name}'"</span>, <span class="ruby-identifier">caller</span>
471 138: <span class="ruby-keyword kw">end</span>
473 140: <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:function</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">name</span>, <span class="ruby-identifier">:args</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">args</span>}
474 141: <span class="ruby-keyword kw">end</span>
480 <div id="method-M000186" class="method-detail">
481 <a name="M000186"></a>
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>
489 <div class="method-description">
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
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>
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">
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>]
514 162: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">input</span>
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">&&</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">&&</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">"Setting default value for input '%s' to '%s'"</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>
528 <div id="method-M000180" class="method-detail">
529 <a name="M000180"></a>
531 <div class="method-heading">
532 <a href="#M000180" class="method-signature">
533 <span class="method-name">summarize</span><span class="method-args">(&block)</span>
537 <div class="method-description">
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.
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
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">
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">&</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>
568 <div id="method-M000187" class="method-detail">
569 <a name="M000187"></a>
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>
577 <div class="method-description">
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.
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">
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">"Attempted to call action %{action} for %{plugin} but it's not declared in the DDL"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">action</span>, <span class="ruby-identifier">:plugin</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@pluginname</span>)
592 178: <span class="ruby-keyword kw">end</span>
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> {}
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">"Action '%{action}' needs a '%{key}' argument"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:action</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">action</span>, <span class="ruby-identifier">:key</span> =<span class="ruby-operator">></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>
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>
608 194: <span class="ruby-keyword kw">true</span>
609 195: <span class="ruby-keyword kw">end</span>
622 <div id="validator-badges">
623 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>