Skip to content

Commit 30ee48b

Browse files
(PUP-11402) Puppet lookup fails when used localy
This commit moves the entire trusted information logic in the case where we have the `compile` option enabled and we are not a `plain` terminus, since any other case does not need the said `trusted_information` context.
1 parent 6084fcb commit 30ee48b

File tree

3 files changed

+45
-27
lines changed

3 files changed

+45
-27
lines changed

acceptance/tests/parser_functions/puppet_lookup_cmd.rb

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,16 +2193,6 @@ def data()
21932193
step 'start puppet server'
21942194
with_puppet_running_on master, @master_opts, @coderoot do
21952195

2196-
step "handle certificate"
2197-
on(master, "puppetserver ca generate --certname #{@node1}")
2198-
on(master, "puppetserver ca generate --certname #{@node2}")
2199-
on(master, "mkdir -p #{@testroot}/puppet/ssl/certs")
2200-
on(master, "mkdir -p #{@testroot}/puppet/ssl/private_keys")
2201-
on(master, "cp -a /etc/puppetlabs/puppet/ssl/certs/ca.pem #{@testroot}/puppet/ssl/certs")
2202-
on(master, "cp -a /etc/puppetlabs/puppet/ssl/crl.pem #{@testroot}/puppet/ssl")
2203-
on(master, "cp -a /etc/puppetlabs/puppet/ssl/private_keys/#{master.connection.hostname}.pem #{@testroot}/puppet/ssl/private_keys")
2204-
on(master, "cp -a /etc/puppetlabs/puppet/ssl/certs/#{master.connection.hostname}.pem #{@testroot}/puppet/ssl/certs")
2205-
22062196
step "global_key"
22072197
rg = on(master, puppet('lookup', 'global_key'))
22082198
result = rg.stdout
@@ -2587,6 +2577,25 @@ def data()
25872577
step 'apply enc manifest'
25882578
apply_manifest_on(master, @encmanifest, :catch_failures => true)
25892579

2580+
step "--compile uses environment specified in ENC"
2581+
r = on(master, puppet('lookup', '--compile', "--node #{@node1}", "--confdir #{@confdir}", "--facts #{@coderoot}/facts.yaml", 'environment_key'))
2582+
result = r.stdout
2583+
assert_match(
2584+
/CA is not available/,
2585+
result,
2586+
"lookup in ENC specified environment failed"
2587+
)
2588+
2589+
step "handle certificate"
2590+
on(master, "puppetserver ca generate --certname #{@node1}")
2591+
on(master, "puppetserver ca generate --certname #{@node2}")
2592+
on(master, "mkdir -p #{@testroot}/puppet/ssl/certs")
2593+
on(master, "mkdir -p #{@testroot}/puppet/ssl/private_keys")
2594+
on(master, "cp -a /etc/puppetlabs/puppet/ssl/certs/ca.pem #{@testroot}/puppet/ssl/certs")
2595+
on(master, "cp -a /etc/puppetlabs/puppet/ssl/crl.pem #{@testroot}/puppet/ssl")
2596+
on(master, "cp -a /etc/puppetlabs/puppet/ssl/private_keys/#{master.connection.hostname}.pem #{@testroot}/puppet/ssl/private_keys")
2597+
on(master, "cp -a /etc/puppetlabs/puppet/ssl/certs/#{master.connection.hostname}.pem #{@testroot}/puppet/ssl/certs")
2598+
25902599
step "--compile uses environment specified in ENC"
25912600
r = on(master, puppet('lookup', '--compile', "--node #{@node1}", "--confdir #{@confdir}", "--facts #{@coderoot}/facts.yaml", 'environment_key'))
25922601
result = r.stdout

lib/puppet/application/lookup.rb

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -379,25 +379,31 @@ def generate_scope
379379
else
380380
ni = Puppet::Node.indirection
381381
tc = ni.terminus_class
382-
383-
service = Puppet.runtime[:http]
384-
session = service.create_session
385-
cert = session.route_to(:ca)
386-
387-
_, x509 = cert.get_certificate(node)
388-
cert = OpenSSL::X509::Certificate.new(x509)
389-
390-
Puppet::SSL::Oids.register_puppet_oids
391-
trusted = Puppet::Context::TrustedInformation.remote(true, facts.values['certname'] || node, Puppet::SSL::Certificate.from_instance(cert))
392-
393-
Puppet.override(trusted_information: trusted) do
394-
if tc == :plain || options[:compile]
382+
if options[:compile]
383+
if tc == :plain
395384
node = ni.find(node, facts: facts)
396385
else
397-
ni.terminus_class = :plain
398-
node = ni.find(node, facts: facts)
399-
ni.terminus_class = tc
386+
begin
387+
service = Puppet.runtime[:http]
388+
session = service.create_session
389+
cert = session.route_to(:ca)
390+
391+
_, x509 = cert.get_certificate(node)
392+
cert = OpenSSL::X509::Certificate.new(x509)
393+
Puppet::SSL::Oids.register_puppet_oids
394+
trusted = Puppet::Context::TrustedInformation.remote(true, facts.values['certname'] || node, Puppet::SSL::Certificate.from_instance(cert))
395+
Puppet.override(trusted_information: trusted) do
396+
node = ni.find(node, facts: facts)
397+
end
398+
rescue
399+
Puppet.warning _("CA is not available, the operation will continue without using trusted facts.")
400+
node = ni.find(node, facts: facts)
401+
end
400402
end
403+
else
404+
ni.terminus_class = :plain
405+
node = ni.find(node, facts: facts)
406+
ni.terminus_class = tc
401407
end
402408
end
403409
else

spec/integration/application/lookup_spec.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
let(:facts) { Puppet::Node::Facts.new("facts", {'my_fact' => 'my_fact_value'}) }
4949
let(:cert) { pem_content('oid.pem') }
5050

51+
let(:node) { Puppet::Node.new('testnode', :facts => facts, :environment => env) }
5152
let(:populated_env_dir) do
5253
dir_contained_in(env_dir, environment_files)
5354
env_dir
@@ -104,7 +105,9 @@ def explain(key, options = {})
104105
certname: fqdn,
105106
extensions: { "1.3.6.1.4.1.34380.1.2.1.1" => "somevalue" }))
106107

107-
lookup('a')
108+
Puppet.settings[:node_terminus] = 'exec'
109+
expect_any_instance_of(Puppet::Node::Exec).to receive(:find).and_return(node)
110+
lookup('a', :compile => true)
108111
end
109112

110113
it 'loads external facts when running without --node' do

0 commit comments

Comments
 (0)