Class: OctocatalogDiff::Facts::PuppetDB
- Inherits:
-
Object
- Object
- OctocatalogDiff::Facts::PuppetDB
- Defined in:
- lib/octocatalog-diff/facts/puppetdb.rb
Overview
Deal with facts in PuppetDB
Constant Summary collapse
- PUPPETDB_QUERY_FACTS_URL =
Supporting multiple versions of the PuppetDB API.
{ '3' => '/v3/nodes/<NODE>/facts', '4' => '/pdb/query/v4/nodes/<NODE>/facts' }.freeze
Class Method Summary collapse
-
.fact_retriever(options = {}, node) ⇒ Hash
Retrieve facts from PuppetDB for a specified node.
Class Method Details
.fact_retriever(options = {}, node) ⇒ Hash
Retrieve facts from PuppetDB for a specified node.
23 24 25 26 27 28 29 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 |
# File 'lib/octocatalog-diff/facts/puppetdb.rb', line 23 def self.fact_retriever( = {}, node) # Set up some variables from options raise ArgumentError, 'puppetdb_url is required' unless [:puppetdb_url].is_a?(String) raise ArgumentError, 'node must be a non-empty string' unless node.is_a?(String) && node != '' puppetdb_api_version = .fetch(:puppetdb_api_version, 4) uri = PUPPETDB_QUERY_FACTS_URL.fetch(puppetdb_api_version.to_s).gsub('<NODE>', node) retries = .fetch(:retry, 0).to_i # Construct puppetdb object and options opts = .merge(timeout: 5) puppetdb = OctocatalogDiff::PuppetDB.new(opts) # Use OctocatalogDiff::PuppetDB to pull facts exception_class = nil = nil obj_to_return = nil (retries + 1).times do begin result = puppetdb.get(uri) facts = {} result.map { |x| facts[x['name']] = x['value'] } if facts.empty? = "Unable to retrieve facts for node #{node} from PuppetDB (empty or nil)!" raise OctocatalogDiff::Errors::FactRetrievalError, end # Create a structure compatible with YAML fact files. obj_to_return = { 'name' => node, 'values' => {} } facts.each { |k, v| obj_to_return['values'][k.sub(/^::/, '')] = v } break # Not return, to avoid LocalJumpError in Ruby 2.2 rescue OctocatalogDiff::Errors::PuppetDBConnectionError => exc exception_class = OctocatalogDiff::Errors::FactSourceError = "Fact retrieval failed (#{exc.class}) (#{exc.})" rescue OctocatalogDiff::Errors::PuppetDBNodeNotFoundError => exc exception_class = OctocatalogDiff::Errors::FactRetrievalError = "Node #{node} not found in PuppetDB (#{exc.})" rescue OctocatalogDiff::Errors::PuppetDBGenericError => exc exception_class = OctocatalogDiff::Errors::FactRetrievalError = "Fact retrieval failed for node #{node} from PuppetDB (#{exc.})" end end return obj_to_return unless obj_to_return.nil? raise exception_class, end |