MCPcopy Create free account
hub / github.com/PowerShell/DSC / find_resources

Method find_resources

lib/dsc-lib/src/discovery/command_discovery.rs:482–539  ·  view source on GitHub ↗
(&mut self, required_resource_types: &[DiscoveryFilter])

Source from the content-addressed store, hash-verified

480 }
481
482 fn find_resources(&mut self, required_resource_types: &[DiscoveryFilter]) -> Result<DiscoveryResourceCache, DscError> {
483 debug!("{}", t!("discovery.commandDiscovery.searchingForResources", resources = required_resource_types : {:?}));
484 if self.discovery_mode == ResourceDiscoveryMode::DuringDeployment || locked_is_empty!(RESOURCES) {
485 self.discover(&DiscoveryKind::Resource, &TypeNameFilter::default())?;
486 }
487 let mut found_resources = DiscoveryResourceCache::new();
488 let mut required_resources = HashMap::<DiscoveryFilter, bool>::new();
489 for filter in required_resource_types {
490 required_resources.insert(filter.clone(), false);
491 }
492
493 for filter in required_resource_types {
494 if let Some(resources) = locked_get!(RESOURCES, filter.resource_type()) {
495 filter_resources(&mut found_resources, &mut required_resources, &resources, filter);
496 }
497 if required_resources.values().all(|&v| v) {
498 break;
499 }
500 }
501 debug!("{}", t!("discovery.commandDiscovery.foundNonAdapterResources", count = found_resources.len()));
502
503 if required_resources.values().all(|&v| v) {
504 return Ok(found_resources);
505 }
506
507 // store the keys of the ADAPTERS into a vec
508 let mut adapters: Vec<FullyQualifiedTypeName> = locked_clone!(ADAPTERS).keys().cloned().collect();
509 // sort the adapters by ones specified in the required resources first
510
511 for filter in required_resource_types {
512 if let Some(required_adapter) = filter.require_adapter() {
513 if !adapters.contains(required_adapter) {
514 return Err(DscError::AdapterNotFound(required_adapter.to_string()));
515 }
516 // otherwise insert at the front of the list
517 adapters.retain(|a| a != required_adapter);
518 adapters.insert(0, required_adapter.clone());
519 }
520 }
521
522 for adapter_name in &adapters {
523 self.discover_adapted_resources(&TypeNameFilter::default(), &adapter_name.clone().into())?;
524 add_resources_to_lookup_table(&locked_clone!(ADAPTED_RESOURCES));
525 for filter in required_resource_types {
526 if let Some(adapted_resources) = locked_get!(ADAPTED_RESOURCES, filter.resource_type()) {
527 filter_resources(&mut found_resources, &mut required_resources, &adapted_resources, filter);
528 }
529 if required_resources.values().all(|&v| v) {
530 break;
531 }
532 }
533 if required_resources.values().all(|&v| v) {
534 break;
535 }
536 }
537
538 Ok(found_resources)
539 }

Callers

nothing calls this directly

Calls 9

filter_resourcesFunction · 0.85
valuesMethod · 0.80
require_adapterMethod · 0.80
defaultFunction · 0.50
newFunction · 0.50
discoverMethod · 0.45
allMethod · 0.45

Tested by

no test coverage detected