(&mut self, required_resource_types: &[DiscoveryFilter])
| 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 | } |
nothing calls this directly
no test coverage detected