Class: Runcible::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/runcible/base.rb

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ Base

Returns a new instance of Base.



8
9
10
11
# File 'lib/runcible/base.rb', line 8

def initialize(config = {})
  @mutex = Mutex.new
  @config = config
end

Instance Method Details

#add_http_auth_headerObject



165
166
167
# File 'lib/runcible/base.rb', line 165

def add_http_auth_header
  return {:user => config[:user], :password => config[:http_auth][:password]}
end

#add_oauth_header(method, path, headers) ⇒ Object



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/runcible/base.rb', line 169

def add_oauth_header(method, path, headers)
  default_options = { :site               => config[:url],
                      :http_method        => method,
                      :request_token_path => '',
                      :authorize_path     => '',
                      :access_token_path  => '' }

  consumer = OAuth::Consumer.new(config[:oauth][:oauth_key], config[:oauth][:oauth_secret], default_options)

  method_to_http_request = { :get    => Net::HTTP::Get,
                             :post   => Net::HTTP::Post,
                             :put    => Net::HTTP::Put,
                             :delete => Net::HTTP::Delete }

  http_request = method_to_http_request[method].new(path)
  consumer.sign!(http_request)

  headers['Authorization'] = http_request['Authorization']
  return headers
end

#call(method, path, options = {}) ⇒ Object

rubocop:disable Metrics/AbcSize:



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/runcible/base.rb', line 30

def call(method, path, options = {})
  clone_config = self.config.clone
  #on occation path will already have prefix (sync cancel)
  path = clone_config[:api_path] + path unless path.start_with?(clone_config[:api_path])

  RestClient.log = []
  headers = clone_config[:headers].clone

  get_params = options[:params] if options[:params]
  path = combine_get_params(path, get_params) if get_params

  client_options = {}
  client_options[:timeout] = clone_config[:timeout] if clone_config[:timeout]
  client_options[:open_timeout] = clone_config[:open_timeout] if clone_config[:open_timeout]
  client_options[:verify_ssl] = clone_config[:verify_ssl] unless clone_config[:verify_ssl].nil?

  if clone_config[:oauth]
    self.logger.warn('[DEPRECATION] Pulp oauth is deprecated.  Please use cert_auth instead.')
    headers = add_oauth_header(method, path, headers)
    headers['pulp-user'] = clone_config[:user]
  elsif clone_config[:cert_auth]
    if !clone_config[:cert_auth][:ssl_client_cert] || !clone_config[:cert_auth][:ssl_client_key]
      fail Runcible::ConfigurationUndefinedError, "Missing SSL certificate or key configuration."
    end
    client_options[:ssl_client_cert] = clone_config[:cert_auth][:ssl_client_cert]
    client_options[:ssl_client_key] = clone_config[:cert_auth][:ssl_client_key]
  else
    client_options[:user] = clone_config[:user]
    client_options[:password] = config[:http_auth][:password]
  end

  client_options[:ssl_ca_file] = config[:ca_cert_file] unless config[:ca_cert_file].nil?
  client = RestClient::Resource.new(clone_config[:url], client_options)

  args = [method]
  args << generate_payload(options) if [:post, :put].include?(method)
  args << headers

  response = get_response(client, path, *args)
  process_response(response)

rescue RestClient::ResourceNotFound => e
  log_info
  raise e
rescue => e
  log_exception
  raise e
end

#combine_get_params(path, params) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/runcible/base.rb', line 87

def combine_get_params(path, params)
  query_string = params.map do |k, v|
    if v.is_a? Array
      v.map { |y| "#{k}=#{y}" }.join('&')
    else
      "#{k}=#{v}"
    end
  end
  query_string = query_string.flatten.join('&')
  path + "?#{query_string}"
end

#configObject



17
18
19
20
21
22
23
# File 'lib/runcible/base.rb', line 17

def config
  @mutex.synchronize do
    @config = @lazy_config.call if defined?(@lazy_config)
    fail Runcible::ConfigurationUndefinedError, Runcible::ConfigurationUndefinedError.message unless @config
    @config
  end
end

#format_payload_json(payload_hash) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/runcible/base.rb', line 107

def format_payload_json(payload_hash)
  if payload_hash
    if payload_hash[:optional]
      payload = if payload_hash[:required]
                  payload_hash[:required].merge(payload_hash[:optional])
                else
                  payload_hash[:optional]
                end
    elsif payload_hash[:delta]
      payload = payload_hash
    else
      payload = payload_hash[:required]
    end
  else
    payload = {}
  end

  return payload.to_json
end

#generate_log_messageObject



211
212
213
# File 'lib/runcible/base.rb', line 211

def generate_log_message
  RestClient.log.join('\n')
end

#generate_payload(options) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/runcible/base.rb', line 99

def generate_payload(options)
  if options[:payload].is_a?(String)
    return options[:payload]
  elsif options[:payload].is_a?(Hash)
    format_payload_json(options[:payload])
  end
end

#get_response(client, path, *args) ⇒ Object



79
80
81
82
83
84
85
# File 'lib/runcible/base.rb', line 79

def get_response(client, path, *args)
  client[path].send(*args) do |response, _request, _result, &_block|
    resp = response.return!
    log_debug
    return resp
  end
end

#lazy_config=(a_block) ⇒ Object



13
14
15
# File 'lib/runcible/base.rb', line 13

def lazy_config=(a_block)
  @mutex.synchronize { @lazy_config = a_block }
end

#log_debugObject



190
191
192
193
194
195
# File 'lib/runcible/base.rb', line 190

def log_debug
  if self.config[:logging][:debug]
    log_message = generate_log_message
    self.config[:logging][:logger].debug(log_message)
  end
end

#log_exceptionObject



197
198
199
200
201
202
# File 'lib/runcible/base.rb', line 197

def log_exception
  if self.config[:logging][:exception]
    log_message = generate_log_message
    self.config[:logging][:logger].error(log_message)
  end
end

#log_infoObject



204
205
206
207
208
209
# File 'lib/runcible/base.rb', line 204

def log_info
  if self.config[:logging][:info]
    log_message = generate_log_message
    self.config[:logging][:logger].info(log_message)
  end
end

#loggerObject



215
216
217
# File 'lib/runcible/base.rb', line 215

def logger
  self.config[:logging][:logger]
end

#path(*args) ⇒ Object



25
26
27
# File 'lib/runcible/base.rb', line 25

def path(*args)
  self.class.path(*args)
end

#process_response(response) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/runcible/base.rb', line 127

def process_response(response)
  begin
    body = response.body == "null" ? nil : JSON.parse(response.body)
    if body.respond_to? :with_indifferent_access
      body = body.with_indifferent_access
    elsif body.is_a? Array
      body = body.map do |i|
        i.respond_to?(:with_indifferent_access) ? i.with_indifferent_access : i
      end
    end
    response = Runcible::Response.new(body, response)
  rescue JSON::ParserError
    log_exception
  end

  return response
end

#required_params(local_names, binding, keys_to_remove = []) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/runcible/base.rb', line 145

def required_params(local_names, binding, keys_to_remove = [])
  local_names = local_names.each_with_object({}) do |v, acc|
    value = binding.eval(v.to_s) unless v == :_
    acc[v] = value unless value.nil?
    acc
  end

  #The double delete is to support 1.8.7 and 1.9.3
  local_names.delete(:payload)
  local_names.delete(:optional)
  local_names.delete('payload')
  local_names.delete('optional')
  keys_to_remove.each do |key|
    local_names.delete(key)
    local_names.delete(key.to_sym)
  end

  return local_names
end