Skip to content

Commit 516870f

Browse files
committed
patch deferred problem
1 parent 3643334 commit 516870f

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ jobs:
1515
needs: Spec
1616
uses: "puppetlabs/cat-github-actions/.github/workflows/module_acceptance.yml@main"
1717
with:
18-
flags: "--latest-agent"
18+
flags: "--nightly"
1919
secrets: "inherit"

.github/workflows/nightly.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ jobs:
1414
needs: Spec
1515
uses: "puppetlabs/cat-github-actions/.github/workflows/module_acceptance.yml@main"
1616
with:
17-
flags: "--latest-agent"
17+
flags: "--nightly"
1818
secrets: "inherit"

lib/puppet/provider/base_dsc_lite/powershell.rb

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
require 'pathname'
44
require 'json'
55
require_relative '../../../puppet_x/puppetlabs/dsc_lite/powershell_hash_formatter'
6+
require 'puppet/pops/evaluator/deferred_resolver'
7+
require 'puppet/node/facts'
68

79
Puppet::Type.type(:base_dsc_lite).provide(:powershell) do
810
confine feature: :pwshlib
@@ -65,11 +67,68 @@ def ps_manager
6567
Pwsh::Manager.instance(command(:powershell), Pwsh::Manager.powershell_args, debug: debug_output)
6668
end
6769

70+
# Returns true if obj (or any nested value) is a DeferredValue
71+
def deep_contains_deferred?(obj)
72+
case obj
73+
when Puppet::Pops::Evaluator::DeferredValue
74+
true
75+
when Hash
76+
obj.any? { |k, v| deep_contains_deferred?(k) || deep_contains_deferred?(v) }
77+
when Array
78+
obj.any? { |v| deep_contains_deferred?(v) }
79+
when Puppet::Pops::Types::PSensitiveType::Sensitive
80+
begin
81+
deep_contains_deferred?(obj.unwrap)
82+
rescue
83+
false
84+
end
85+
else
86+
false
87+
end
88+
end
89+
90+
# Resolve any lingering Deferred values in the `properties` parameter
91+
def resolve_properties_deferreds!
92+
props_param = resource.parameters[:properties]
93+
return unless props_param
94+
95+
props_val = props_param.value
96+
return unless deep_contains_deferred?(props_val)
97+
98+
# Prefer compiler-based resolution when available
99+
compiler = Puppet.lookup(:compiler) { nil }
100+
if compiler
101+
resolved = Puppet::Pops::Evaluator::DeferredResolver.resolve(props_val, compiler)
102+
resource[:properties] = resolved
103+
return
104+
end
105+
106+
# Fallback: resolve across the whole catalog in place (official API)
107+
facts = Puppet::Node::Facts.new(
108+
(resource.catalog.respond_to?(:host) && resource.catalog.host) ||
109+
Facter.value(:fqdn) || Facter.value(:hostname) || 'localhost',
110+
Facter.to_hash,
111+
)
112+
env = resource.catalog.respond_to?(:environment_instance) ? resource.catalog.environment_instance : nil
113+
114+
Puppet::Pops::Evaluator::DeferredResolver.resolve_and_replace(facts, resource.catalog, env, true)
115+
116+
# Refresh our local value after in-place resolution
117+
updated = resource.parameters[:properties]
118+
resource[:properties] = updated.value if updated
119+
rescue => e
120+
raise Puppet::Error, "DSC_lite: failed to resolve Deferred values in `properties`: #{e.class}: #{e.message}"
121+
end
122+
68123
def exists?
69124
timeout = set_timeout
70125
Puppet.debug "Dsc Timeout: #{timeout} milliseconds"
71126
version = Facter.value(:powershell_version)
72127
Puppet.debug "PowerShell Version: #{version}"
128+
129+
# NEW: resolve any lingering DeferredValue in properties
130+
resolve_properties_deferreds!
131+
73132
script_content = ps_script_content('test')
74133
Puppet.debug "\n" + self.class.redact_content(script_content)
75134

@@ -97,6 +156,10 @@ def exists?
97156
def create
98157
timeout = set_timeout
99158
Puppet.debug "Dsc Timeout: #{timeout} milliseconds"
159+
160+
# NEW: resolve any lingering DeferredValue in properties
161+
resolve_properties_deferreds!
162+
100163
script_content = ps_script_content('set')
101164
Puppet.debug "\n" + self.class.redact_content(script_content)
102165

0 commit comments

Comments
 (0)