22
33require 'pathname'
44require 'json'
5- require 'erb' # ensure ERB is available
6- require 'puppet'
7- require 'puppet/node'
8- require 'puppet/parser/script_compiler'
9- require 'puppet/pops/evaluator/deferred_resolver'
105require_relative '../../../puppet_x/puppetlabs/dsc_lite/powershell_hash_formatter'
116
127Puppet ::Type . type ( :base_dsc_lite ) . provide ( :powershell ) do
3631 Puppet (including 3.x), or to a Puppet version newer than 3.x.
3732 UPGRADE
3833
39- # ---------------------------
40- # Class helpers
41- # ---------------------------
42-
4334 def self . upgrade_message
4435 Puppet . warning DSC_LITE_MODULE_PUPPET_UPGRADE_MSG unless @upgrade_warning_issued
4536 @upgrade_warning_issued = true
@@ -157,92 +148,6 @@ def contains_deferred_values?(value)
157148 end
158149 end
159150
160- # ---------------------------
161- # Legacy deferred resolution methods (keeping for reference but not using)
162- # ---------------------------
163-
164- # 1) Catalog-wide resolve: replace all Deferreds/futures in the catalog
165- def force_resolve_catalog_deferred!
166- cat = resource &.catalog
167- return unless cat
168-
169- facts = Puppet . lookup ( :facts ) { nil }
170- env = if cat . respond_to? ( :environment_instance )
171- cat . environment_instance
172- else
173- Puppet . lookup ( :current_environment ) { nil }
174- end
175-
176- begin
177- Puppet ::Pops ::Evaluator ::DeferredResolver . resolve_and_replace ( facts , cat , env , true )
178- Puppet . notice ( 'DSC PROVIDER SENTINEL → resolve_and_replace invoked' )
179- rescue => e
180- Puppet . notice ( "DSC PROVIDER resolve_and_replace error: #{ e . class } : #{ e . message } " )
181- end
182- end
183-
184- # Build a compiler on the agent for local resolution
185- def build_agent_compiler ( env )
186- node_name = Puppet [ :node_name_value ]
187- node = Puppet ::Node . new ( node_name , environment : env )
188-
189- # Attaching facts improves function behavior during resolve (best-effort)
190- begin
191- facts = Puppet . lookup ( :facts ) { nil }
192- node . add_facts ( facts ) if facts
193- rescue => e
194- Puppet . debug ( "DSC_lite: could not attach facts to node for local resolve: #{ e . class } : #{ e . message } " )
195- end
196-
197- if defined? ( Puppet ::Parser ::ScriptCompiler )
198- Puppet ::Parser ::ScriptCompiler . new ( node , env )
199- else
200- Puppet ::Parser ::Compiler . new ( node )
201- end
202- end
203-
204- # 2) Targeted resolve: explicitly resolve the :properties value using a resolver that
205- # handles both Deferred and evaluator futures, then write it back to the resource.
206- def force_resolve_properties!
207- return unless resource . parameters . key? ( :properties )
208-
209- cat = resource &.catalog
210- env = if cat &.respond_to? ( :environment_instance )
211- cat . environment_instance
212- else
213- Puppet . lookup ( :current_environment ) { nil }
214- end
215-
216- begin
217- compiler = build_agent_compiler ( env ) if env
218- return unless compiler # without a compiler, local resolve can't proceed
219-
220- facts = Puppet . lookup ( :facts ) { nil }
221-
222- resolver = Puppet ::Pops ::Evaluator ::DeferredResolver . new ( compiler , true )
223- resolver . set_facts_variable ( facts ) if facts
224-
225- # Read current value, resolve deeply, then write back into the parameter
226- current = resource . parameters [ :properties ] . value
227- resolved = resolver . resolve ( current )
228- resource . parameters [ :properties ] . value = resolved
229-
230- # Post-check: what class is properties['Contents'] now?
231- cls = if resolved . is_a? ( Hash ) && resolved . key? ( 'Contents' )
232- resolved [ 'Contents' ] . class
233- else
234- resolved . class
235- end
236- Puppet . notice ( "DSC PROVIDER SENTINEL → post-resolve properties.Contents: #{ cls } " )
237- rescue => e
238- Puppet . debug ( "DSC_lite: explicit properties resolve failed: #{ e . class } : #{ e . message } " )
239- end
240- end
241-
242- # ---------------------------
243- # Existing provider helpers
244- # ---------------------------
245-
246151 def dsc_parameters
247152 resource . parameters_with_value . select do |p |
248153 p . name . to_s . include? 'dsc_'
@@ -269,13 +174,7 @@ def format_for_ps(value)
269174 self . class . format_dsc_lite ( value )
270175 end
271176
272- # ---------------------------
273- # Provider operations
274- # ---------------------------
275-
276177 def exists?
277- Puppet . notice ( "DSC PROVIDER SENTINEL → #{ __FILE__ } " )
278-
279178 # Resolve deferred values right before we start processing
280179 resolve_deferred_values!
281180
@@ -308,8 +207,6 @@ def exists?
308207 end
309208
310209 def create
311- Puppet . notice ( "DSC PROVIDER SENTINEL → #{ __FILE__ } " )
312-
313210 # Resolve deferred values right before we start processing
314211 resolve_deferred_values!
315212
0 commit comments