Skip to content

Commit c049293

Browse files
author
Steve Lee (POWERSHELL HE/HIM) (from Dev Box)
committed
fix to return error if specified adapter isn't found
1 parent 2f885b8 commit c049293

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

dsc/tests/dsc_adapter.tests.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ Describe 'Tests for adapter support' {
9494
`$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
9595
resources:
9696
- name: Test
97-
type: Microsoft.DSC.Debug/Echo
97+
type: Test/Invalid
9898
properties:
9999
output: '1'
100100
metadata:
@@ -104,7 +104,7 @@ Describe 'Tests for adapter support' {
104104
$out = dsc config get -i $config_yaml 2>$TestDrive/error.log
105105
$LASTEXITCODE | Should -Be 2 -Because (Get-Content $TestDrive/error.log | Out-String)
106106
$errorContent = Get-Content $TestDrive/error.log -Raw
107-
$errorContent | Should -Match "Adapter resource 'InvalidAdapter/Invalid' not found" -Because $errorContent
107+
$errorContent | Should -Match "Adapter not found: InvalidAdapter/Invalid" -Because $errorContent
108108
$out | Should -BeNullOrEmpty -Because $errorContent
109109
}
110110
}

lib/dsc-lib/locales/en-us.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ skippingOutput = "Skipping output for '%{name}' due to condition evaluating to f
8484
secureOutputSkipped = "Secure output '%{name}' is skipped"
8585
outputTypeNotMatch = "Output '%{name}' type does not match expected type '%{expected_type}'"
8686
copyNotSupported = "Copy for output '%{name}' is currently not supported"
87-
requireAdapter = "Resource '%{resource}' requires adapter '%{adapter}'"
8887

8988
[configure.parameters]
9089
importingParametersFromComplexInput = "Importing parameters from complex input"

lib/dsc-lib/src/configure/mod.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -282,17 +282,6 @@ fn get_metadata_from_result(mut context: Option<&mut Context>, result: &mut Valu
282282
Ok(())
283283
}
284284

285-
fn get_require_adapter_from_metadata(resource_metadata: &Option<Metadata>) -> Option<String> {
286-
if let Some(resource_metadata) = resource_metadata {
287-
if let Some(microsoft_metadata) = &resource_metadata.microsoft {
288-
if let Some(require_adapter) = &microsoft_metadata.require_adapter {
289-
return Some(require_adapter.clone());
290-
}
291-
}
292-
}
293-
None
294-
}
295-
296285
impl Configurator {
297286
/// Create a new `Configurator` instance.
298287
///
@@ -351,6 +340,20 @@ impl Configurator {
351340
}
352341
}
353342

343+
fn get_require_adapter_from_metadata(&mut self, resource_metadata: &Option<Metadata>) -> Result<Option<String>, DscError> {
344+
if let Some(resource_metadata) = resource_metadata {
345+
if let Some(microsoft_metadata) = &resource_metadata.microsoft {
346+
if let Some(require_adapter) = &microsoft_metadata.require_adapter {
347+
if self.discovery.find_adapter(require_adapter).is_none() {
348+
return Err(DscError::AdapterNotFound(require_adapter.clone()));
349+
}
350+
return Ok(Some(require_adapter.clone()));
351+
}
352+
}
353+
}
354+
Ok(None)
355+
}
356+
354357
/// Invoke the get operation on a resource.
355358
///
356359
/// # Returns
@@ -374,7 +377,7 @@ impl Configurator {
374377
progress.write_increment(1);
375378
continue;
376379
}
377-
let adapter = get_require_adapter_from_metadata(&resource.metadata);
380+
let adapter = self.get_require_adapter_from_metadata(&resource.metadata)?;
378381
let Some(dsc_resource) = discovery.find_resource(&DiscoveryFilter::new(&resource.resource_type, resource.api_version.as_deref(), adapter.as_deref())) else {
379382
return Err(DscError::ResourceNotFound(resource.resource_type, resource.api_version.as_deref().unwrap_or("").to_string()));
380383
};
@@ -459,7 +462,7 @@ impl Configurator {
459462
progress.write_increment(1);
460463
continue;
461464
}
462-
let adapter = get_require_adapter_from_metadata(&resource.metadata);
465+
let adapter = self.get_require_adapter_from_metadata(&resource.metadata)?;
463466
let Some(dsc_resource) = discovery.find_resource(&DiscoveryFilter::new(&resource.resource_type, resource.api_version.as_deref(), adapter.as_deref())) else {
464467
return Err(DscError::ResourceNotFound(resource.resource_type, resource.api_version.as_deref().unwrap_or("").to_string()));
465468
};
@@ -628,7 +631,7 @@ impl Configurator {
628631
progress.write_increment(1);
629632
continue;
630633
}
631-
let adapter = get_require_adapter_from_metadata(&resource.metadata);
634+
let adapter = self.get_require_adapter_from_metadata(&resource.metadata)?;
632635
let Some(dsc_resource) = discovery.find_resource(&DiscoveryFilter::new(&resource.resource_type, resource.api_version.as_deref(), adapter.as_deref())) else {
633636
return Err(DscError::ResourceNotFound(resource.resource_type, resource.api_version.as_deref().unwrap_or("").to_string()));
634637
};
@@ -712,7 +715,7 @@ impl Configurator {
712715
progress.write_increment(1);
713716
continue;
714717
}
715-
let adapter = get_require_adapter_from_metadata(&resource.metadata);
718+
let adapter = self.get_require_adapter_from_metadata(&resource.metadata)?;
716719
let Some(dsc_resource) = discovery.find_resource(&DiscoveryFilter::new(&resource.resource_type, resource.api_version.as_deref(), adapter.as_deref())) else {
717720
return Err(DscError::ResourceNotFound(resource.resource_type.clone(), resource.api_version.as_deref().unwrap_or("").to_string()));
718721
};
@@ -997,7 +1000,7 @@ impl Configurator {
9971000
let mut discovery_filter: Vec<DiscoveryFilter> = Vec::new();
9981001
let config_copy = config.clone();
9991002
for resource in config_copy.resources {
1000-
let adapter = get_require_adapter_from_metadata(&resource.metadata);
1003+
let adapter = self.get_require_adapter_from_metadata(&resource.metadata)?;
10011004
let filter = DiscoveryFilter::new(&resource.resource_type, resource.api_version.as_deref(), adapter.as_deref());
10021005
if !discovery_filter.contains(&filter) {
10031006
discovery_filter.push(filter);

lib/dsc-lib/src/discovery/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod command_discovery;
55
pub mod discovery_trait;
66

77
use crate::discovery::discovery_trait::{DiscoveryKind, ResourceDiscovery, DiscoveryFilter};
8+
use crate::dscresources::resource_manifest::Kind;
89
use crate::extensions::dscextension::{Capability, DscExtension};
910
use crate::{dscresources::dscresource::DscResource, progress::ProgressFormat};
1011
use core::result::Result::Ok;
@@ -86,6 +87,18 @@ impl Discovery {
8687
.collect()
8788
}
8889

90+
pub fn find_adapter(&mut self, adapter: &str) -> Option<&DscResource> {
91+
if self.resources.is_empty() {
92+
self.find_resources(&[DiscoveryFilter::new(adapter, None, None)], ProgressFormat::None);
93+
}
94+
for resource in &self.resources {
95+
if resource.0.eq_ignore_ascii_case(adapter) && resource.1.first().unwrap().kind == Kind::Adapter {
96+
return resource.1.first();
97+
}
98+
}
99+
None
100+
}
101+
89102
#[must_use]
90103
pub fn find_resource(&mut self, filter: &DiscoveryFilter) -> Option<&DscResource> {
91104
if self.resources.is_empty() {

0 commit comments

Comments
 (0)