Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion lib/puppet/pops/evaluator/deferred_resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,10 @@ def self.resolve_and_replace(facts, catalog, environment = catalog.environment_i
# # Server facts are always about the local node's version etc.
# @scope.set_server_facts(node.server_facts)

resolver.resolve_futures(catalog)
# Must be wrapped in with_context_overrides to ensure global_scope is valid for Puppet-language functions
compiler.with_context_overrides do
resolver.resolve_futures(catalog)
end
nil
end

Expand Down
19 changes: 18 additions & 1 deletion spec/unit/pops/evaluator/deferred_resolver_spec.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require 'spec_helper'
require 'puppet_spec/compiler'
require 'puppet_spec/files'

Puppet::Type.newtype(:test_deferred) do
newparam(:name)
Expand All @@ -8,8 +9,14 @@

describe Puppet::Pops::Evaluator::DeferredResolver do
include PuppetSpec::Compiler
include PuppetSpec::Files

let(:environment) { Puppet::Node::Environment.create(:testing, []) }
let(:env_dir) do
dir_containing('testing', 'modules' => {
'testmod' => { 'functions' => { 'test.pp' => 'function testmod::test($x) { "Got: ${x}" }' } }
})
end
let(:environment) { Puppet::Node::Environment.create(:testing, [File.join(env_dir, 'modules')]) }
let(:facts) { Puppet::Node::Facts.new('node.example.com') }

def compile_and_resolve_catalog(code, preprocess = false)
Expand Down Expand Up @@ -95,4 +102,14 @@ def compile_and_resolve_catalog(code, preprocess = false)
resource = catalog.resource(:test_deferred, 'deferred')
expect(resource.sensitive_parameters).to eq([:value])
end

it 'resolves deferred values that call Puppet language functions' do
catalog = compile_and_resolve_catalog(<<~END, true)
notify { "deferred":
message => Deferred("testmod::test", ["hello"])
}
END

expect(catalog.resource(:notify, 'deferred')[:message]).to eq('Got: hello')
end
end