Skip to content

Commit b52b29e

Browse files
committed
Fix not parsing expressions for Group resources
1 parent de15a96 commit b52b29e

File tree

3 files changed

+73
-8
lines changed

3 files changed

+73
-8
lines changed

dsc/tests/dsc_expressions.tests.ps1

Lines changed: 28 additions & 0 deletions
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

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,19 @@ impl Configurator {
248248
for resource in resources {
249249
progress.set_resource(&resource.name, &resource.resource_type);
250250
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 {
251+
let discovery = &self.discovery.clone();
252+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
253253
return Err(DscError::ResourceNotFound(resource.resource_type));
254254
};
255+
let properties = match &dsc_resource.kind {
256+
Kind::Group => {
257+
// if Group resource, we leave it to the resource to handle expressions
258+
resource.properties.clone()
259+
},
260+
_ => {
261+
self.invoke_property_expressions(resource.properties.as_ref())?
262+
},
263+
};
255264
debug!("resource_type {}", &resource.resource_type);
256265
let filter = add_metadata(&dsc_resource.kind, properties)?;
257266
trace!("filter: {filter}");
@@ -325,10 +334,19 @@ impl Configurator {
325334
for resource in resources {
326335
progress.set_resource(&resource.name, &resource.resource_type);
327336
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 {
337+
let discovery = &self.discovery.clone();
338+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
330339
return Err(DscError::ResourceNotFound(resource.resource_type));
331340
};
341+
let properties = match &dsc_resource.kind {
342+
Kind::Group => {
343+
// if Group resource, we leave it to the resource to handle expressions
344+
resource.properties.clone()
345+
},
346+
_ => {
347+
self.invoke_property_expressions(resource.properties.as_ref())?
348+
},
349+
};
332350
debug!("resource_type {}", &resource.resource_type);
333351

334352
// see if the properties contains `_exist` and is false
@@ -469,10 +487,19 @@ impl Configurator {
469487
for resource in resources {
470488
progress.set_resource(&resource.name, &resource.resource_type);
471489
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 {
490+
let discovery = &self.discovery.clone();
491+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
474492
return Err(DscError::ResourceNotFound(resource.resource_type));
475493
};
494+
let properties = match &dsc_resource.kind {
495+
Kind::Group => {
496+
// if Group resource, we leave it to the resource to handle expressions
497+
resource.properties.clone()
498+
},
499+
_ => {
500+
self.invoke_property_expressions(resource.properties.as_ref())?
501+
},
502+
};
476503
debug!("resource_type {}", &resource.resource_type);
477504
let expected = add_metadata(&dsc_resource.kind, properties)?;
478505
trace!("{}", t!("configure.mod.expectedState", state = expected));
@@ -544,10 +571,19 @@ impl Configurator {
544571
for resource in &resources {
545572
progress.set_resource(&resource.name, &resource.resource_type);
546573
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 {
574+
let discovery = &self.discovery.clone();
575+
let Some(dsc_resource) = discovery.find_resource(&resource.resource_type) else {
549576
return Err(DscError::ResourceNotFound(resource.resource_type.clone()));
550577
};
578+
let properties = match &dsc_resource.kind {
579+
Kind::Group => {
580+
// if Group resource, we leave it to the resource to handle expressions
581+
resource.properties.clone()
582+
},
583+
_ => {
584+
self.invoke_property_expressions(resource.properties.as_ref())?
585+
},
586+
};
551587
let input = add_metadata(&dsc_resource.kind, properties)?;
552588
trace!("{}", t!("configure.mod.exportInput", input = input));
553589
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

Lines changed: 1 addition & 0 deletions
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)