Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions dsc/tests/dsc_config_version.tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,26 @@ Describe 'Tests for resource versioning' {
$LASTEXITCODE | Should -Be 0 -Because (Get-Content $TestDrive/error.log -Raw)
$out.results[0].result.actualState.version | Should -BeExactly '1.1.2'
}

It 'Skips adapter discovery when a native resource type version requirement cannot be satisfied' {
$config_yaml = @"
`$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
resources:
- name: Test Version
type: Test/Version
requireVersion: '=99.0.0'
properties:
version: '99.0.0'
"@
$out = dsc -l trace config get -i $config_yaml 2> $TestDrive/error.log
$LASTEXITCODE | Should -Not -Be 0

$traces = Get-Content $TestDrive/error.log -Raw

$traces | Should -Match "Skipping adapter search for resource 'Test/Version'"
$traces | Should -Not -Match 'Searching for adapted resources'
$traces | Should -Not -Match 'Enumerating resources for adapter'
$traces | Should -Match "Test/Version"
$traces | Should -Match "=99.0.0"
}
}
1 change: 1 addition & 0 deletions lib/dsc-lib/locales/en-us.toml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ importExtensionsEmpty = "Import extension '%{extension}' has no import extension
searchingForResources = "Searching for resources: %{resources}"
foundResourceWithVersion = "Found matching resource '%{resource}' version %{version}"
foundNonAdapterResources = "Found %{count} non-adapter resources"
skipAdapterSearchForNativeType = "Skipping adapter search for resource '%{resource}': type is registered as a native command-based resource; version requirement does not match any installed version"
Comment thread
Gijsreyn marked this conversation as resolved.
Outdated
resourceMissingRequireAdapter = "Resource '%{resource}' is missing 'require_adapter' field."
extensionDiscoverFailed = "Extension '%{extension}' failed to discover resources: %{error}"
conditionNotBoolean = "Condition '%{condition}' did not evaluate to a boolean"
Expand Down
36 changes: 34 additions & 2 deletions lib/dsc-lib/src/discovery/command_discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -504,11 +504,43 @@ impl ResourceDiscovery for CommandDiscovery {
return Ok(found_resources);
}

// Determine which still-unsatisfied filters actually require adapter discovery.
//
// If a filter's resource type is already known to native discovery (present in
// RESOURCES or ADAPTERS) and the user did not pin an adapter via `requireAdapter`,
// then any unsatisfied state is necessarily a version-requirement mismatch
let adapter_filter_candidates: Vec<&DiscoveryFilter> = required_resource_types
.iter()
.filter(|filter| {
if required_resources.get(*filter).copied().unwrap_or(false) {
return false;
}
if filter.require_adapter().is_some() {
return true;
}
let type_known_natively = locked_get!(RESOURCES, filter.resource_type()).is_some()
|| locked_get!(ADAPTERS, filter.resource_type()).is_some();
if type_known_natively {
debug!(
"{}",
t!("discovery.commandDiscovery.skipAdapterSearchForNativeType",
resource = filter.resource_type())
);
return false;
}
true
})
.collect();

if adapter_filter_candidates.is_empty() {
return Ok(found_resources);
}
Comment thread
Gijsreyn marked this conversation as resolved.

// store the keys of the ADAPTERS into a vec
let mut adapters: Vec<FullyQualifiedTypeName> = locked_clone!(ADAPTERS).keys().cloned().collect();
// sort the adapters by ones specified in the required resources first

for filter in required_resource_types {
for filter in &adapter_filter_candidates {
if let Some(required_adapter) = filter.require_adapter() {
if !adapters.contains(required_adapter) {
return Err(DscError::AdapterNotFound(required_adapter.to_string()));
Expand All @@ -522,7 +554,7 @@ impl ResourceDiscovery for CommandDiscovery {
for adapter_name in &adapters {
self.discover_adapted_resources(&TypeNameFilter::default(), &adapter_name.clone().into())?;
add_resources_to_lookup_table(&locked_clone!(ADAPTED_RESOURCES));
for filter in required_resource_types {
for filter in &adapter_filter_candidates {
if let Some(adapted_resources) = locked_get!(ADAPTED_RESOURCES, filter.resource_type()) {
filter_resources(&mut found_resources, &mut required_resources, &adapted_resources, filter);
}
Comment thread
Gijsreyn marked this conversation as resolved.
Expand Down
Loading