diff --git a/lib/puppet/application/lookup.rb b/lib/puppet/application/lookup.rb index 384c99f2c5b..e250725ed18 100644 --- a/lib/puppet/application/lookup.rb +++ b/lib/puppet/application/lookup.rb @@ -3,6 +3,7 @@ require_relative '../../puppet/application' require_relative '../../puppet/pops' require_relative '../../puppet/node' +require_relative '../../puppet/node/server_facts' require_relative '../../puppet/parser/compiler' class Puppet::Application::Lookup < Puppet::Application @@ -403,6 +404,7 @@ def generate_scope end end node.environment = Puppet[:environment] if Puppet.settings.set_by_cli?(:environment) + node.add_server_facts(Puppet::Node::ServerFacts.load) Puppet[:code] = 'undef' unless options[:compile] compiler = Puppet::Parser::Compiler.new(node) if options[:node] diff --git a/lib/puppet/indirector/catalog/compiler.rb b/lib/puppet/indirector/catalog/compiler.rb index 7694949ecf1..dfac7554647 100644 --- a/lib/puppet/indirector/catalog/compiler.rb +++ b/lib/puppet/indirector/catalog/compiler.rb @@ -2,6 +2,7 @@ require_relative '../../../puppet/environments' require_relative '../../../puppet/node' +require_relative '../../../puppet/node/server_facts' require_relative '../../../puppet/resource/catalog' require_relative '../../../puppet/indirector/code' require_relative '../../../puppet/util/profiler' @@ -426,40 +427,6 @@ def node_from_request(facts, request) # # See also set_server_facts in Puppet::Server::Compiler in puppetserver. def set_server_facts - @server_facts = {} - - # Add our server Puppet Enterprise version, if available. - pe_version_file = '/opt/puppetlabs/server/pe_version' - if File.readable?(pe_version_file) and !File.zero?(pe_version_file) - @server_facts['pe_serverversion'] = File.read(pe_version_file).chomp - end - - # Add our server version to the fact list - @server_facts["serverversion"] = Puppet.version.to_s - - # And then add the server name and IP - { "servername" => "networking.fqdn", - "serverip" => "networking.ip", - "serverip6" => "networking.ip6" }.each do |var, fact| - value = Puppet.runtime[:facter].value(fact) - unless value.nil? - @server_facts[var] = value - end - end - - if @server_facts["servername"].nil? - host = Puppet.runtime[:facter].value('networking.hostname') - if host.nil? - Puppet.warning _("Could not retrieve fact servername") - elsif domain = Puppet.runtime[:facter].value('networking.domain') # rubocop:disable Lint/AssignmentInCondition - @server_facts["servername"] = [host, domain].join(".") - else - @server_facts["servername"] = host - end - end - - if @server_facts["serverip"].nil? && @server_facts["serverip6"].nil? - Puppet.warning _("Could not retrieve either serverip or serverip6 fact") - end + @server_facts = Puppet::Node::ServerFacts.load end end diff --git a/lib/puppet/node/server_facts.rb b/lib/puppet/node/server_facts.rb new file mode 100644 index 00000000000..9e064339488 --- /dev/null +++ b/lib/puppet/node/server_facts.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +class Puppet::Node::ServerFacts + def self.load + server_facts = {} + + # Add our server Puppet Enterprise version, if available. + pe_version_file = '/opt/puppetlabs/server/pe_version' + if File.readable?(pe_version_file) and !File.zero?(pe_version_file) + server_facts['pe_serverversion'] = File.read(pe_version_file).chomp + end + + # Add our server version to the fact list + server_facts["serverversion"] = Puppet.version.to_s + + # And then add the server name and IP + { "servername" => "networking.fqdn", + "serverip" => "networking.ip", + "serverip6" => "networking.ip6" }.each do |var, fact| + value = Puppet.runtime[:facter].value(fact) + unless value.nil? + server_facts[var] = value + end + end + + if server_facts["servername"].nil? + host = Puppet.runtime[:facter].value('networking.hostname') + if host.nil? + Puppet.warning _("Could not retrieve fact servername") + elsif domain = Puppet.runtime[:facter].value('networking.domain') # rubocop:disable Lint/AssignmentInCondition + server_facts["servername"] = [host, domain].join(".") + else + server_facts["servername"] = host + end + end + + if server_facts["serverip"].nil? && server_facts["serverip6"].nil? + Puppet.warning _("Could not retrieve either serverip or serverip6 fact") + end + + server_facts + end +end diff --git a/spec/fixtures/unit/application/environments/production/data/common.yaml b/spec/fixtures/unit/application/environments/production/data/common.yaml index 88b20ad3a45..453775d84ae 100644 --- a/spec/fixtures/unit/application/environments/production/data/common.yaml +++ b/spec/fixtures/unit/application/environments/production/data/common.yaml @@ -20,5 +20,7 @@ ab: "%{hiera('a')} and %{hiera('b')}" g: "This is%{facts.cx} in facts hash" +h: "server version is %{server_facts.serverversion}" + lookup_options: a: first diff --git a/spec/unit/application/lookup_spec.rb b/spec/unit/application/lookup_spec.rb index 00842837176..1a1cd54169e 100644 --- a/spec/unit/application/lookup_spec.rb +++ b/spec/unit/application/lookup_spec.rb @@ -546,6 +546,13 @@ def run_lookup(lookup) expect(run_lookup(lookup)).to eql("This is G from facts in facts hash") end + it 'looks up server facts' do + lookup.options[:node] = node + lookup.options[:render_as] = :s + allow(lookup.command_line).to receive(:args).and_return(['h']) + expect(run_lookup(lookup)).to eql("server version is #{Puppet.version}") + end + describe 'when retrieving given facts' do before do lookup.options[:node] = node