@@ -148,10 +148,10 @@ impl ResourceDiscovery for CommandDiscovery {
148
148
let manifest = import_manifest ( manifest. clone ( ) ) ?;
149
149
if manifest. kind == Some ( Kind :: Adapter ) {
150
150
trace ! ( "Resource adapter {} found" , resource. type_name) ;
151
- insert_resource ( & mut adapters, & resource) ;
151
+ insert_resource ( & mut adapters, & resource, true ) ;
152
152
} else {
153
153
trace ! ( "Resource {} found" , resource. type_name) ;
154
- insert_resource ( & mut resources, & resource) ;
154
+ insert_resource ( & mut resources, & resource, true ) ;
155
155
}
156
156
}
157
157
}
@@ -253,7 +253,9 @@ impl ResourceDiscovery for CommandDiscovery {
253
253
}
254
254
255
255
if name_regex. is_match ( & resource. type_name ) {
256
- insert_resource ( & mut adapted_resources, & resource) ;
256
+ // we allow duplicate versions since it can come from different adapters
257
+ // like PowerShell vs WindowsPowerShell
258
+ insert_resource ( & mut adapted_resources, & resource, false ) ;
257
259
adapter_resources_count += 1 ;
258
260
}
259
261
} ,
@@ -300,6 +302,7 @@ impl ResourceDiscovery for CommandDiscovery {
300
302
let mut remaining_required_resource_types = required_resource_types. to_owned ( ) ;
301
303
302
304
for ( resource_name, resources) in & self . resources {
305
+ // TODO: handle version requirements
303
306
let Some ( resource ) = resources. first ( ) else {
304
307
// skip if no resources
305
308
continue ;
@@ -318,29 +321,52 @@ impl ResourceDiscovery for CommandDiscovery {
318
321
}
319
322
debug ! ( "Found {} matching non-adapter-based resources" , found_resources. len( ) ) ;
320
323
321
- // now go through the adapter resources and add them to the list of resources
322
- for ( adapted_name, adapted_resource) in & self . adapted_resources {
323
- let Some ( adapted_resource) = adapted_resource. first ( ) else {
324
- // skip if no resources
324
+ // now go through the adapters
325
+ for ( adapter_name, adapters) in self . adapters . clone ( ) {
326
+ // TODO: handle version requirements
327
+ let Some ( adapter) = adapters. first ( ) else {
328
+ // skip if no adapters
325
329
continue ;
326
330
} ;
327
331
328
- if remaining_required_resource_types. contains ( & adapted_name . to_lowercase ( ) )
332
+ if remaining_required_resource_types. contains ( & adapter_name . to_lowercase ( ) )
329
333
{
330
- remaining_required_resource_types. retain ( |x| * x != adapted_name. to_lowercase ( ) ) ;
331
- found_resources. insert ( adapted_name. to_lowercase ( ) , adapted_resource. clone ( ) ) ;
334
+ // if an adapter is required, we need to find the resources it adapts
335
+ self . discover_adapted_resources ( "*" , & adapter_name) ?;
336
+
337
+ // remove the adapter from the list of required resources
338
+ remaining_required_resource_types. retain ( |x| * x != adapter_name. to_lowercase ( ) ) ;
339
+ found_resources. insert ( adapter_name. to_lowercase ( ) , adapter. clone ( ) ) ;
332
340
if remaining_required_resource_types. is_empty ( )
333
341
{
334
342
return Ok ( found_resources) ;
335
343
}
344
+
345
+ // now go through the adapter resources and add them to the list of resources
346
+ for ( adapted_name, adapted_resource) in & self . adapted_resources {
347
+ let Some ( adapted_resource) = adapted_resource. first ( ) else {
348
+ // skip if no resources
349
+ continue ;
350
+ } ;
351
+
352
+ if remaining_required_resource_types. contains ( & adapted_name. to_lowercase ( ) )
353
+ {
354
+ remaining_required_resource_types. retain ( |x| * x != adapted_name. to_lowercase ( ) ) ;
355
+ found_resources. insert ( adapted_name. to_lowercase ( ) , adapted_resource. clone ( ) ) ;
356
+ if remaining_required_resource_types. is_empty ( )
357
+ {
358
+ return Ok ( found_resources) ;
359
+ }
360
+ }
361
+ }
336
362
}
337
363
}
338
364
Ok ( found_resources)
339
365
}
340
366
}
341
367
342
368
// helper to insert a resource into a vector of resources in order of newest to oldest
343
- fn insert_resource ( resources : & mut BTreeMap < String , Vec < DscResource > > , resource : & DscResource ) {
369
+ fn insert_resource ( resources : & mut BTreeMap < String , Vec < DscResource > > , resource : & DscResource , skip_duplicate_version : bool ) {
344
370
if resources. contains_key ( & resource. type_name ) {
345
371
let Some ( resource_versions) = resources. get_mut ( & resource. type_name ) else {
346
372
resources. insert ( resource. type_name . clone ( ) , vec ! [ resource. clone( ) ] ) ;
@@ -365,8 +391,8 @@ fn insert_resource(resources: &mut BTreeMap<String, Vec<DscResource>>, resource:
365
391
continue ;
366
392
} ,
367
393
} ;
368
- // if the version already exists, we skip
369
- if resource_instance_version == resource_version {
394
+ // if the version already exists, we might skip it
395
+ if !skip_duplicate_version && resource_instance_version == resource_version {
370
396
return ;
371
397
}
372
398
0 commit comments