class MCollective::RPC::Request

Simple class to manage compliant requests for MCollective::RPC agents

Attributes

action[RW]
agent[RW]
caller[RW]
data[RW]
ddl[RW]
sender[RW]
time[RW]
uniqid[RW]

Public Class Methods

new(msg, ddl) click to toggle source
# File lib/mcollective/rpc/request.rb, line 7
def initialize(msg, ddl)
  @time = msg[:msgtime]
  @action = msg[:body][:action] || msg[:body]["action"]
  @data = msg[:body][:data] || msg[:body]["data"]
  @sender = msg[:senderid]
  @agent = msg[:body][:agent] || msg[:body]["agent"]
  @uniqid = msg[:requestid]
  @caller = msg[:callerid] || "unknown"
  @ddl = ddl
end

Public Instance Methods

[](key) click to toggle source

If data is a hash, gives easy access to its members, else returns nil

# File lib/mcollective/rpc/request.rb, line 58
def [](key)
  return nil unless @data.is_a?(Hash)
  return @data[compatible_key(key)]
end
compatible_key(key) click to toggle source

In a scenario where a request came from a JSON pure medium like a REST service or other language client MCollective::DDL::AgentDDL#validate_rpc_request will check “package” against the intput :package should the input “package” not also be known

Thus once the request is built it will also have “package” and not :package data, so we need to fetch the correct key out of the hash.

# File lib/mcollective/rpc/request.rb, line 25
def compatible_key(key)
  return key if data.include?(key)

  if ddl
    input = ddl.action_interface(action)[:input]

    # if :package is requested and the DDL also declares "package" we cant tell it to fetch
    # "package", hence the check against the input here
    return key.to_s if key.is_a?(Symbol) && !input.include?(key.to_s) && data.include?(key.to_s)
  end

  key
end
fetch(key, default) click to toggle source
# File lib/mcollective/rpc/request.rb, line 63
def fetch(key, default)
  return nil unless @data.is_a?(Hash)
  return @data.fetch(compatible_key(key), default)
end
include?(key) click to toggle source

If data is a hash, quick helper to get access to it’s include? method else returns false

# File lib/mcollective/rpc/request.rb, line 41
def include?(key)
  return false unless @data.is_a?(Hash)

  @data.include?(compatible_key(key))
end
should_respond?() click to toggle source

If no :process_results is specified always respond else respond based on the supplied property

# File lib/mcollective/rpc/request.rb, line 49
def should_respond?
  return false unless @data.is_a?(Hash)
  return @data[:process_results] if @data.include?(:process_results)
  return @data["process_results"] if @data.include?("process_results")

  true
end
to_hash() click to toggle source
# File lib/mcollective/rpc/request.rb, line 68
def to_hash
  {:agent => @agent,
   :action => @action,
   :data => @data}
end
to_json() click to toggle source
# File lib/mcollective/rpc/request.rb, line 79
def to_json
  to_hash.merge!({:sender   => @sender,
                  :callerid => @callerid,
                  :uniqid   => @uniqid}).to_json
end
validate!() click to toggle source

Validate the request against the DDL

# File lib/mcollective/rpc/request.rb, line 75
def validate!
  @ddl.validate_rpc_request(@action, @data)
end