Class: PEClient::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/pe_client/client.rb

Overview

Client for interacting with PE services

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, base_url:, ca_file:, &block) {|Faraday::Connection| ... } ⇒ Client

Returns a new instance of Client.

Parameters:

  • api_key (String)

    API key for authentication

  • base_url (String, URI)

    Base URL for the PE API

  • ca_file (String)

    Path to CA certificate file

  • block (Proc)

    Optional block for Faraday connection customization

Yields:

  • (Faraday::Connection)

    Faraday connection for customization



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/pe_client/client.rb', line 36

def initialize(api_key:, base_url:, ca_file:, &block)
  @api_key = api_key
  @base_url = base_url.is_a?(URI) ? base_url : URI.parse(base_url)
  @provisioning_block = block

  @connection = Faraday.new(url: base_url) do |conn|
    conn.request :json
    conn.request :multipart, content_type: "multipart/mixed"
    conn.response :json, content_type: /\bjson$/
    conn.headers["User-Agent"] = "PEClient/#{PEClient::VERSION} Ruby/#{RUBY_VERSION}".freeze
    conn.headers["X-Authentication"] = @api_key unless @api_key.nil?
    conn.ssl[:ca_file] = ca_file
    conn.options.params_encoder = Faraday::FlatParamsEncoder

    block&.call(conn)

    conn.adapter Faraday.default_adapter
  end
end

Instance Attribute Details

#api_keyString (readonly)

API key for authentication

Returns:

  • (String)

    the current value of api_key



27
28
29
# File 'lib/pe_client/client.rb', line 27

def api_key
  @api_key
end

#base_urlString, URI (readonly)

Base URL for the PE API

Returns:

  • (String, URI)

    the current value of base_url



27
28
29
# File 'lib/pe_client/client.rb', line 27

def base_url
  @base_url
end

#connectionFaraday::Connection (readonly)

Faraday connection object

Returns:

  • (Faraday::Connection)

    the current value of connection



27
28
29
# File 'lib/pe_client/client.rb', line 27

def connection
  @connection
end

Instance Method Details

#activity_v1Resource::ActivityV1



178
179
180
181
# File 'lib/pe_client/client.rb', line 178

def activity_v1
  require_relative "resources/activity.v1"
  @activity_v1 ||= Resource::ActivityV1.new(self)
end

#activity_v2Resource::ActivityV2



184
185
186
187
# File 'lib/pe_client/client.rb', line 184

def activity_v2
  require_relative "resources/activity.v2"
  @activity_v2 ||= Resource::ActivityV2.new(self)
end

#code_manager_v1Resource::CodeManagerV1



166
167
168
169
# File 'lib/pe_client/client.rb', line 166

def code_manager_v1
  require_relative "resources/code_manager.v1"
  @code_manager_v1 ||= Resource::CodeManagerV1.new(self)
end

#deep_dupPEClient::Client

Create a deep duplicate of the client

Returns:



59
60
61
62
63
64
65
66
# File 'lib/pe_client/client.rb', line 59

def deep_dup
  self.class.new(
    api_key: @api_key.dup,
    base_url: @base_url.dup,
    ca_file: @connection.ssl[:ca_file].dup,
    &@provisioning_block
  )
end

#delete(path, body: nil, params: {}, headers: {}) ⇒ Object

HTTP DELETE request

Parameters:

  • path (String)

    API endpoint path

  • body (Hash) (defaults to: nil)

    Request body

  • params (Hash) (defaults to: {})

    Query parameters

  • headers (Hash) (defaults to: {})

Returns:

  • Parsed JSON response



113
114
115
116
117
118
119
120
121
122
# File 'lib/pe_client/client.rb', line 113

def delete(path, body: nil, params: {}, headers: {})
  if body
    response = connection.delete(path, params, headers) do |req|
      req.body = body
    end
    handle_response response
  else
    handle_response connection.delete(path, params, headers)
  end
end

#get(path, params: {}, headers: {}) ⇒ Object

HTTP GET request

Parameters:

  • path (String)

    API endpoint path

  • params (Hash) (defaults to: {})

    Query parameters

  • headers (Hash) (defaults to: {})

Returns:

  • Parsed JSON response



75
76
77
# File 'lib/pe_client/client.rb', line 75

def get(path, params: {}, headers: {})
  handle_response connection.get(path, params, headers)
end

#handle_response(response, headers_only: false) ⇒ Object

Handle HTTP response

Parameters:

  • response (Faraday::Response)

    HTTP response

  • headers_only (Boolean) (defaults to: false)

    Whether to return only headers

Returns:

  • Parsed JSON response, headers, or location

Raises:



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/pe_client/client.rb', line 233

def handle_response(response, headers_only: false)
  case response.status
  when 204 # No Content
    headers_only ? response.headers : {}
  when 200..299
    headers_only ? response.headers : response.body
  when 303 # See Other
    {"location" => response.headers["Location"]}
  when 400
    raise BadRequestError, response
  when 401
    raise UnauthorizedError, response
  when 403
    raise ForbiddenError, response
  when 404
    raise NotFoundError, response
  when 409
    raise ConflictError, response
  when 500..599
    raise ServerError, response
  else
    raise HTTPError, response
  end
end

#head(path, params: {}, headers: {}) ⇒ Hash

HTTP HEAD request

Parameters:

  • path (String)

    API endpoint path

  • params (Hash) (defaults to: {})

    Query parameters

  • headers (Hash) (defaults to: {})

Returns:

  • (Hash)

    HTTP Headers



131
132
133
# File 'lib/pe_client/client.rb', line 131

def head(path, params: {}, headers: {})
  handle_response connection.head(path, params, headers), headers_only: true
end

#metrics_v1Resource::MetricsV1

Returns:



190
191
192
193
# File 'lib/pe_client/client.rb', line 190

def metrics_v1
  require_relative "resources/metrics.v1"
  @metrics_v1 ||= Resource::MetricsV1.new(self)
end

#metrics_v2Resource::MetricsV2

Returns:



196
197
198
199
# File 'lib/pe_client/client.rb', line 196

def metrics_v2
  require_relative "resources/metrics.v2"
  @metrics_v2 ||= Resource::MetricsV2.new(self)
end

#node_classifier_v1Resource::NodeClassifierV1



154
155
156
157
# File 'lib/pe_client/client.rb', line 154

def node_classifier_v1
  require_relative "resources/node_classifier.v1"
  @node_classifier_v1 ||= Resource::NodeClassifierV1.new(self)
end

#node_inventory_v1Resource::NodeInventoryV1



136
137
138
139
# File 'lib/pe_client/client.rb', line 136

def node_inventory_v1
  require_relative "resources/node_inventory.v1"
  @node_inventory_v1 ||= Resource::NodeInventoryV1.new(self)
end

#orchestrator_v1Resource::OrchestratorV1



160
161
162
163
# File 'lib/pe_client/client.rb', line 160

def orchestrator_v1
  require_relative "resources/orchestrator.v1"
  @orchestrator_v1 ||= Resource::OrchestratorV1.new(self)
end

#post(path, body: {}, params: {}, headers: {}) ⇒ Object

HTTP POST request

Parameters:

  • path (String)

    API endpoint path

  • body (Hash) (defaults to: {})

    Request body

  • params (Hash) (defaults to: {})

    Query parameters

  • headers (Hash) (defaults to: {})

Returns:

  • Parsed JSON response



87
88
89
90
# File 'lib/pe_client/client.rb', line 87

def post(path, body: {}, params: {}, headers: {})
  path = "#{path}?#{URI.encode_www_form(params)}" unless params.empty?
  handle_response connection.post(path, body, headers)
end

#puppet_admin_v1Resource::PuppetAdminV1



202
203
204
205
# File 'lib/pe_client/client.rb', line 202

def puppet_admin_v1
  require_relative "resources/puppet_admin.v1"
  @puppet_admin_v1 ||= Resource::PuppetAdminV1.new(self)
end

#puppet_ca_v1Resource::PuppetCAV1



214
215
216
217
# File 'lib/pe_client/client.rb', line 214

def puppet_ca_v1
  require_relative "resources/puppet_ca.v1"
  @puppet_ca_v1 ||= Resource::PuppetCAV1.new(self)
end

#puppet_dbResource::PuppetDB

Returns:



220
221
222
223
# File 'lib/pe_client/client.rb', line 220

def puppet_db
  require_relative "resources/puppet_db"
  @puppet_db ||= Resource::PuppetDB.new(self)
end

#puppet_v3Resource::PuppetV3

Returns:



208
209
210
211
# File 'lib/pe_client/client.rb', line 208

def puppet_v3
  require_relative "resources/puppet.v3"
  @puppet_v3 ||= Resource::PuppetV3.new(self)
end

#put(path, body: {}, params: {}, headers: {}) ⇒ Object

HTTP PUT request

Parameters:

  • path (String)

    API endpoint path

  • body (Hash) (defaults to: {})

    Request body

  • params (Hash) (defaults to: {})

    Query parameters

  • headers (Hash) (defaults to: {})

Returns:

  • Parsed JSON response



100
101
102
103
# File 'lib/pe_client/client.rb', line 100

def put(path, body: {}, params: {}, headers: {})
  path = "#{path}?#{URI.encode_www_form(params)}" unless params.empty?
  handle_response connection.put(path, body, headers)
end

#rbac_v1Resource::RBACV1

Returns:



142
143
144
145
# File 'lib/pe_client/client.rb', line 142

def rbac_v1
  require_relative "resources/rbac.v1"
  @rbac_v1 ||= Resource::RBACV1.new(self)
end

#rbac_v2Resource::RBACV2

Returns:



148
149
150
151
# File 'lib/pe_client/client.rb', line 148

def rbac_v2
  require_relative "resources/rbac.v2"
  @rbac_v2 ||= Resource::RBACV2.new(self)
end

#status_v1Resource::StatusV1

Returns:



172
173
174
175
# File 'lib/pe_client/client.rb', line 172

def status_v1
  require_relative "resources/status.v1"
  @status_v1 ||= Resource::StatusV1.new(self)
end