diff --git a/lib/puppet/type/concat_file.rb b/lib/puppet/type/concat_file.rb index 9bf6cf51..b0978f09 100644 --- a/lib/puppet/type/concat_file.rb +++ b/lib/puppet/type/concat_file.rb @@ -296,7 +296,8 @@ def nested_merge(hash1, hash2) def fragment_content(r) if r[:content].nil? == false - fragment_content = r[:content] + # Explicitly resolve deferred values. + fragment_content = r[:content].instance_of?(Puppet::Pops::Evaluator::DeferredValue) ? r[:content].resolve : r[:content] elsif r[:source].nil? == false @source = nil Array(r[:source]).each do |source| diff --git a/spec/acceptance/fragment_content_with_deferred_function_call_spec.rb b/spec/acceptance/fragment_content_with_deferred_function_call_spec.rb new file mode 100644 index 00000000..71cf83bd --- /dev/null +++ b/spec/acceptance/fragment_content_with_deferred_function_call_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'spec_helper_acceptance' + +# For testing the deferred function call +require 'digest/md5' + +describe 'deferred function call' do + attr_reader :basedir + + before(:all) do + @basedir = setup_test_directory + end + + describe 'file' do + let(:pp) do + <<-MANIFEST + concat { '#{basedir}/deferred_file': } + + concat::fragment { '1': + target => '#{basedir}/deferred_file', + content => Deferred('md5', ['test']), + } + MANIFEST + end + + it 'idempotent, file matches' do + idempotent_apply(pp) + expect(file("#{basedir}/deferred_file")).to be_file + expect(file("#{basedir}/deferred_file").content).to match Digest::MD5.hexdigest('test') + end + end +end