Class: Bolt::PuppetDB::Client

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri, cacert, token: nil, cert: nil, key: nil) ⇒ Client

Returns a new instance of Client.



28
29
30
31
32
33
34
# File 'lib/bolt/puppetdb/client.rb', line 28

def initialize(uri, cacert, token: nil, cert: nil, key: nil)
  @uri = uri
  @cacert = cacert
  @token = token
  @cert = cert
  @key = key
end

Class Method Details

.from_config(config) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/bolt/puppetdb/client.rb', line 10

def self.from_config(config)
  uri = if config['server_urls'].is_a? String
          config['server_urls']
        else
          config['server_urls'].first
        end
  uri = URI.parse(uri)
  uri.port ||= 8081

  cacert = File.expand_path(config['cacert'])
  token = config.token

  cert = config['cert']
  key = config['key']

  new(uri, cacert, token: token, cert: cert, key: key)
end

Instance Method Details

#facts_for_node(certnames) ⇒ Object

This method expects an array of certnames to get facts for



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/bolt/puppetdb/client.rb', line 55

def facts_for_node(certnames)
  return {} if certnames.empty? || certnames.nil?

  certnames.uniq!
  name_query = certnames.map { |c| ["=", "certname", c] }
  name_query.insert(0, "or")
  body = JSON.generate(query: name_query)

  response = http_client.post("#{@uri}/pdb/query/v4/inventory", body: body, header: headers)
  if response.code != 200
    raise Bolt::PuppetDBError, "Failed to query PuppetDB: #{response.body}"
  else
    parsed = JSON.parse(response.body)
  end

  parsed&.each_with_object({}) do |node, coll|
    coll[node['certname']] = node['facts']
  end
end

#headersObject



84
85
86
87
88
# File 'lib/bolt/puppetdb/client.rb', line 84

def headers
  headers = { 'Content-Type' => 'application/json' }
  headers['X-Authentication'] = @token if @token
  headers
end

#http_clientObject



75
76
77
78
79
80
81
82
# File 'lib/bolt/puppetdb/client.rb', line 75

def http_client
  return @http if @http
  @http = HTTPClient.new
  @http.ssl_config.set_client_cert_file(@cert, @key)
  @http.ssl_config.add_trust_ca(@cacert)

  @http
end

#query_certnames(query) ⇒ Object



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

def query_certnames(query)
  return [] unless query

  body = JSON.generate(query: query)

  response = http_client.post("#{@uri}/pdb/query/v4", body: body, header: headers)
  if response.code != 200
    raise Bolt::PuppetDBError, "Failed to query PuppetDB: #{response.body}"
  else
    results = JSON.parse(response.body)
    if results&.first && !results.first&.key?('certname')
      fields = results.first&.keys
      raise Bolt::PuppetDBError, "Query results did not contain a 'certname' field: got #{fields.join(', ')}"
    end
    results&.map { |result| result['certname'] }.uniq
  end
end