Skip to content

Commit d59e63a

Browse files
authored
Merge pull request #695 from SteveL-MSFT/group-expression
Fix not parsing expressions for Group resources
2 parents de15a96 + f3d2a5a commit d59e63a

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

dsc/tests/dsc_expressions.tests.ps1

+28
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,32 @@ string.
7979
"@.Replace("`r", "")
8080
$out.results[1].result.actualState.output | Should -BeExactly "This is a single-quote: '"
8181
}
82+
83+
It 'Nested Group resource does not invoke expressions' {
84+
$yaml = @'
85+
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
86+
resources:
87+
- name: Nested Group
88+
type: Microsoft.DSC/Group
89+
properties:
90+
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
91+
resources:
92+
- name: Deeply nested OSInfo
93+
type: Microsoft/OSInfo
94+
properties: {}
95+
- name: Deeply nested echo
96+
type: Microsoft.DSC.Debug/Echo
97+
properties:
98+
output: >-
99+
[reference(
100+
resourceId('Microsoft/OSInfo', 'Deeply nested OSInfo')
101+
)]
102+
dependsOn:
103+
- "[resourceId('Microsoft/OSInfo', 'Deeply nested OSInfo')]"
104+
'@
105+
106+
$out = dsc config get -i $yaml | ConvertFrom-Json
107+
$LASTEXITCODE | Should -Be 0
108+
$out.results[0].result[1].result.actualState.output.family | Should -BeExactly $out.results[0].result[0].result.actualState.family
109+
}
82110
}

dsc_lib/src/configure/mod.rs

+24-8
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,18 @@ impl Configurator {
232232
&self.config
233233
}
234234

235+
fn get_properties(&mut self, resource: &Resource, resource_kind: &Kind) -> Result<Option<Map<String, Value>>, DscError> {
236+
match resource_kind {
237+
Kind::Group => {
238+
// if Group resource, we leave it to the resource to handle expressions
239+
Ok(resource.properties.clone())
240+
},
241+
_ => {
242+
Ok(self.invoke_property_expressions(resource.properties.as_ref())?)
243+
},
244+
}
245+
}
246+
235247
/// Invoke the get operation on a resource.
236248
///
237249
/// # Returns
@@ -245,13 +257,14 @@ impl Configurator {
245257
let mut result = ConfigurationGetResult::new();
246258
let resources = get_resource_invocation_order(&self.config, &mut self.statement_parser, &self.context)?;
247259
let mut progress = ProgressBar::new(resources.len() as u64, self.progress_format)?;
260+
let discovery = &self.discovery.clone();
248261
for resource in resources {
249262
progress.set_resource(&resource.name, &resource.resource_type);
250263
progress.write_activity(format!("Get '{}'", resource.name).as_str());
251-
let properties = self.invoke_property_expressions(resource.properties.as_ref())?;
252-
let Some(dsc_resource) = self.discovery.find_resource(&resource.resource_type) else {
264+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
253265
return Err(DscError::ResourceNotFound(resource.resource_type));
254266
};
267+
let properties = self.get_properties(&resource, &dsc_resource.kind)?;
255268
debug!("resource_type {}", &resource.resource_type);
256269
let filter = add_metadata(&dsc_resource.kind, properties)?;
257270
trace!("filter: {filter}");
@@ -322,13 +335,14 @@ impl Configurator {
322335
let mut result = ConfigurationSetResult::new();
323336
let resources = get_resource_invocation_order(&self.config, &mut self.statement_parser, &self.context)?;
324337
let mut progress = ProgressBar::new(resources.len() as u64, self.progress_format)?;
338+
let discovery = &self.discovery.clone();
325339
for resource in resources {
326340
progress.set_resource(&resource.name, &resource.resource_type);
327341
progress.write_activity(format!("Set '{}'", resource.name).as_str());
328-
let properties = self.invoke_property_expressions(resource.properties.as_ref())?;
329-
let Some(dsc_resource) = self.discovery.find_resource(&resource.resource_type) else {
342+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
330343
return Err(DscError::ResourceNotFound(resource.resource_type));
331344
};
345+
let properties = self.get_properties(&resource, &dsc_resource.kind)?;
332346
debug!("resource_type {}", &resource.resource_type);
333347

334348
// see if the properties contains `_exist` and is false
@@ -466,13 +480,14 @@ impl Configurator {
466480
let mut result = ConfigurationTestResult::new();
467481
let resources = get_resource_invocation_order(&self.config, &mut self.statement_parser, &self.context)?;
468482
let mut progress = ProgressBar::new(resources.len() as u64, self.progress_format)?;
483+
let discovery = &self.discovery.clone();
469484
for resource in resources {
470485
progress.set_resource(&resource.name, &resource.resource_type);
471486
progress.write_activity(format!("Test '{}'", resource.name).as_str());
472-
let properties = self.invoke_property_expressions(resource.properties.as_ref())?;
473-
let Some(dsc_resource) = self.discovery.find_resource(&resource.resource_type) else {
487+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
474488
return Err(DscError::ResourceNotFound(resource.resource_type));
475489
};
490+
let properties = self.get_properties(&resource, &dsc_resource.kind)?;
476491
debug!("resource_type {}", &resource.resource_type);
477492
let expected = add_metadata(&dsc_resource.kind, properties)?;
478493
trace!("{}", t!("configure.mod.expectedState", state = expected));
@@ -541,13 +556,14 @@ impl Configurator {
541556

542557
let mut progress = ProgressBar::new(self.config.resources.len() as u64, self.progress_format)?;
543558
let resources = self.config.resources.clone();
559+
let discovery = &self.discovery.clone();
544560
for resource in &resources {
545561
progress.set_resource(&resource.name, &resource.resource_type);
546562
progress.write_activity(format!("Export '{}'", resource.name).as_str());
547-
let properties = self.invoke_property_expressions(resource.properties.as_ref())?;
548-
let Some(dsc_resource) = self.discovery.find_resource(&resource.resource_type) else {
563+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
549564
return Err(DscError::ResourceNotFound(resource.resource_type.clone()));
550565
};
566+
let properties = self.get_properties(resource, &dsc_resource.kind)?;
551567
let input = add_metadata(&dsc_resource.kind, properties)?;
552568
trace!("{}", t!("configure.mod.exportInput", input = input));
553569
let export_result = match add_resource_export_results_to_configuration(dsc_resource, Some(dsc_resource), &mut conf, input.as_str()) {

dsc_lib/src/discovery/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{dscresources::dscresource::DscResource, dscerror::DscError, progress
99
use std::collections::BTreeMap;
1010
use tracing::error;
1111

12+
#[derive(Clone)]
1213
pub struct Discovery {
1314
pub resources: BTreeMap<String, DscResource>,
1415
}

0 commit comments

Comments
 (0)